您现在的位置是:首页 > 技术人生 > 前端技术前端技术
通过gulp将静态文件js,css自动添加版本号
高晓波2019-06-25【前端技术】人已围观
简介每次发布更新时涉及到静态文件css,js时,如果用户不主动清除浏览器会造成页面未及时更新,甚至报错的情况发生,我们不可能要求用户每次去手动清除浏览器缓存。
如果通过在js或者c
每次发布更新时涉及到静态文件css,js时,如果用户不主动清除浏览器会造成页面未及时更新,甚至报错的情况发生,我们不可能要求用户每次去手动清除浏览器缓存。
如果通过在js或者css文件后添加时间戳的方式来避免这样的问题,浏览器的缓存设计就被架空,增加用户页面加载时间,占用更多的服务器带宽。
废话不多说,最佳解决方案,通过gulp将静态文件js,css自动添加版本号。
一、安装gulp和gulp插件
二、编写gulpfile.js
三、修改插件
2、node_modules\rev-path\index.js
第9行
更新为:
第17行
更新为:
3、打开node_modules\gulp-rev-collector\index.js
第40行:
更新为:
4、打开node_modules\gulp-assets-rev\index.js
第78行
更新为:
第80行
更新为:
四、执行gulp
瞅瞅吧~~
如果通过在js或者css文件后添加时间戳的方式来避免这样的问题,浏览器的缓存设计就被架空,增加用户页面加载时间,占用更多的服务器带宽。
废话不多说,最佳解决方案,通过gulp将静态文件js,css自动添加版本号。
一、安装gulp和gulp插件
npm install --save-dev gulp@3.9.1
npm install --save-dev gulp-rev
npm install --save-dev gulp-rev-collector
npm install --save-dev gulp-asset-rev
npm install --save-dev run-sequence
二、编写gulpfile.js
//引入gulp和gulp插件,
var gulp = require('gulp'),
assetRev = require('gulp-asset-rev'),
runSequence = require('run-sequence'),
rev = require('gulp-rev'),
revCollector = require('gulp-rev-collector');
//定义css、js源文件路径
var cssSrc = 'css/*.css', // 注意这里修改为你的源文件路径,例如笔者的项目css文件,设置为 static/css/main/*.css ,js同理。
jsSrc = 'js/*.js';
//为css中引入的图片/字体等添加hash编码
gulp.task('assetRev', function(){
return gulp.src(cssSrc) //该任务针对的文件
.pipe(assetRev()) //该任务调用的模块
.pipe(gulp.dest('src/css')); //编译后的路径
});
//CSS生成文件hash编码并生成 rev-manifest.json文件名对照映射
gulp.task('revCss', function(){
return gulp.src(cssSrc)
.pipe(rev())
.pipe(rev.manifest())
.pipe(gulp.dest('rev/css'));
});
//js生成文件hash编码并生成 rev-manifest.json文件名对照映射
gulp.task('revJs', function(){
return gulp.src(jsSrc)
.pipe(rev())
.pipe(rev.manifest())
.pipe(gulp.dest('rev/js'));
});
//Html替换css、js文件版本
gulp.task('revHtml', function() {
return gulp.src(['rev/**/*.json', 'View/*.html']) // 这里的View/*.html是项目html文件路径,如果gulpfile.js和html文件同在一级目录下,修改为return gulp.src(['rev/**/*.json', '*.html']);
.pipe(revCollector())
.pipe(gulp.dest('View'));// 注意这里是生成的新的html文件,如果设置为你的项目html文件所在文件夹,会覆盖旧的html文件,若上面的View/*.html修改了,这里也要相应修改,如果gulpfile.js和html文件同在一级目录下,修改为 .pipe(gulp.dest(''));
});
//开发构建
gulp.task('default', function(done) {
condition = false;
runSequence( //需要说明的是,用gulp.run也可以实现以上所有任务的执行,只是gulp.run是最大限度的并行执行这些任务,而在添加版本号时需要串行执行(顺序执行)这些任务,故使用了runSequence.
['assetRev'],
['revCss'],
['revJs'],
['revHtml'],
done);
});
三、修改插件
1、node_modules\gulp-rev\index.js
第134行:
manifest[originalFile] = revisionedFile;
更新为:
manifest[originalFile] = originalFile + '?v=' + file.revHash;
2、node_modules\rev-path\index.js
第9行
return modifyFilename(pth, (filename, ext) => `${filename}-${hash}${ext}`);
更新为:
return modifyFilename(pth, (filename, ext) => `${filename}${ext}`);
第17行
return modifyFilename(pth, (filename, ext) => filename.replace(new RegExp(`-${hash}$`), '') + ext);
更新为:
return modifyFilename(pth, (filename, ext) => filename.replace(new RegExp(`-${hash}$`), '') + ext);
3、打开node_modules\gulp-rev-collector\index.js
第40行:
var cleanReplacement = path.basename(json[key]).replace(new RegExp( opts.revSuffix ), '' );
更新为:
var cleanReplacement = path.basename(json[key]).split('?')[0];
4、打开node_modules\gulp-assets-rev\index.js
第78行
var verStr = (options.verConnecter || "-") + md5;
更新为:
var verStr = (options.verConnecter || "") + md5;
第80行
src = src.replace(verStr, '').replace(/(\.[^\.]+)$/, verStr + "$1");
更新为:
src=src+"?v="+verStr;
5、node_modules\gulp-rev-collector\index.js
第173行
regexp: new RegExp( prefixDelim + pattern, 'g' ),
更新为:
regexp: new RegExp( prefixDelim + pattern + '(\\?v=\\w{10})?', 'g' ),
四、执行gulp
瞅瞅吧~~
Tags:
很赞哦! ()
相关文章
随机图文
-
【分享】css3侧边栏导航不同方向划出效果
设定一组侧边栏导航菜单,然后可以从任何一边滑出。有两种实现方式,一种固定菜单,一种从左右两侧推出 -
如何取消select2插件下拉框向上展示
使用select2下拉框插件时,有时由于下拉框高度问题导致下拉选项向上展示,影响显示效果。 通过修改select2源码,使select2固定向下展示选项。 -
帝国cms ckeditor代码高亮插件codesnippet mac风格主题
无意中看到别人家的博客代码高亮非常漂亮,Mac OS风格,查阅资料为Pure Highlightjs,是WordPress插件。奈何咱们的博客不是WordPress程序,长叹一声~好在我们是程序猿,自动动手改造吧。 -
三步实现滚动条触动css动画效果
现在很多网站都有这种效果,我就整理了一下,分享出来。利用滚动条来实现动画效果,ScrollReveal.js 用于创建和管理元素进入可视区域时的动画效果,帮助你的网站增加吸引力