共计 1410 个字符,预计需要花费 4 分钟才能阅读完成。
背景:本人的我的项目修复了 bug;然而客户端没有刷新浏览器;导致还是有 bug 的资源代码;呈现了问题
思路:联合 Vue 部署后怎么强制客户端刷新获取最新的代码资源?外面的计划;分 3 步曲实现生产环境部署后资源刷新
1. 建设比照文件
- vue 我的项目中的
package.json
中存储以后打包资源的以后版本号 - 搁置最新的版本号 json
version.json
(以此为准);放到public
文件中搁置 webpack 进行打包编译;并且保护一个辅助字段must
代表是否必须强制刷新;以后默认 bug 级别才会强制刷新;优化和新性能不必强制刷新
2. 获取比照文件
- 在公共组件或者全局办法中;建设 10 秒一次的轮询定时器去轮询
version.json
文件;并且和本地资源的package.json
比照;我是放到了layout.vue
组件内;因为除了 login 页面;其余页面都是装在 layout 内的;所以也能够了解为全局组件。 -
获取两个版本号
- 零碎内的
- 最新的(应用 axios.get 获取;留神:设置 axios 不走缓存)
- 输入成果
3. 开始比照并且后续逻辑
- 在
layout.vue
组件的created
函数内;开启一个每 10 秒一次的轮询申请;旨在比照新老版本号是否统一并且是否须要刷新 -
如果合乎刷新要求;则开始交互刷新(用户可能在提交表单或者保留重要信息);所以给用户一个刷新的过程提醒他要刷新了
// 刷新逻辑 reloadNotifier() { let time = 20 const key = `open${Date.now()}` this.$notification.open({ message: '零碎提醒', description: ` 零碎版本有更新,请尽快保留以后信息!将在 ${time}秒后刷新浏览器!`, duration: null, icon: <a-icon type="alert" style="color: #108ee9" />, closeIcon: <span></span>, btn: h => { return h( 'a-button', { props: {type: 'primary'}, on: {click: () => window.location.reload()} }, '立刻刷新' ); }, key }) // 动静批改倒计时 this.notificationTimer = setInterval(() => { time-- if (time < 1) {window.location.reload() clearInterval(this.notificationTimer) this.$notification.close(key) } this.$notification.open({ message: '零碎提醒', description: ` 零碎版本有更新,请尽快保留以后信息!将在 ${time}秒后刷新浏览器!`, duration: null, icon: <a-icon type="alert" style="color: #108ee9" />, closeIcon: <span></span>, btn: h => { return h( 'a-button', { props: {type: 'primary'}, on: {click: () => window.location.reload()} }, '立刻刷新' ); }, key }); }, 1000) }
- 展现成果
写在最初:此计划老本绝对较小;不须要后端的配合就能够实现;当前的迭代中可拓展性也丰盛。
正文完
发表至: javascript
2022-07-13