有时候上完线,用户还停留在老的页面,用户不知道网页重新部署了,跳转页面的时候有时候js连接hash变了导致报错跳不过去,并且用户体验不到新功能。
如何去解决这个问题 思考中...
如果后端可以配合我们的话我们可以使用webSocket
跟后端进行实时通讯,前端部署完之后,后端给个通知,前端检测到Message
进行提示,还可以在优化一下使用EvnentSource
这个跟socket
很像只不过他只能后端往前端推送消息,前端无法给后端发送,我们也不需要给后端发送。
以上方案需要后端配合,奈何公司后端都在忙,需要纯前端实现。
重新进行思考...
根据和小伙伴的讨论得出了一个方案,在项目根目录给个json 文件,写入一个固定的key值然后打包的时候变一下,然后代码中轮询
去判断看有没有变化,有就提示。
但是写完之后发现太麻烦了,需要手动配置json文件,还需要打包的时候修改,有没有更简单的方案, 进行第二轮讨论。
第二轮讨论的方案是根据打完包之后生成的script src 的hash值去判断
,每次打包都会生成唯一的hash值,只要轮询去判断不一样了,那一定是重新部署了.
/**
* 前端重新部署如何通知用户刷新网页?
* 根据打完包之后生成的script src 的hash值去判断,每次打包都会生成唯一的hash值,只要轮询去判断不一样了,那一定是重新部署了.
*/
class Updater {
oldScript = []; // 存储第一次值也就是script 的hash 信息
newScript = []; // 获取新的值 也就是新的script 的hash信息
dispatch = {}; // 小型发布订阅通知用户更新了
constructor(options) {
this.oldScript = [];
this.newScript = [];
this.dispatch = {};
this.init(); // 初始化
this.timing(options?.timmer);
}
async init() {
const html = await this.getHtml();
this.oldScript = this.parserScript(html);
console.log("初始化", html, this.oldScript);
};
async getHtml() {
const html = await fetch('/').then(res => res.text());//读取index html
return html
};
parserScript(html) {
const reg = new RegExp(/