推薦使用gulp-rev + gulp-rev-collector是比較方便的方法,結果以下:css
"/css/style.css" => "/dist/css/style-1d87bebe.css" "/js/script1.js" => "/dist/script1-61e0be79.js" "cdn/image.gif" => "//cdn8.example.dot/img/image-35c3af8134.gif"
可是因爲公司發佈系統限制,若是用上面方法實現,每次更新都會積壓過多過時無用的文件,咱們預期效果是:html
"/css/style.css" => "/dist/css/style.css?v=1d87bebe" "/js/script1.js" => "/dist/script1.js?v=61e0be79" "cdn/image.gif" => "//cdn8.example.dot/img/image.gif?v=35c3af8134"
怎麼破?改上面兩個Gulp插件是最高效的方法了。node
安裝Gulp
npm install --save-dev gulp
jquery
分別安裝gulp-rev、gulp-rev-collerctor
npm install --save-dev gulp-rev
npm install --save-dev gulp-rev-collector
git
打開node_modules\gulp-rev\index.js
github
第133行
manifest[originalFile] = revisionedFile;
更新爲:manifest[originalFile] = originalFile + '?v=' + file.revHash;
apache
打開node_modules\gulp-rev\node_modules\rev-path\index.js
npm
10行
return filename + '-' + hash + ext;
更新爲:return filename + ext;
json
打開node_modules\gulp-rev-collector\index.js
gulp
31行
if ( path.basename(json[key]).replace(new RegExp( opts.revSuffix ), '' ) !== path.basename(key) ) {
更新爲:if ( path.basename(json[key]).split('?')[0] !== path.basename(key) ) {
配置gulpfile.js, 可參考下面gulpfile.js
代碼
結果達到預期,以下:
background: url('../img/one.jpg?v=28bd4f6d18'); src: url('/fonts/icomoon.eot?v=921bbb6f59');
href="css/main.css?v=885e0e1815" src="js/main.js?v=10ba7be289" src="img/one.jpg?v=28bd4f6d18"
├── package.json ├── gulpfile.js ├── src/ │ ├── css/ │ │ ├── main.less │ │ └── normalize.less │ ├── js/ │ │ ├── xx.js │ │ └── xx.js │ ├── img/ │ │ ├── xx.jpg │ │ └── xx.png │ ├── fonts/ │ │ ├── xx.svg │ │ └── xx.ttf │ ├── rev/ │ ├── index.html
{ "devDependencies": { "apache-server-configs": "2.14.0", "archiver": "^0.14.3", "del": "^1.1.1", "glob": "^5.0.5", "gulp": "^3.8.11", "gulp-autoprefixer": "^2.1.0", "gulp-changed": "^1.2.1", "gulp-csslint": "^0.1.5", "gulp-header": "^1.2.2", "gulp-if": "^1.2.5", "gulp-jshint": "^1.11.2", "gulp-less": "^3.0.3", "gulp-load-plugins": "^0.10.0", "gulp-minify-css": "^1.2.0", "gulp-minify-html": "^1.0.4", "gulp-rev": "^5.1.0", "gulp-rev-collector": "^1.0.0", "gulp-uglify": "^1.2.0", "gulp-util": "^3.0.6", "jquery": "1.11.3", "jshint": "^2.8.0", "jshint-stylish": "^2.0.1", "mocha": "^2.2.4", "normalize.css": "3.0.3", "run-sequence": "^1.0.2" }, "engines": { "node": ">=0.10.0" }, "h5bp-configs": { "directories": { "archive": "archive", "dist": "dist", "src": "src", "test": "test" } }, "homepage": "", "license": { "type": "MIT", "url": "" }, "name": "gulp-auto-version", "private": true, "scripts": { "build": "gulp build", "test": "" }, "version": "1.0.0", "dependencies": {} }
var gulp = require('gulp'), runSequence = require('run-sequence'), gulpif = require('gulp-if'), uglify = require('gulp-uglify'), less = require('gulp-less'), csslint = require('gulp-csslint'), rev = require('gulp-rev'), minifyCss = require('gulp-minify-css'), changed = require('gulp-changed'), jshint = require('gulp-jshint'), stylish = require('jshint-stylish'), revCollector = require('gulp-rev-collector'), minifyHtml = require('gulp-minify-html'), autoprefixer = require('gulp-autoprefixer'), del = require('del'); var cssSrc = ['main.less', 'layer-box.less', 'tag.less'], cssDest = 'dist/css', jsSrc = 'src/js/*.js', jsDest = 'dist/js', fontSrc = 'src/fonts/*', fontDest = 'dist/font', imgSrc = 'src/img/*', imgDest = 'dist/img', cssRevSrc = 'src/css/revCss', condition = true; function changePath(basePath){ var nowCssSrc = []; for (var i = 0; i < cssSrc.length; i++) { nowCssSrc.push(cssRevSrc + '/' + cssSrc[i]); } return nowCssSrc; } //Fonts & Images 根據MD5獲取版本號 gulp.task('revFont', function(){ return gulp.src(fontSrc) .pipe(rev()) .pipe(gulp.dest(fontDest)) .pipe(rev.manifest()) .pipe(gulp.dest('src/rev/font')); }); gulp.task('revImg', function(){ return gulp.src(imgSrc) .pipe(rev()) .pipe(gulp.dest(imgDest)) .pipe(rev.manifest()) .pipe(gulp.dest('src/rev/img')); }); //檢測JS gulp.task('lintJs', function(){ return gulp.src(jsSrc) //.pipe(jscs()) //檢測JS風格 .pipe(jshint({ "undef": false, "unused": false })) //.pipe(jshint.reporter('default')) //錯誤默認提示 .pipe(jshint.reporter(stylish)) //高亮提示 .pipe(jshint.reporter('fail')); }); //壓縮JS/生成版本號 gulp.task('miniJs', function(){ return gulp.src(jsSrc) .pipe(gulpif( condition, uglify() )) .pipe(rev()) .pipe(gulp.dest(jsDest)) .pipe(rev.manifest()) .pipe(gulp.dest('src/rev/js')); }); //CSS裏更新引入文件版本號 gulp.task('revCollectorCss', function () { return gulp.src(['src/rev/**/*.json', 'src/css/*.less']) .pipe(revCollector()) .pipe(gulp.dest(cssRevSrc)); }); //檢測CSS gulp.task('lintCss', function(){ return gulp.src(cssSrc) .pipe(csslint()) .pipe(csslint.reporter()) .pipe(csslint.failReporter()); }); //壓縮/合併CSS/生成版本號 gulp.task('miniCss', function(){ return gulp.src(changePath(cssRevSrc)) .pipe(less()) .pipe(gulpif( condition, minifyCss({ compatibility: 'ie7' }) )) .pipe(rev()) .pipe(gulpif( condition, changed(cssDest) )) .pipe(autoprefixer({ browsers: ['last 2 versions'], cascade: false, remove: false })) .pipe(gulp.dest(cssDest)) .pipe(rev.manifest()) .pipe(gulp.dest('src/rev/css')); }); //壓縮Html/更新引入文件版本 gulp.task('miniHtml', function () { return gulp.src(['src/rev/**/*.json', 'src/*.html']) .pipe(revCollector()) .pipe(gulpif( condition, minifyHtml({ empty: true, spare: true, quotes: true }) )) .pipe(gulp.dest('dist')); }); gulp.task('delRevCss', function(){ del([cssRevSrc,cssRevSrc.replace('src/', 'dist/')]); }) //意外出錯?清除緩存文件 gulp.task('clean', function(){ del([cssRevSrc ,cssRevSrc.replace('src/', 'dist/')]); }) //開發構建 gulp.task('dev', function (done) { condition = false; runSequence( ['revFont', 'revImg'], ['lintJs'], ['revCollectorCss'], ['miniCss', 'miniJs'], ['miniHtml', 'delRevCss'], done); }); //正式構建 gulp.task('build', function (done) { runSequence( ['revFont', 'revImg'], ['lintJs'], ['revCollectorCss'], ['miniCss', 'miniJs'], ['miniHtml', 'delRevCss'], done); }); gulp.task('default', ['build']);
項目地址:https://coding.net/u/givebest/p/gulp-automatic-add-version/git