yarn add gulp-rev yarn add gulp-rev-collector
"gulp": "^3.9.1" "gulp-rev": "^8.0.0" "gulp-rev-collector": "^1.1.1"
APIcss
revFormat([options])
prefix
Type: string Default: "-"html
Prefix appended to Hash.
(hash值的前缀)
suffix
Type: string Default: ""node
Suffix appended to Hash.
(hash值的后缀)
lastExt
Type: boolean Default: falsenpm
Append formatted Hash just before last extension of a file.json
(By default, gulp-rev and this plugin will append the formated Hash just before the first . of a filename)gulp
If true, unicorn.ext1.ext2.css would become unicorn.ext1.ext2-
Note with default options, output is the same with gulp-rev: unicorn.css → unicorn-d41d8cd98f.cssapp
使用方法:
svn
- src - css - common.css - img - hsq.jpg - js - index.js - index.html - gulpfile.js
index.html代码工具
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <link rel="stylesheet" href="./css/common.css"> </head> <body> <p> 利用gulp自动添加版本号 </p> <img src="./img/hsq.jpg" alt=""> </body> <script src="./js/index.js"></script> </html>
gulpfile.js的配置以下
const gulp = require('gulp'), rev = require('gulp-rev'), revCollector = require('gulp-rev-collector'); gulp.task('css',function(){ return gulp.src('src/css/*.*') .pipe(rev()) .pipe(gulp.dest('dist/css')) .pipe(rev.manifest()) .pipe(gulp.dest('rev/css')) }) gulp.task('js',function(){ return gulp.src("src/js/*.*") .pipe(rev()) .pipe(gulp.dest("dist/js")) .pipe(rev.manifest()) .pipe(gulp.dest('rev/js')) }) gulp.task('rev',['css','js'],function(){ return gulp.src(['rev/**/*.json','src/*.html']) .pipe(revCollector({ replaceReved: true })).pipe(gulp.dest('dist')) })
result:每次当文件变化的时候,那么该文件hash属性值就会变化,此时gulp-rev新造成新的json格式的manifest,当gulp-rev-collector读取json清单以后,就会在Html(任意视图文件)之中替换外部的连接。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <link rel="stylesheet" href="./css/common-2289731958.css"> </head> <body> <p> 利用gulp自动添加版本号 </p> <img src="./img/hsq.jpg" alt=""> </body> <script src="./js/index-8b50a3f85f.js"></script> </html>
但这样的结果并非咱们想要的,理由以下:
解决方案:不修改被引用资源的文件名,在模板之中,其请求连接之上改成 *.js?v=hash。
手动修改这两个插件
manifest[originalFile] = revisionedFile;/*( line 134 ) =>*/ manifest[originalFile] = originalFile + '?v=' + file.revHash;
return filename + '-' + hash + ext;/*( line 10 )=>*/ return filename + ext;
if ( !_.isString(json[key]) || path.basename(json[key]).replace(new RegExp( opts.revSuffix ), '' ) !== path.basename(key) ) { isRev = 0; } /*(line 30)=>*/ if ( !_.isString(json[key]) || path.basename(json[key]).split('?')[0] !== path.basename(key) ) { isRev = 0; }
return pattern.replace(/[\-\[\]\{\}\(\)\*\+\?\.\^\$\|\/\\]/g, "\\$&"); /*(line 50)=>*/ var rp = pattern.replace(/[\-\[\]\{\}\(\)\*\+\?\.\^\$\|\/\\]/g, "\\$&"); rp = pattern + "(\\?v=(\\d|[a-z]){8,10})*"; return rp;
patterns.push( escPathPattern( (path.dirname(key) === '.' ? '' : closeDirBySep(path.dirname(key)) ) + path.basename(key, path.extname(key)) ) + opts.revSuffix + escPathPattern( path.extname(key) ) ); /*(line(90)=>)*/ patterns.push( escPathPattern( (path.dirname(key) === '.' ? '' : closeDirBySep(path.dirname(key)) ) + path.basename(key, path.extname(key)) ) + opts.revSuffix + escPathPattern( path.extname(key) ) + "(\\?v=(\\d|[a-z]){8,10})*" );
如此便达到目标了。
结果html以下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <link rel="stylesheet" href="./css/common.css?v=2289731958"> </head> <body> <p> 利用gulp自动添加版本号 </p> <img src="./img/hsq.jpg" alt=""> </body> <script src="./js/index.js?v=8b50a3f85f"></script> </html>
到时候只须要下载下来直接替换个包的index.js文件便可;
yarn add gulp-rev-hu yarn add rev-path-hu yarn add gulp-rev-collector-hu
注意:下载我上传的文件以后,须要将官方版本的js文件进行替换,切记不要替换package,json文件