背景
微信H5开发中,遇到了问题:
- 微信H5对Index.html缓存问题,使得提测过程中、发布Release版本后,用户端看到的页面依旧是缓存的html/js/cs
- 在JavaScrip文件分包情况下,项目重新打包后,由于发布时清除了原js文件,如果html已缓存,就会出现加载不到js的错误
- 由于需求和测试需要,支付渠道需要切换,每次为了一个配置参数却需要反复提交TAG
引申问题
- 版本号如何自动生成?能否指定版本号?
- 如何获取版本号等配置?通过Service服务器API获取就会对Service侵入——接口同学要是善良尚可,要是……
思路
本着自己的问题自己解决,既然前端都是服务器在跑,那就直接提供个配置访问文件,打包时复制一份岂不快哉。但是每次提测、发布都还得手动修改版本?怎么行?通过Webpack Plugin、运行脚本自动生成吧。
前提: js等文件需要通过hash配置文件名,否则在微信缓存过期前貌似只能通过手动清理缓存处理。文件名配置参考
使用示例
Env添加版本变量
|
|
插件代码
|
|
- 此插件代码来源于下文参考文章,插件开发参考如何编写一个插件?
配置文件中引入VersionPlugin
|
|
验证版本号并处理
|
|
- 这里只对进入Index时校验版本,所以相关逻辑也可以在首页Index.vue中做处理
Shell终端执行打包
|
|
优化
如何通过编译指令指定版本号?
|
|
Shell终端执行打包
说明
- 如不配置build:2,可在终端中直接输入指令内容, 实时动态设置版本,嫌指令太长?去看看Shell终端的alais配置…
- 这样就可以通过
process.env.VERSION_ENV
获取到值v2.0- 关于cross-env可以参考使用cross-env解决跨平台设置NODE_ENV的问题,主要是解决不同系统环境指令兼容问题
- 如不使用cross-env,可通过
process.argv
获取指令参数,方式参考:
|
|
其他插件
使用webpack进行版本管理工具(webpack-plugin-auto-version)_GitHub
versiony-自动修改package.json中项目版本号
其他处理缓存方式及问题
方式一:
修改服务器nginx no-cache配置,需要运营配置(没试过…)
方式二:
Index.html中配置no-cache:
存在问题:
- IGNORE.manifest 会引起500错误,使用时存在个别机型、微信版本无效,仍使用缓存文件,还得手动刷新
- 不能解决上文提到的分包问题
方式三:
Cache Buster方式: route url添加版本号或随机数
如:/index.html?v=1#/list
存在问题:
- 在项目业务中,跳转微信或其他第三方页面后,原逻辑可能会使参数失效,返回原缓存页面,加载微信中已缓存的旧逻辑
- 还是不能解决上文提到的分包问题
- 微信公众号使用场景中,每次版本发布得在微信后台修改URL
- Vue中同一页面route跳转不会刷新缓存,参考[vue-router源码分析-整体流程](https://github.com/DDFE/DDFE-blog/issues/9)
方式四:
上文提到的,需要接口同学配合。
系统内部通过ajax请求获取版本信息从而提示更新。
存在问题:对后端系统有侵入性,属于下策。
参考文章
webpack + vue 项目 自定义 插件 解决 前端 JS 版本 更新 问题
Webpack插件开发简要
webpack 打包传参 process.env 公司一个项目多个版本的前端架构方案
webpack使用和踩过的坑