【单页面 】发版后如何【通知用户端更新】
现象描述:html
首先技术栈,是vue全家桶技术栈。典型spa单页应用,每次有新功能的上线,都须要主动通知,使用者自主刷新页面【强刷】,才能出现新功能。
产生缘由:
每次打包发版【代码有变化】,index.html,网站即入口文件是变化的。
可是在单页面应用,页面跳转,都在同一个浏览器线程中,不会再一次请求index.html 资源,即便你对 index.html 资源不缓存策略,即设置响应头部信息为cache-control: no-store 也是很差使。用户还得必须刷新。vue
那么解决策略如何,一图胜千言:webpack
// 获取并注入版本号 未写点【这里还能够写 把版本号 和 项目 名 发送到服务器,做版本记录】 const HtmlWebpackPlugin = require('html-webpack-plugin'); module.exports = class WebpackVersionPlugin { constructor(options = { }) { this.options = Object.assign({ versionName: '$AppVersion' }, options) } apply(complier) { const { versionName } = this.options; complier.hooks.emit.tapAsync('WebpackVersionPlugin', (compilation, callback) => { const { hash } = compilation // 须要在 index.html 注入变量 【在htmlWebpackPlugin 钩子里处理 详细看官方文档】 HtmlWebpackPlugin.getHooks(compilation).beforeEmit.tapAsync( 'MyPlugin', (data, cb) => { const htmlScriptStr = `<script>window.${versionName}="${hash}"</script>` // 插入到第一个 script标签前面 data.html = data.html.replace(/(<script)/, `${htmlScriptStr}$1`) cb(null, data) } ) callback() }) } }
效果以下:web
2 为何用 location.reoload, 经过轮训hash版本比较,能够通知 用户是否 刷新页面【ui层面】,是则调用reload,不然不操做浏览器