使用gulp解决微信页面缓存的问题

最近在开发web项目的时候发现一个令人头疼的事情,在微信公众号上展示的页面微信为了提升性能会进行缓存,关键是这个缓存机制还和其他浏览器的不一样,这就导致了即使发布了新的版本,如果不清除缓存的情况下,还是会执行缓存的老版本。对于用户来讲,可能不懂得怎么清除缓存,这就会出现bug。
通过网上查找资料,各路大神对于清除缓存给了好多方法,在此展示下,当然最终还是要说下使用gulp来解决微信html页面中css、js缓存的问题,后台配置Nginx环境解决html文件本身被缓存的问题

清除页面缓存(对微信无效)

方法一: 添加meta
  • no-cache: 告诉浏览器、缓存服务器,不管本地副本是否过期,使用资源副本前,一定要到源服务器进行副本有效性校验
  • must-revalidate:告诉浏览器、缓存服务器,本地副本过期前,可以使用本地副本;本地副本一旦过期,必须去源服务器进行有效性校验。
  <meta http-equiv="Cache-Control" content="no-cache, must-revalidate">

  <!--禁止浏览器从本地计算机的缓存中访问页面内容。-->
  <!--注意:这样设定,访问者将无法脱机浏览。-->
  <meta http-equiv="Pragma" content="no-cache">

  <!--设定网页的到期时间,用于设定网页的到期时间。-->
  <!--一旦网页过期(content = "0"),必须到服务器上重新传输。-->
  <meta http-equiv="expires" content="0">
方法二: 用ajax请求服务器最新文件,并加上请求头If-Modified-Since和Cache-Control (针对此接口不缓存)
$.ajax({
  url:'www.baidu.com',
  dataType:'json',
  data:{},
  async:false,
  beforeSend :function(xmlHttp){
    xmlHttp.setRequestHeader("If-Modified-Since","0");
    xmlHttp.setRequestHeader("Cache-Control","no-cache");
  },
  success:function(response){
    //操作
  }
});
方法三:ajax请求添加cache:false (不对接口数据缓存)
$.ajax({
  url:'www.baidu.com',
  dataType:'json',
  data:{},
  cache:false,
  async:false,
  ifModified :true ,
  success:function(response){
    //操作
  }
});
方法四:在服务端配置 (不对html文件本身缓存)
location ~ \.(html)$ {
  expires -1;
  add_header Cache-Control no-store;
}

此处只让后台同事对html不进行缓存,css、js加载完一遍之后,进行缓存(304),这样既能保证性能,也能解决每次更新带来的缓存问题。

(上面的方法和Gulp共同使用,就能解决微信缓存问题了。)

--------------------------------- gulp ------------------------------

对于gulp的应用我也只是皮毛,在此记录下只是为了以后用到了方便查阅。大家可以通过Gulp中文网(戳进去)这篇博文(通过gulp将less转为css)进行相应的学习~

“gulp是基于Nodejs的自动任务运行器,它能自动化地完成 javascript/coffee/sass/less/html/image/css 等文件的测试、检查、合并、压缩、格式化、浏览器自动刷新、部署文件生成,并监听文件在改动后重复指定等等操作。。。在实现上,她借鉴了Unix操作系统的管道(pipe)思想,前一级的输出,直接变成后一级的输入,使得在操作上非常简单。”

第一步:搭建nodejs环境

在使用gulp前需要搭建nodejs的环境,不熟悉的可以查看我的这篇文章中的第一步和第二步操作

第二步:全局安装gulp
# 说明:全局安装gulp目的是为了通过它执行gulp任务
$ npm install gulp -g
# 查看是否安装成功,出现版本号即为成功
$ gulp -v
第三步:在项目中新建gulpfile.js文件(这个名字可以改,只要和package.json文件中的"main": " "对应即可)
gulpfile.js是gulp项目的配置文件,在这个文件中写入需要执行的脚本
第四步: 新建package.json文件

说明:package.json是基于nodejs项目必不可少的配置文件,它是存放在项目根目录的普通json文件。

$ cd 到项目路径
$ npm init

按照提示一步一步的填写对应的信息即可,此时项目中就会生成一个package.json文件(配置文件)和node_modules文件夹(依赖模板库)。

第五步: 本地安装gulp插件

在项目路径下执行:

# --save-dev:保存配置信息到package.json文件的devDependencies开发环境依赖中。
$ npm install --save-dev

# 因为本例中用到的模板比较多,需要都安装下
$ npm install gulp-rev --save-dev
$ npm install gulp-rev-collector --save-dev
$ npm install gulp-clean --save-dev
$ npm install gulp-jshint --save-dev
$ npm install jshint --save-dev
$ npm install gulp-minify-css --save-dev
$ npm install gulp-uglify --save-dev

执行完之后在package.json文件的devDependencies中就会产生对应的依赖。node_modules文件夹中就会下载对应的模板。
第六步: 在gulpfile.js文件中实现脚本逻辑

接下来就要回过头来去编辑我们刚才创建的gulpfile.js文件了。
因为代码较多,我就切成图片放这里了,随后我回把整个demo放在GitHub上,有需要查看的可以download下来。

图中就是对应的整个脚本逻辑

第七步:运行gulp
方式一:

1. 通过webStrom 选中 gulpfile.js 文件,右击选择 Show Gulp Tasks。

2. 在左侧列表中就会列出我们脚本中写的所有task,双击想要执行的task即可。此处我们通过双击default,来执行我们编写的所有task。

方式二:

通过Terminal终端:

cd 到项目路径下

# 执行所有任务
$ gulp 
# 执行指定任务
$ gulp 任务名称
上面的两种方法取一执行即可。

提示:(不管执行哪种方式,都要重复执行2遍,要不然html文件中引入的css、js文件名不会被替换掉,我目前也不知道为什么。。。)

执行结果如下:
dist文件夹下的css和js

web文件下是未压缩的原开发文件,通过执行gulpfile.js脚本,在dist文件下生成了对应的压缩过的css和js文件。

rev文件夹下记录了原文件和处理后生成的新文件的一一对应关系。

rev-manifest.json中保存的内容如下:

# /rev/css
{
  "myCss.css": "myCss-1bfa302df1.css"
}
# /rev/js
{
  "myJavaScript.js": "myJavaScript-228385c373.js"
}
对于生成的html文件:

这是我web文件夹下原html文件的引用

  <link rel="stylesheet" href="css/myCss.css">
  <script src="js/myJavaScript.js"></script>

这是在dist目录下新生成的html文件的引用

  <link rel="stylesheet" href="css/myCss-1bfa302df1.css">
  <script src="js/myJavaScript-228385c373.js"></script>

效果很明显,这样在发布的时候引用dist目录下的对应代码就可以了。
既解决了微信页面缓存的问题(通过修改文件名避免缓存上个版本),又提升了页面访问效率。

到此,整个demo就梳理完了。我把demo放在gitHub上了,有需要查看的可以download下。
千里执行,始于足下~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,997评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,603评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,359评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,309评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,346评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,258评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,122评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,970评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,403评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,596评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,769评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,464评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,075评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,705评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,848评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,831评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,678评论 2 354

推荐阅读更多精彩内容