Gulp解决发布线上文件(CSS和JS)缓存问题

本文的缘由:目前经常线上发布文件后要不断的刷新页面及过很长时间,页面上的CSS和JS文件才能生效,特别对于目前做微信商城的时候,微信内置的浏览器缓存非常的严重,之前我们经常是在文件后面加上时间戳的方式来解决线上发布后的缓存问题,但是在微信浏览器内并不生效;因此我们需要改变文件名的方式来解决缓存的问题,因此使用后缀名加上MD5一连串的字符串来解决缓存的问题;

我们先可以考虑这么一个功能,我在页面上引用css文件如下:

./css/xx.css

./js/xx.js

我现在想通过使用MD5重新命名css文件,在页面上自动变为如下文件

./css/xx-34f3902a35.css

一:首先我们需要安装gulp插件;安装教程如下:

http://www.cnblogs.com/tugenhua0707/p/4069769.html

下面我们需要来看看我整个目录结构如下:

如上目录,在src文件夹是存放所有css文件和JS文件的,gulp.html按道理是根目录下的,但是在打包之前,我是把他们放在src文件夹下,作为源文件,根目录下可以先把他删掉或者放在那边也没有关系;也就是说 把所有的html文件备份一份放在src文件夹下作为源文件;

下面是gulp.html的源代码如下:

二:安装插件

  1. 在项目根目录下 运行npm init 后 执行一些操作会在根目录下生存一个 package.json文件夹;
  2. 进入项目的根目录后,执行命令安装如下插件:

npm install –save-dev gulp gulp-concat gulp-minify-css  gulp-rev  gulp-rev-collector

现在我的package.json 变成如下:

{"name": "rev","version": "1.0.0","description": "\"test package\"","main": "index.js","scripts": {"test": "\"a common\""},"keywords": ["rev"],"author": "tugenhua","license": "ISC","devDependencies": {"gulp": "^3.9.0","gulp-concat": "^2.6.0","gulp-jshint": "^2.0.0","gulp-less": "^3.0.5","gulp-minify-css": "^1.2.1","gulp-rename": "^1.2.2","gulp-rev": "^6.0.1","gulp-rev-collector": "^1.0.2","gulp-uglify": "^1.5.1","jshint": "^2.8.0"}
}

如上;如果不想安装的话,可以直接在项目的根目录下新建一个package.json文件;直接把上面的package.json代码复制进行即可;最关键的是 devDependencies 依赖项,其他的可以自己根据自己的需要更改即可~ 然后进入项目的根目录下 执行命令 npm install 即可在根目录下生存 node_modules模块插件;

三:在项目的根目录下新建 Gulpfile.js文件配置

所有配置代码如下:

var gulp = require('gulp');
var concat = require('gulp-concat');                    //- 多个文件合并为一个;
var minifyCss = require('gulp-minify-css');               //- 压缩CSS为一行;
var rev = require('gulp-rev');                          //- 对文件名加MD5后缀
var revCollector = require('gulp-rev-collector');           //- 路径替换

gulp.task('concat', function() {                        //- 创建一个名为 concat 的 task   gulp.src(['./src/css/*.css'])
//- 需要处理的css文件,放到一个字符串数组里
//.pipe(concat('wrap.min.css'))               //- 合并后的文件名.pipe(minifyCss())                         //- 压缩处理成一行.pipe(rev())                              //- 文件名加MD5后缀.pipe(gulp.dest('./dist/css'))                //- 输出文件本地.pipe(rev.manifest())                     //- 生成一个rev-manifest.json.pipe(gulp.dest('./rev'));                  //- 将 rev-manifest.json 保存到 rev 目录内
});gulp.task('rev', function() {gulp.src(['./rev/*.json', './src/*.html'])
    //- 读取 rev-manifest.json 文件以及需要进行css名替换的文件
    .pipe(revCollector())
    //- 执行文件内css名的替换.pipe(gulp.dest('./'));
    //- 替换后的文件输出的目录
});
gulp.task('default', ['concat', 'rev']);

如上配置,配置完成后,进入根目录执行命令如下:

先执行 gulp concat 这个任务 生成一个rev-mainfest.json文件;

然后再运行rev这个任务,把html文件中的css文件替换掉,执行完后,项目的目录结构变成如下:

对比之前的结构 已经在根目录下生成rev这个文件,该文件下 有一个rev-manifest.json文件,我们可以看看该文件的代码如下:

{"gulp.css": "gulp-34f3902a35.css"
}

把gulp.css 文件名 需要改成该生存后有MD5的后缀名的文件;

然后再调用rev这个任务,先读取src下面的所有html的源文件,需要把gulp.css替换成我们生成后的文件,我们现在再来看看生成的根目录下的gulp.html源码变为如下:

可以看到已经替换成带有MD5后缀名的文件了;

注意:为什么一刚开始的时候,我们需要把项目根目录下的所有html文件需要备份一份到src目录下呢? 那是因为每次进行打包的时候,MD5的一连串的字符串会跟着改的,我们需要一个对比的源文件,我们需要把gulp.css 替换成 生成带有MD5一连串的css文件;不管MD5字符串如何更改,我们只需要把gulp.css后缀加上生成的MD5字符串即可~ 那如果我们不备份的话,使用你们的大脑试想下,每次打包一下,根目录下源文件会覆盖一下;并且rev文件夹下 的 rev-manifest.json 代码会变成如下:

{

"gulp.css": "gulp-57f9aab029.css",

"gulp-57f9aab029.css": "gulp-57f9aab02922222.css",

"gulp-57f9aab02922222.css": "gulp-57f9aab0292222aaaaaaa.css",

........

}

