赞
踩
一、缓存带来的问题和原因
我们在发布新版本的时候,在打开微信小程序webview嵌套的h5页面或微信公众号h5页面时,常常会发现页面还是上个版本的旧页面或者打开直接空白 白屏了,那么为什么会存在这个问题呢?
原因是微信浏览器为了提高性能,自带缓存功能,缓存了html文件,比如页面 https://www.xxx.com/abc.html,虽然这个页面有改动,但是页面路径还是同一个,还是https://www.xxx.com/abc.html,缓存就会生效,还是会请求到旧的资源;也因为有时手动清除了缓存,缓存资源不存在会造成空白的现象。
如果不处理,缓存第二天或过几个小时后就自动清除,这个功能有好有坏,但缓存问题确实对发布新版本造成很大的困扰,总不能让用户手动清除缓存吧,而且清除缓存后还不一定成功有效。
二、怎么解决
在这之前我们肯定已经做了尝试,比如服务器 cache-control 强缓存协商缓存,还有加时间戳等等,发布后还是没有用。在本文中会采用修改请求路径的方式做测试。
例如下面常规的清除缓存的方式,参考我的另外一篇文章
hash路由和history路由的区别:
hash 路由:hash 就是指 url 尾巴后的 # 号以及后面的字符,监听 url 中 hash 的变化,然后渲染不同的内容,这种路由不向服务器发送请求,不需要服务端的支持;
history 路由:监听 url 中的路径变化,需要客户端和服务端共同的支持;
vue项目默认采用的就是hash路由,带#号的路由,例如https://www.xxx.com/policy/#/abc.vue,#后面无论改变什么内容都不会向服务器发送请求,也不会清除缓存。所以hash路由模式后面加版本号还是时间戳都不会有太大作用,例如https://www.xxx.com/policy/#/abc.vue?version=1.0&t=Date.now()。
另外采用history模式加版本号和时间戳重新发起请求清理缓存应该是可行的,因为url访问路径已经改变,这个我没有具体尝试,如果有效果就不需要下面的步骤了。history模式需要nginx加一些处理,要不然刷新会404。
三、具体做法
重点:既然#符号后面内容改变无效,那能不能在 #符号前面加版本号改变请求路径呢?
举例:原访问路径是 https://www.xxx.com/policy/#/abc.vue,policy是项目名称,前端项目放在服务器data/hdwork-h5目录下。
在#前面加版本号就变成:https://www.xxx.com/policy/123/#/abc.vue,123是版本号的举例,这个可以自己定,是个数字就可以,这种做法简单,只需要nginx再多加一个匹配数字的配置就可以。以下是nginx项目的配置参考,具体以自己项目定义。这里只给出了匹配/policy/\d+ 匹配数字的案例,不加数字的/policy 就是原逻辑。
这样 加版本号https://www.xxx.com/policy/{版本号}/#/abc.vue 和 不加版本号https://www.xxx.com/policy/#/abc.vue,这两种方式都是可以正常访问的
原理就是 当我们请求带版本号的请求路径https://www.xxx.com/policy/123/#/abc.vue时,会自动重写成 正常的访问路径https://www.xxx.com/policy/#/abc.vue,这样就达到了修改请求路径从而让微信浏览器以为这是一个新的路径,就不会有缓存的情况。
四、版本号怎么定
版本号只要是数字就可以,因为nginx 正则就是 /d匹配数字,需要其他正则规则自己配置。版本号的产生可以在每次前端构建发版的时候定义一个全局变量 version然后获取;也可以和后端约定,通过接口的形式获取版本号,每次发新版本,version都+1更新,版本号只要和上次就版本不一致就可以。建议还是通过接口形式获取版本号,这样比较好维护也好变更,拿到版本号后在原请求路径上追加版本号。
https://www.xxx.com/policy/{版本号}/#/abc.vue
五、加版本号的一些问题
有一些微信小程序需要分享二维码或者分享给第三方的链接。因为二维码都比较固定,不会经常变化。所以对于分享出去的链接最好先把版本号去掉,等扫码进入或者链接进入时,再请求接口把版本号拼接上。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。