Vite版本更新檢查實現(xiàn)頁面自動刷新的解決思路
前端版本更新檢查,實現(xiàn)頁面自動刷新
使用vite
對項目進行打包,對 js 和 css 文件使用了 chunkhash 進行了文件緩存控制,但是項目的index.html
文件在版本頻繁迭代更新時,會存在被瀏覽器緩存的情況。
在發(fā)版后,如果用戶不強制刷新頁面,瀏覽器會使用舊的index.html
文件,在跳轉(zhuǎn)頁面時會向服務器端請求了上個版本 chunkhash 的 js 和 css 文件,但此時的文件已經(jīng)在版本更新時已替換刪除了,最終表現(xiàn)為頁面卡頓,控制臺報錯 404。
解決思路
思路 1
服務器端發(fā)版時,上一個版本的assets
內(nèi)的文件不刪除。
缺點是會隨著頻繁發(fā)版,服務器端前端項目文件會越來越多,浪費空間;若舊頁面的接口涉及到參數(shù)改動等,會引起報錯;流水線使用 docker 打包部署會變得非常麻煩。
思路 2
在每次打包生產(chǎn)代碼時,在public
下生成一個version.json
版本信息文件,頁面跳轉(zhuǎn)時請求服務器端的version.json
中的版本號和瀏覽器本地緩存的版本號進行對比,從而監(jiān)控版本迭代更新,實現(xiàn)頁面自動更新,獲取新的index.html
文件(前提是服務器端對index.html
進行不緩存配置)。
1.首先應該禁止瀏覽器緩存index.html
和version.json
,這里實現(xiàn)nginx
的不緩存處理
添加nginx
配置
location ~ .*\.(htm|html|json)?$ { expires -1;}
2.使用Vite 插件打包時自動生成版本信息
版本信息插件
// versionUpdatePlugin.js const fs = require('fs') const path = require('path') const writeVersion = (versionFile, content) => { // 寫入文件 fs.writeFile(versionFile, content, (err) => { if (err) throw err }) } export default (options) => { let config return { name: 'version-update', configResolved(resolvedConfig) { // 存儲最終解析的配置 config = resolvedConfig }, buildStart() { // 生成版本信息文件路徑 const file = config.publicDir + path.sep + 'version.json' // 這里使用編譯時間作為版本信息 const content = JSON.stringify({ version: options.version }) if (fs.existsSync(config.publicDir)) { writeVersion(file, content) } else { fs.mkdir(config.publicDir, (err) => { if (err) throw err writeVersion(file, content) }) } }, } }
vite 配置文件
// vite.config.js export default defineConfig((config) => { const now = new Date().getTime() return { ... define: { // 定義全局變量 __APP_VERSION__: now, }, plugins: [ ... versionUpdatePlugin({ version: now, }), ], ... } })
3.路由跳轉(zhuǎn)時,實時檢測版本
檢測到新版本自動刷新頁面,應該使用前置守衛(wèi),在跳轉(zhuǎn)失敗報錯前檢測,跳轉(zhuǎn)失敗不會觸發(fā)后置守衛(wèi)
const router = useRouter() // 這里在路由全局前置守衛(wèi)中檢查版本 router.beforeEach(async () => { await versionCheck() }) // 版本監(jiān)控 const versionCheck = async () => { if (import.meta.env === 'development') return const response = await axios.get('version.json') // eslint-disable-next-line no-undef if (__APP_VERSION__ !== response.data.version) { // eslint-disable-next-line no-undef ElMessage({ message: '發(fā)現(xiàn)新內(nèi)容,自動更新中...', type: 'success', showClose: true, duration: 1500, onClose: () => { window.location.reload() }, }) } }
總結(jié)
到此這篇關于Vite版本更新檢查實現(xiàn)頁面自動刷新的文章就介紹到這了,更多相關Vite版本更新頁面自動刷新內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Vue2.0+Vux搭建一個完整的移動webApp項目的示例
這篇文章主要介紹了Vue2.0+Vux搭建一個完整的移動webApp項目的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-03-03Vue源碼學習defineProperty響應式數(shù)據(jù)原理實現(xiàn)
這篇文章主要為大家介紹了Vue源碼學習defineProperty響應式數(shù)據(jù)原理實現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09element-ui自定義message-box自定義樣式不生效的解決
這篇文章主要介紹了element-ui自定義message-box自定義樣式不生效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09Nuxt3項目搭建過程(Nuxt3+element-plus+scss詳細步驟)
這篇文章主要介紹了Nuxt3項目搭建(Nuxt3+element-plus+scss詳細步驟),本次記錄一次使用Nuxt3搭建前端項目的過程,內(nèi)容包含Nuxt3的安裝,基于Vite腳手架(默認)構(gòu)建的vue3項目,element-plus的安裝配置,scss的安裝,目錄結(jié)構(gòu)的創(chuàng)建和解釋,需要的朋友可以參考下2022-12-12vue中實現(xiàn)點擊空白區(qū)域關閉彈窗的兩種方法
這篇文章主要介紹了vue中實現(xiàn)點擊空白區(qū)域關閉彈窗的兩種方法,幫助大家更好的理解和使用vue框架,感興趣的朋友可以了解下2020-12-12vue路由history模式頁面刷新404解決方法Koa?Express
這篇文章主要為大家介紹了vue路由history模式頁面刷新404解決方法(Koa?Express)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11