vue项目发版,前端页面自动提示用户刷新页面

背景:由于前端发版用户不及时刷新页面就会造成你看到的页面其实是发版之前的页面,需要每次手动刷新,现在封装2个方法,当有前端代码更新,自动提示用户手动刷新

首先,根目录下创建两个js文件,比如version-update.js这是更新用的,version.js这个是将特定标识写入项目中,以此来区分项目是否更新

version代码如下:
 

// npm build version
const vueconfig = require('./vue.config.js')
const packageConfig = require('./package.json')

const VERSION_NO = packageConfig.version || ''

const dist_path = `./${vueconfig.outputDir}/homepage.html`

// 获取dist中homepage页面,并在其中写入版本号
const fs = require('fs')
const path = require('path')
const distPath = path.join(__dirname, dist_path)
let htmlContent = fs.readFileSync(distPath, 'utf8')
htmlContent = htmlContent.replace('<head>', `<head><meta name="version_no" content="${VERSION_NO}" >`)
fs.writeFileSync(distPath, htmlContent, 'utf8')

// eslint-disable-next-line no-console
console.log('[ 版本打包成功 ] >', VERSION_NO)

module.exports = VERSION_NO

version-update.js代码如下:


                
### Vue 项目布后实现浏览器自动刷新的策略 在 Vue 项目中,当新布时,浏览器可能会因为缓存机制继续加载旧本的资源文件,导致用户无法立即体验到最新的功能或修复。为了解决这一问题,可以通过以下几种方式来确保用户在新布后能够自动刷新页面并获取最新代码。 --- #### 1. **通过本号或时间戳更新静态资源** 在构建过程中,可以为每个静态资源文件添加唯一的标识符(如时间戳或本号),以避免浏览器缓存旧本文件。例如,在 `vue.config.js` 中配置文件名哈希: ```javascript module.exports = { chainWebpack: config => { config.output.filename('[name].[contenthash].js'); // 添加内容哈希 config.output.chunkFilename('[name].[contenthash].js'); // 分块文件也添加哈希 } }; ``` 这种方式确保每次构建生成的文件名都不同,从而强制浏览器加载最新的资源文件[^1]。 --- #### 2. **设置 HTTP 缓存控制策略** 通过在 HTML 文件中添加特定的 `<meta>` 标签,可以禁用浏览器对页面的缓存。例如: ```html <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" /> <meta http-equiv="Pragma" content="no-cache" /> <meta http-equiv="Expires" content="0" /> ``` 这些标签会告诉浏览器不要缓存当前页面,确保每次访问时都会重新加载最新的资源[^3]。 如果使用 VuePress 或类似的工具,也可以通过配置文件全局设置这些策略: ```javascript export default defineUserConfig({ head: [ ["meta", { "http-equiv": "Cache-Control", content: "no-cache, no-store, must-revalidate" }], ["meta", { "http-equiv": "Pragma", content: "no-cache" }], ["meta", { "http-equiv": "Expires", content: "0" }] ] }); ``` --- #### 3. **监听服务端本变化并触刷新** 可以在前端代码中实现一个简单的机制,定期检查服务端的本信息。如果本不一致,则提示用户刷新页面或直接调用 `window.location.reload()` 进行刷新。 以下是一个示例代码: ```javascript // 假设服务端提供了一个 API 返回当前本号 async function checkVersion() { const response = await fetch('/api/version'); const { version } = await response.json(); if (version !== localStorage.getItem('currentVersion')) { localStorage.setItem('currentVersion', version); window.location.reload(); // 强制刷新页面 } } // 定期检查本 setInterval(checkVersion, 60000); // 每分钟检查一次 ``` 此方法需要服务端配合提供本号接口,并且前端需要存储当前已加载的本号以便对比[^1]。 --- #### 4. **利用 Service Worker 实现智能更新** Service Worker 是一种运行在后台的脚本,可以拦截和处理网络请求,非常适合用于管理缓存和更新策略。以下是基于 Service Worker 的解决方案: - 在构建过程中生成一个 `sw.js` 文件,其中包含所有需要缓存的资源列表。 - 当检测到新本时,Service Worker 会自动安装并激活新本,同时清理旧的缓存。 - 激活完成后,可以通过广播消息通知页面刷新。 示例代码如下: ```javascript self.addEventListener('install', event => { event.waitUntil( caches.open('v1').then(cache => cache.addAll([ '/index.html', '/main.[contenthash].js' ])) ); }); self.addEventListener('activate', event => { event.waitUntil( clients.matchAll().then(clients => clients.forEach(client => client.postMessage('refresh'))) ); }); self.addEventListener('fetch', event => { event.respondWith( caches.match(event.request).then(response => response || fetch(event.request)) ); }); ``` 在主应用中监听消息并执行刷新操作: ```javascript navigator.serviceWorker.addEventListener('message', event => { if (event.data === 'refresh') { window.location.reload(); } }); ``` 这种方式不仅能够实现自动刷新,还能优化离线体验和性能[^4]。 --- #### 5. **防止内存泄漏影响更新** 需要注意的是,在某些情况下,由于内存泄漏问题(如 IE 浏览器中的循环引用[^2]),可能导致旧本资源未被正确释放,进而影响新本的加载。因此,在设计更新策略时,应确保没有长期存在的 DOM 或事件绑定,以免干扰新本的正常运行。 --- ### 总结 Vue 项目布后实现浏览器自动刷新的策略主要包括:通过本号或时间戳更新静态资源、设置 HTTP 缓存控制策略、监听服务端本变化并触刷新、利用 Service Worker 实现智能更新以及防止内存泄漏。具体选择哪种方式取决于项目的复杂度和实际需求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值