<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
有時候上完線,使用者還停留在老的頁面,使用者不知道網頁重新部署了,跳轉頁面的時候有時候js連線hash變了導致報錯跳不過去,並且使用者體驗不到新功能。
如何去解決這個問題 思考中...
如果後端可以配合我們的話我們可以使用webSocket
跟後端進行實時通訊,前端部署完之後,後端給個通知,前端檢測到Message
進行提示,還可以在優化一下使用EvnentSource
這個跟socket
很像只不過他只能後端往前端推播訊息,前端無法給後端傳送,我們也不需要給後端傳送。
以上方案需要後端配合,奈何公司後端都在忙,需要純前端實現。
重新進行思考...
根據和小夥伴的討論得出了一個方案,在專案根目錄給個json 檔案,寫入一個固定的key值然後打包的時候變一下,然後程式碼中輪詢
去判斷看有沒有變化,有就提示。
果然是康老師經典不知道。
但是寫完之後發現太麻煩了,需要手動設定json檔案,還需要打包的時候修改,有沒有更簡單的方案, 進行第二輪討論。
第二輪討論的方案是根據打完包之後生成的script src 的hash值去判斷,每次打包都會生成唯一的hash值,只要輪詢去判斷不一樣了,那一定是重新部署了.
interface Options { timer?: number } export class Updater { oldScript: string[] //儲存第一次值也就是script 的hash 資訊 newScript: string[] //獲取新的值 也就是新的script 的hash資訊 dispatch: Record<string, Function[]> //小型釋出訂閱通知使用者更新了 constructor(options: Options) { this.oldScript = []; this.newScript = [] this.dispatch = {} this.init() //初始化 this.timing(options?.timer)//輪詢 } async init() { const html: string = await this.getHtml() this.oldScript = this.parserScript(html) } async getHtml() { const html = await fetch('/').then(res => res.text());//讀取index html return html } parserScript(html: string) { const reg = new RegExp(/<script(?:s+[^>]*)?>(.*?)</scripts*>/ig) //script正則 return html.match(reg) as string[] //匹配script標籤 } //釋出訂閱通知 on(key: 'no-update' | 'update', fn: Function) { (this.dispatch[key] || (this.dispatch[key] = [])).push(fn) return this; } compare(oldArr: string[], newArr: string[]) { const base = oldArr.length const arr = Array.from(new Set(oldArr.concat(newArr))) //如果新舊length 一樣無更新 if (arr.length === base) { this.dispatch['no-update'].forEach(fn => { fn() }) } else { //否則通知更新 this.dispatch['update'].forEach(fn => { fn() }) } } timing(time = 10000) { //輪詢 setInterval(async () => { const newHtml = await this.getHtml() this.newScript = this.parserScript(newHtml) this.compare(this.oldScript, this.newScript) }, time) } }
程式碼用法
//範例化該類 const up = new Updater({ timer:2000 }) //未更新通知 up.on('no-update',()=>{ console.log('未更新') }) //更新通知 up.on('update',()=>{ console.log('更新了') })
執行 npm run build 打個包
安裝http-server
使用http-server 開個服務
重新打個包npm run build
這樣子就可以檢測出來有沒有重新發布就可以通知使用者更新了。
以上就是JS前端重新部署通知使用者重新整理網頁的詳細內容,更多關於JS通知使用者重新整理網頁的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45