上一篇文章文章介绍了前端工程化中的缓存问题,以及如何处理缓存问题,比较好的就是gulp-rev正好解决的就是这个问题。
参见上一篇文章,rev做的事情真是如此,他会根据静态文件资源内容生成一个内容散列值,打包出来的文件会增加上这个散列值,与此同时会生成一个json文件用来保存打包前和打包后文件的对应关系。然后将html里面的链接修改为增加散列值的文件就可以了,这样就可以找到资源了。很重要的一点(上一篇文章也介绍了)就是:静态服务器要配置静态资源的过期时间为永不过期。
这样做的目的是:
- 静态资源在客户端只会请求一次(首次),永久缓存,之后访问不会再发送请求协商304
- 更改、更新会指定到对应的文件
- 不删除旧版本(cdn等),以便回滚代码,回滚的时候更新html,同时也不会增加http请求。
但是一般旧版本的文件会在几个月后,或者线上该文件的访问量达到或者超过之前文件的访问量的时候,会选择删除文件以节省空间。
说一下我们要实现的效果以及使用的方法吧:
我们要实现的是将css和js文件加下的文件的打包成增加了散列值的文件,生成对比文件的json,同时更改index.html中的链接
gulp-rev 用来增加散列值
gulp-rev-collector用来替换html文件中的链接
npm install gulp gulp-rev gulp-rev-collector --save-dev
在gulpfile.js中:
var gulp = require('gulp'); var rev = require("gulp-rev"); var revColletor = require('gulp-rev-collector'); //revision 用来增加散列值和生成rev.manifest.json gulp.task("revision",function(){ return gulp.src([ "src/**/*.css", "src/**/*.js" ]) .pipe(rev()) .pipe(gulp.dest('build/')) .pipe(rev.manifest()) .pipe(gulp.dest('build/')) }) //replace 用来热替换链接 gulp.task('replace',function () { gulp.src(['build/*.json','./src/index.html']) .pipe(revColletor({ replaceReved:true//必须增加这个参数,否则更改了源文件之后不会热更新 })) .pipe(gulp.dest('./build')) }) gulp.task('default',["revision","replace"],function () { console.log('success') })
这样就可以将文件打包至manster文件加下,同时生成了一个rev-manifest.json文件,里面是文件对应关系
{ "css/Alex.css": "css/Alex-c3d6d4d4e9.css", "css/manster.css": "css/manster-6f2b1ce9d5.css", "js/index.js": "js/index-7bf8f801f1.js", "js/test.js": "js/test-5e0352d903.js" }
之前的index.html和打包替换之后的对比
之前 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="./css/manster.css"> <link rel="stylesheet" href="./css/Alex.css.css"> </head> <body> </body> <script src="./js/index.js"></script> <script src="./js/test.js"></script> </html> 之后 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="./css/manster-7af2727272.css"> <link rel="stylesheet" href="./css/Alex-c3d6d4d4e9.css.css"> </head> <body> </body> <script src="./js/index-7bf8f801f1.js"></script> <script src="./js/test-5e0352d903.js"></script> </html>
文章评论