浅谈微信页面入口文件被缓存解决方案


Posted in Javascript onSeptember 29, 2018

缓存对于前端页面来说,是加速页面加载的利器之一,但也同时带来了很多问题,比如新版本发布之后,怎么替换客户端上的缓存文件呢?大家一般的的解决方案主要有以下几种形式,

一般情况

1、添加版本号,在静态资源文件的引用链接后面添加版本号,这样每次发布的时候更新版本号,就能让叫客户端加载新的资源文件,避免再次使用缓存的老文件,如

<script src="//m.test.com/build/activity/js/commons.js?v=20170608"></script>

2、文件名使用hash形式,webpack中打包文件可直接生成,这样每次打包发布的时候都会产生新的hash值,区别于原有的缓存文件

<script src="//m.test.com/build/activity/js/activity/201807/schoolbeauty/main.19315e5.js"></script>

3、服务器及缓存头设置,不使用缓存,如

location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|js)$ {
  root  /mnt/dat1/test/tes-app;
  #### kill cache
  add_header Last-Modified $date_gmt;
  add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
  if_modified_since off;
  expires off;
  etag off;
}

4、在html的meta标签添加缓存设置

<!-- cache control: no cache -->
<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" />

微(keng)信(die)浏览器

微信浏览器下比较特殊,这个bug一样的存在居然把入口文件html给缓存下来了,这就意味着通过版本号和hash号的形式避免缓存的方案失效了。同时html的meta设置依旧没能生效。

方案一(部分框架无效)
最开始碰到这个问题,我在想是不是可以给入口文件的html加一个版本号,比如https://m.test.com/views/index?v=1538208193491

理论上来说,这样应该是可以的,但发现没有用。分析原因可能是vue+nginx的形式下,所有的路由都被try_files解析到index.html

location / {
  root  /mnt/dat1/test/tes-app;
  index index.html index.htm;
  try_files $uri $uri/ /index.html;
}

这个解析的过程中版本号已经失效了,因此没能达到替换缓存的目的。至于其他的框架下,比如ftl、jsp那种模版编译的有可能生效,不过需要大家自己去验证了。

方案二(有效)

再换一种方案,更改服务器配置,强制不缓存入口文件,其他静态正常缓存,比如在nginx中对静态部分如下

location / {
  root  /mnt/dat1/test/tes-app;
  index index.html index.htm;
  try_files $uri $uri/ /index.html;
  #### kill cache
  add_header Last-Modified $date_gmt;
  add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
  if_modified_since off;
  expires off;
  etag off;
}

location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|js)$ {
  root  /mnt/dat1/test/tes-app;
  access_log off;
  expires 30d;
}

最终经过测试,这种方式可以解决微信下入口文件被缓存的问题,问题解决~~

题外话

说到这里,微信浏览器为什么要缓存html文件呢?
1、难道也是加速页面加载?并不见得是这个原因,因为这可能带来的问题大于带来的优化效果。
2、缓存入口页面和保留上次浏览位置是否有关联呢?感觉关联度也不是那么大

补充:微信浏览器取消缓存的方法

一、通过url参数避免html文件缓存

请求同一个页面的时候,如果url后面的参数不一样,则不会调用微信缓存中的html页面,由此可以解决html页面的缓存问题。例如加个版本号或时间戳

www.xxx.com/home.html?v=1.0

二、避免css和js的缓存

以上工作完成之后,我们解决了html的缓存问题,但是通过访问nginx(或是其他工具)的日志发现,虽然带上了不同的参数,html确实不会缓存了,但是却没有js和css文件的请求。

猜测在这里,微信发现我们所请求的js和css文件在他的缓存里面有了,所以就直接打开缓存中的文件返回给了页面上。(所以这就坑爹了啊!!)

所以我们要在html文件的头部(head)处加上一些meta:

<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" />

