gulp为项目文件添加版本号
来源:互联网 发布:relex软件 破解版 编辑:程序博客网 时间:2024/06/05 02:35
先说一下本文讲的是什么。
你一定看过这种带参的css或js文件,每次发布版本,专业一点的话,都会对新版文件打个tag。为了和上一版本的文件做区分,就可以通过这种‘?+参数’ 的方式做版本标记。
注:gulp插件原本的版本号更新方式不是这样,而是直接更改文件名,比如index.css更新为index-abcdefg.css类似这样子,这样一来每次更新版本的同时,还要对文件重命名,然而我们有时可能不想重命名,所以选择“?+参数”方式,不用改变文件原本名称,就像ajax的get方法,末尾加参数,却不影响文件原来在页面中的显示效果(这个例子也不好)。
初学这东西也是百度了几个文档,照着文档来搞,MD百度上文档都一个熊样儿,大家互相抄袭,所以我没有成功,可能是我用的cnpm而是不npm,也可能是版本原因吧,最后通过简单查看了一下npm的包中的index.js源码,问题还是被我解决了。过程如下:
(1)首先还是在项目目录安装包,需要五个包:
1 npm install --save-dev gulp2 npm install --save-dev gulp-rev3 npm install --save-dev gulp-rev-collector4 npm install --save-dev gulp-asset-rev5 npm install --save-dev run-sequence我的项目目录结构如下:
src就是开发版本啦,dist是即将发布的版本,所以最终的压缩后简化后的代码全都在dist,提交到服务器。
src中有html文件和css、js文件夹,html引入文件路径为相对路径“./css/***.css”,到时一起将html,css,js,font等文件转到dist,路径也不用改变。
rev文件夹的json文件记录版本号,sass与css文件夹同级,sass编译后直接导入css文件夹,再对css文件夹中文件进行版本号添加即可,dist中不再有sass和rev等这些累赘的文件夹。
(2)编写gulpfile.js代码,代码如下:(还附加了一些其他的,可忽略)
var gulp = require('gulp'), minifyhtml = require('gulp-minify-html'), sass = require('gulp-sass'), uncss = require('gulp-uncss'), assetRev = require('gulp-asset-rev'), runSequence = require('run-sequence'), rev = require('gulp-rev'), revCollector = require('gulp-rev-collector');//压缩html文件并拷贝到dist文件夹中gulp.task('minify-html',function(){ gulp.src('./src/*.html') .pipe(minifyhtml()) .pipe(gulp.dest('./dist'));});//编译sass成cssgulp.task('sass',function(){ gulp.src('./src/sass/*.scss') .pipe(sass()) //.pipe(uncss({html:['src/index.html']})) .pipe(gulp.dest('./src/css'));});//去除css中无用的类(使用框架时作用极为突出)gulp.task('uncss',function(){ gulp.src('./src/css/*.css') .pipe(uncss({html:['./src/index.html']})) .pipe(gulp.dest('./src/css'));});/*************************************************添加版本号 正式内容**********************************************/var cssSrc = './src/css/*.css', jsSrc = './src/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('./src/rev/css'));});//js生成文件hash编码并生成 rev-manifest.json文件名对照映射gulp.task('revJs', function(){ return gulp.src(jsSrc) .pipe(rev()) .pipe(rev.manifest()) .pipe(gulp.dest('./src/rev/js'));});//Html替换css、js文件版本gulp.task('revHtml', function () { return gulp.src(['./src/rev/**/*.json','./src/*.html']) .pipe(revCollector()) .pipe(gulp.dest('./src'));});//开发构建,默认任务gulp.task('default', function (done) { runSequence( //需要说明的是,用gulp.run也可以实现以上所有任务的执行,只是gulp.run是最大限度的并行执行这些任务,而在添加版本号时需要串行执行(顺序执行)这些任务,故使用了runSequence. ['assetRev'], ['revCss'], ['revJs'], ['revHtml'], done);});(3)接下来还要修改npm的包中的index.js源文件,因为默认的版本号不是“?+参数”形式:
3.1 打开node_modules\gulp-rev\index.js
其中的: manifest[originalFile] = revisionedFile;
更新为: manifest[originalFile] = originalFile + '?v=' + file.revHash;
3.2 打开node_modules\rev-path\index.js
其中的: return filename + '-' + hash + ext;
更新为: return filename + ext;
3.3 打开node_modules\gulp-assets-rev\index.js
其中的: var verStr = (options.verConnecter || "-") + md5;
更新为:var verStr = (options.verConnecter || "") + md5;
其次: src = src.replace(verStr, '').replace(/(\.[^\.]+)$/, verStr + "$1");
更新为:src=src+"?v="+verStr;
3.4 打开node_modules\gulp-rev-collector\index.js
其中的: if ( !_.isString(json[key]) || path.basename(json[key]).replace(new RegExp( opts.revSuffix ), '' ) !== path.basename(key) ) {
更新为: if ( !_.isString(json[key]) || path.basename(json[key]).split('?')[0] !== path.basename(key) ) {
其次: regexp: new RegExp( '([\/\\\\\'"])' + pattern, 'g' ),
更改为:regexp: new RegExp( '([\/\\\\\'"])' + pattern+'(\\?v=\\w{10})?', 'g' )
3.5 如果3.4的node_modules\gulp-rev-collector\index.js中找不到相应更改位置,则:
找到: let cleanReplacement = path.basename(json[key]).replace(new RegExp( opts.revSuffix ), '' );
更改为: let cleanReplacement = path.basename(json[key]).split('?')[0];
其次找到: regexp: new RegExp( prefixDelim + pattern, 'g' ),
更改为: regexp: new RegExp( prefixDelim + pattern + '(\\?v=\\w{10})?', 'g' ),
上述的3.1,3.2,3.3对应文件中都能找到对应位置更改,3.4中由于版本不同,可能找不到更改位置,所以我自己研究了一番,找到了更改位置并且更改后版本号在每次修改过文件之后更新成功,就总结了3.5。、
(4)接下来再gulp一下task就可以啦,然后可以随意更改一下css或者js文件,查看新的版本号。
json中的版本号与其是相同的
如果发现json中的版本号显示更新成功,但是html中对应的文件链接的版本号不存在或者没有更新,那一定是gulpfile.js中的“revHtml”task中的json和html文件路径写错了,检测不到版本号更新位置,html中自然就不会更新文件版本号。
- gulp为项目文件添加版本号
- 使用gulp为项目中的文件自动添加版本号之实践思路
- gulp自动添加静态文件版本号方案
- gulp自动添加版本号
- Gulp自动添加版本号
- gulp自动化添加版本号并修改为参数格式
- 使用gulp对引用的文件添加版本号
- Gulp开发:Gulp自动添加版本号
- gulp改造gulp-rev-append插件实现资源文件链接自动添加MD5版本号
- 缓存进阶处理:从不处理到基于gulp的前端静态文件自动添加版本号
- 为js和css文件自动添加版本号
- 使用 MANIFEST.MF 文件为打包添加版本号
- gulp自动添加版本号过程中的一些要点记录
- 项目签名,为项目添加snk文件
- ECHOP添加静态文件版本号
- Web项目发布 采用gulp压缩 JS CSS CSHTML ASPX HTML Image 给JS CSS自动添加版本号 强制浏览器刷新缓存
- 为项目添加git的.gitignore文件
- 前端静态资源版本更新与缓存之——通过gulp 在原html文件上自动化添加js、css版本号
- 高性能WEB服务器——之Jetty (N)I/O组件
- JAVA List 迭代遍历案例
- JdbcDaoSupport配合@Repository无法注入DataSource
- LaTeX中文支持(Debian/Ubuntu,pdfLaTeX)
- [RK3288][Android6.0] 调试笔记 --- Activity多次调用finish()引起的Warning
- gulp为项目文件添加版本号
- LibUsbDotNet的简单理解:Read Write(Poll)
- 适配器模式
- ES6解构赋值详解
- hadoop之zookeeper
- MTK-JTAG接口
- 2017吉林省教师招聘考试:教育法律救济常考知识点汇总
- darkflow测试和训练yolo
- npm 与 package.json 快速入门