每次打包一下,他都会找到页面上的源文件(冒号左侧代表现在的源文件,冒号右边的代表需要替换的新文件的名字);如此循环下来;如果我们备份一下的html文件的话,那么rev-manifest.json永远就是一个替换文件;如下这样的:

{

"gulp.css": "gulp-57f9aab029.css"

}

因为它永远找到的是 源文件上的gulp.css 然后替换成生成新的带有MD5后缀名的文件名;当然如果你觉得不备份的话,在manifest.json生存多少个建值对的都没有关系的话,你也可以不备份,看个人需要;如上只是演示css文件了,当然JS文件也是一样的配置;

github上demo:https://github.com/tugenhua0707/gulp-rev-collector

转载于:https://www.cnblogs.com/tugenhua0707/p/4982646.html

Gulp解决发布线上文件(CSS和JS)缓存问题相关推荐

  1. 解决每次上线更新文件需要手动清除缓存的问题-------js 、css自动清除浏览器缓存方法

    说明 1.分享页更新后,浏览器总是有缓存,须手动清理才能加载修改后的CSS和JS,故在加载地址后动态添加一个随机数(或时间戳)来确保每次加载的文件都不同来消除缓存. 2.在加载js文件时,被加载js文 ...

  2. springmvc读取静态数据,解决html访问不到css和js等静态数据的问题

    方式一: 因为springmvc要支持RestFul风格,配置了<url-partern>/<url-partern>,将所有的资源请求都过滤掉了, 所以解决方式有: (1)在 ...

  3. 解决加载静态文件无法被浏览器缓存问题

    开发环境是:nginx+spring boot + thymeleaf. 遇到的问题:js/css等静态资源文件不被浏览器缓存:如果是本地开发环境不会有这个问题. 解决方法是:nginx设置gzip和 ...

  4. 小程序发布线上接口请求失败,开发者工具请求正常,体验版和开发版要打开调试才可以正常请求解决办法

    遇到这样的问题一般都是域名或者服务器出了问题 先打开小程序后台找到开发管理-开发设置,如下图看看你的请求路径是否在ip白名单中,这里可以填ip地址如127.11.11.11或者https://baid ...

  5. 动漫风格迁移 AnimeGANv2 ,发布线上运行 Demo

    作者 | 神经星星 出品 | HyperAI超神经 By 超神经 内容一览:最强二次元风格迁移模型 AnimeGAN 更新啦,现在可以在线上轻松运行模型,还可以调整风格参数,输出你想要的照片效果. 关 ...

  6. 动漫风格迁移AnimeGANv2,发布线上运行Demo

    来源:HyperAI超神经 本文约800字,建议阅读5分钟 最强二次元风格迁移模型 AnimeGAN 更新啦,现在可以在线上轻松运行模型,还可以调整风格参数,输出你想要的照片效果. 关键词:风格迁移 ...

  7. 【深度学习】动漫风格迁移AnimeGANv2,发布线上运行Demo

    内容一览:最强二次元风格迁移模型 AnimeGAN 更新啦,现在可以在线上轻松运行模型,还可以调整风格参数,输出你想要的照片效果. 关键词:风格迁移 机器视觉 二次元 AnimeGANv2 最近发布了 ...

  8. uni-app +vue+微信小程序 发布线上

    通过HBuilder x里写 uni-app语言和vue 来做微信小程序,在微信开发者工具里来看效果图 发布步骤 : 1.先在 HBuilde X开发工具 --找到导航栏里的 发行---再选择小程序微 ...

  9. SpringBoot --thymeleaf(资源文件css、js的引入)

    配置pom.xml <!--thymeleaf --> <dependency><groupId>org.springframework.boot</grou ...

最新文章

  1. React Native 网络层分析
  2. 【Python】Python获取命令行參数
  3. Mopaas 初体验
  4. Spirng MVC +Velocity 表单绑定命令对象
  5. html中如何实现选择存储路径的功能_HTML是Web前端的基础知识,刚入门的你真的学对了吗?...
  6. php注册界面模板,WeUI注册页面
  7. L3-020 至多删三个字符 [DP]
  8. 怪物猎人ol服务器维护,《怪物猎人OL》5月11日1:30全区全服维护内容公告
  9. 特斯拉最廉价车型——基础版Model 3将取消网售
  10. python程序设计知识点汇总_Python入门知识点汇总
  11. BZOJ 1087 SCOI2005 互不侵犯King 状压DP
  12. cat的用法matlab,MATLAB中“repmat”与“cat”函数的用法
  13. 用C#代码实现求两条线段的交点并判断各种情况
  14. java架构专题涨价_关于单量预测和动态定价的一些思考
  15. html页面保存到本地文件路径,js上传文件到指定路径 jQuery或者js保存文件到本地...
  16. 虚幻4 配置打包安卓
  17. 方剂学(综合练习)题库【2】
  18. Mac谷歌浏览器添加JSONView的插件以提高开发的效率
  19. iOS 集成Facebook登陆
  20. 如何申请email账号注册,如何批量注册申请邮箱?

热门文章

  1. 基于发起源判断CSRF***的方法
  2. LeetCode简单题目(#235 #237 #242 #257 #258)-5道(树、数字、字符串)
  3. Web1.0、Web2.0、Web3.0、Web4.0、Web5.0、Web6.0
  4. 转载 openlayers 3.0 教程
  5. PyQt5 QComboBox 样例代码
  6. animate inater插件_基于animate.css动画库的全屏滚动小插件,适用于vue.js(移动端、pc)项目...
  7. AIR:使用 HTML + Javascript 开发桌面应用
  8. Pixel Bender 浅尝
  9. Android之Adobe AIR本地扩展
  10. python如何学的扎实_如何系统的学习python?