ps,网上很多答案都提供了添加在head处的meta,但是有的人说没有用。目测是因为meta只能保障js和css等资源不会被缓存,但是无法保障html不被缓存。所以,要和url参数方法于meta方法一起使用,才能保障毫无侧漏!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript高亮效果的二种实现方法
Sep 14 Javascript
jQuery+CSS 半开折叠效果原理及代码(自写)
Mar 04 Javascript
jquerymobile局部渲染的各种刷新方法小结
Mar 05 Javascript
Javascript window对象详解
Nov 12 Javascript
JavaScript实现函数返回多个值的方法
Jun 09 Javascript
基于JS实现回到页面顶部的五种写法(从实现到增强)
Sep 03 Javascript
微信JSAPI Ticket接口签名详解
Jun 28 Javascript
详解vuex的简单使用
Mar 12 Javascript
node命令行工具之实现项目工程自动初始化的标准流程
Aug 12 Javascript
JavaScript使用百度ECharts插件绘制饼图操作示例
Nov 26 Javascript
vue学习笔记之slot插槽基本用法实例分析
Feb 01 Javascript
解决vue刷新页面以后丢失store的数据问题
Aug 11 Javascript
vue实现弹框遮罩点击其他区域弹框关闭及v-if与v-show的区别介绍
Sep 29 #Javascript
vue使用v-for实现hover点击效果
Sep 29 #Javascript
vue 利用路由守卫判断是否登录的方法
Sep 29 #Javascript
vue路由事件beforeRouteLeave及组件内定时器的清除方法
Sep 29 #Javascript
在vue中v-bind使用三目运算符绑定class的实例
Sep 29 #Javascript
iview同时验证多个表单问题总结
Sep 29 #Javascript
浅谈关于iview表单验证的问题
Sep 29 #Javascript
You might like
PHP多例模式介绍
2013/06/24 PHP
Apache连接PHP后无法启动问题解决思路
2015/06/18 PHP
javascript 用原型继承来实现对象系统
2010/03/22 Javascript
JavaScript实现按Ctrl键打开新页面
2014/09/04 Javascript
javascript实现随时变化着的背景颜色
2015/04/02 Javascript
jQuery+CSS实现的网页二级下滑菜单效果
2015/08/25 Javascript
js淡入淡出焦点图幻灯片效果代码分享
2015/09/08 Javascript
利用AngularJs实现京东首页轮播图效果
2016/09/08 Javascript
js手动播放图片实现图片轮播效果
2016/09/17 Javascript
使用Bootrap和Vue实现仿百度搜索功能
2017/10/26 Javascript
Node.js 实现抢票小工具 &amp; 短信通知提醒功能
2019/10/22 Javascript
Vue的全局过滤器和私有过滤器的实现
2020/04/20 Javascript
vue-drawer-layout实现手势滑出菜单栏
2020/11/19 Vue.js
vue实现可移动的悬浮按钮
2021/03/04 Vue.js
[02:06]DOTA2肉山黑名单魔法终结者 敌法师中文配音鉴赏
2013/06/17 DOTA
python使用any判断一个对象是否为空的方法
2014/11/19 Python
python使用multiprocessing模块实现带回调函数的异步调用方法
2015/04/18 Python
python实现自动更换ip的方法
2015/05/05 Python
Python3.2中Print函数用法实例详解
2015/05/19 Python
浅谈python内置变量-reversed(seq)
2017/06/21 Python
python爬虫之xpath的基本使用详解
2018/04/18 Python
Python2.7 实现引入自己写的类方法
2018/04/29 Python
基于数据归一化以及Python实现方式
2018/07/11 Python
python元组和字典的内建函数实例详解
2019/10/22 Python
Python实现将蓝底照片转化为白底照片功能完整实例
2019/12/13 Python
Dillard’s百货官网:Dillards.com
2018/05/26 全球购物
Godiva巧克力英国官网:比利时歌帝梵巧克力
2018/08/28 全球购物
实习教师自我鉴定
2013/12/09 职场文书
电气自动化个人求职信范文
2014/02/03 职场文书
好书伴我成长演讲稿
2014/05/14 职场文书
学校三节实施方案
2014/06/09 职场文书
展览会邀请函
2015/02/02 职场文书
2015年征兵工作总结
2015/07/23 职场文书
mysql获取指定时间段中所有日期或月份的语句(不设存储过程,不加表)
2021/06/18 MySQL
Python中文分词库jieba(结巴分词)详细使用介绍
2022/04/07 Python
python中 Flask Web 表单的使用方法
2022/05/20 Python