參考打包教程:javascript
http://www.cnblogs.com/tugenhua0707/p/4069769.htmlcss
http://www.cnblogs.com/tugenhua0707/p/4982646.htmlhtml
http://www.tuicool.com/articles/viequayjava
https://github.com/Platform-CUF/use-gulpnode
實現要點:git
一、如何運行gulp的任務,加入新建好一個以下任務:github
// 語法檢查 gulp.task('jshint', function () { gulp.src('js/**/*.js') .pipe(jshint()) .pipe(jshint.reporter('default')); });
那麼在命令行上運行:gulp jshintnpm
二、爲何安裝了全局還要安裝本地,參考這個:http://www.cnblogs.com/EasonJim/p/6207201.htmljson
三、對於npm的命令詳解,參考這個:http://www.cnblogs.com/EasonJim/p/6206179.htmlgulp
四、我使用的node.js版本爲:v7.4.0,以下所示:
如下爲我項目上的一個打包配置文件,以下:
(注意:這個沒有解決同步執行問題)
var gulp = require('gulp');//gulp主組件 var htmlmin = require('gulp-htmlmin');//html壓縮組件 var jshint = require('gulp-jshint');//js語法檢查 var concat = require('gulp-concat');//多個文件合併爲一個 var minifyCss = require('gulp-minify-css');//壓縮CSS爲一行; var uglify = require('gulp-uglify');//js文件壓縮 var del = require('del');//文件刪除 var rev = require('gulp-rev');//對文件名加MD5後綴 var revCollector = require('gulp-rev-collector');//路徑替換 var gulpRemoveHtml = require('gulp-remove-html');//標籤清除,參考:https://www.npmjs.com/package/gulp-remove-html var removeEmptyLines = require('gulp-remove-empty-lines');//清除空白行,參考:https://www.npmjs.com/package/gulp-remove-empty-lines var replace = require('gulp-replace');//文件名替換,參考:https://www.npmjs.com/package/gulp-replace var buildBasePath = 'build/';//構建輸出的目錄 // 語法檢查 gulp.task('jshint', function () { gulp.src('js/**/*.js') .pipe(jshint()) .pipe(jshint.reporter('default')); }); //刪除Build文件 gulp.task('clean:Build', function () { del([ buildBasePath+'**/*', ]); }); //複製文件夾 gulp.task('copy', function() { gulp.src('plugins/**/*') .pipe(gulp.dest(buildBasePath+'plugins')); }); gulp.task('copyimg', function() { //若是下面執行了md5資源文件img,那麼這步能夠省略 gulp.src('img/**/*') .pipe(gulp.dest(buildBasePath+'img')); }); //合併js,css文件以後壓縮代碼 //js gulp.task('minifyjs', function(){ gulp.src('js/**/*.js') .pipe(concat('build.js'))//合成到一個js .pipe(gulp.dest(buildBasePath+'js'))//輸出到js目錄 .pipe(uglify())//壓縮js到一行 .pipe(concat('build.min.js'))//壓縮後的js .pipe(gulp.dest(buildBasePath+'js'));//輸出到js目錄 }); //jsmd5,壓縮後並用md5進行命名,下面使用revCollector進行路徑替換 gulp.task('minifyjsmd5', function() { gulp.src('js/**/*.js') .pipe(concat('build.min.js'))//壓縮後的js .pipe(uglify())//壓縮js到一行 .pipe(rev())//文件名加MD5後綴 .pipe(gulp.dest(buildBasePath+'js'))//輸出到js目錄 .pipe(rev.manifest('rev-js-manifest.json'))////生成一個rev-manifest.json .pipe(gulp.dest('rev'));//將 rev-manifest.json 保存到 rev 目錄內 }); //css gulp.task('minifycss', function (){ gulp.src('css/**/*.css') .pipe(concat('build.css'))//合成到一個css .pipe(gulp.dest(buildBasePath+'css'))//輸出到css目錄 .pipe(minifyCss())//壓縮css到同樣 .pipe(concat('build.min.css'))//壓縮後的css .pipe(gulp.dest(buildBasePath+'css'));//輸出到css目錄 }); //cssmd5,壓縮後並用md5進行命名,下面使用revCollector進行路徑替換 gulp.task('minifycssmd5', function (){ gulp.src('css/**/*.css') .pipe(concat('build.min.css'))//壓縮後的css .pipe(minifyCss())//壓縮css到同樣 .pipe(rev())//文件名加MD5後綴 .pipe(gulp.dest(buildBasePath+'css'))//輸出到css目錄 .pipe(rev.manifest('rev-css-manifest.json'))//生成一個rev-manifest.json .pipe(gulp.dest('rev'));//將 rev-manifest.json 保存到 rev 目錄內 }); //imgmd5,壓縮後並用md5進行命名,下面使用revCollector進行路徑替換 gulp.task('minifyimgmd5', function (){ gulp.src(['img/**/*.jpg','img/**/*.png']) .pipe(rev())//文件名加MD5後綴 .pipe(gulp.dest(buildBasePath+'img'))//輸出到css目錄 .pipe(rev.manifest('rev-img-manifest.json'))//生成一個rev-manifest.json .pipe(gulp.dest('rev'));//將 rev-manifest.json 保存到 rev 目錄內 }); //html壓縮 gulp.task('html',function(){ var options = { removeComments: true,//清除HTML註釋 collapseWhitespace: false,//壓縮HTML collapseBooleanAttributes: true,//省略布爾屬性的值 <input checked="true"/> ==> <input /> removeEmptyAttributes: true,//刪除全部空格做屬性值 <input id="" /> ==> <input /> removeScriptTypeAttributes: true,//刪除<script>的type="text/javascript" removeStyleLinkTypeAttributes: true,//刪除<style>和<link>的type="text/css" minifyJS: true,//壓縮頁面JS minifyCSS: true//壓縮頁面CSS }; gulp.src('*.html') .pipe(gulpRemoveHtml())//清除特定標籤 .pipe(removeEmptyLines({removeComments: true}))//清除空白行 .pipe(htmlmin(options)) .pipe(gulp.dest(buildBasePath)); }); //生產使用,替換文件名,common.js替換爲build.min.js gulp.task('replacejs', function(){ gulp.src([buildBasePath+'*.html']) .pipe(replace('common.js', 'build.min.js')) .pipe(gulp.dest(buildBasePath)); }); //生產使用,替換文件名,common.css替換爲build.min.css gulp.task('replacecss', function(){ gulp.src([buildBasePath+'*.html']) .pipe(replace('common.css', 'build.min.css')) .pipe(gulp.dest(buildBasePath)); }); //開發使用,替換文件名,common.js替換爲build.js gulp.task('replacejsdev', function(){ gulp.src([buildBasePath+'*.html']) .pipe(replace('common.js', 'build.js')) .pipe(gulp.dest(buildBasePath)); }); //開發使用,替換文件名,common.css替換爲build.css gulp.task('replacecssdev', function(){ gulp.src([buildBasePath+'*.html']) .pipe(replace('common.css', 'build.css')) .pipe(gulp.dest(buildBasePath)); }); //使用rev替換成md5文件名,這裏包括html和css的資源文件也一塊兒 gulp.task('rev', function() { //html,針對js,css,img gulp.src(['rev/**/*.json', buildBasePath+'**/*.html']) .pipe(revCollector({replaceReved:true })) .pipe(gulp.dest(buildBasePath)); }); gulp.task('revimg', function() { //css,主要是針對img替換 gulp.src(['rev/**/rev-img-manifest.json', buildBasePath+'css/*.css']) .pipe(revCollector({replaceReved:true })) .pipe(gulp.dest(buildBasePath+'css')); }); //監視文件的變化,有修改時,自動調用default缺省默認任務 gulp.task('watch', function () { gulp.watch('**/*.html', ['default']); }); //缺省默認任務,輸出的js和css文件都帶參數 /*執行順序: * 一、清除編譯輸出目錄build的所有文件 * 二、複製第三方組件依賴到build文件夾 * 三、使用帶md5對js文件進行壓縮打包一個文件,命名根據gulp-rev插件md5以後的命名進行命名,如build-asdf123.min.js,並輸出到build/js文件夾 * 四、使用帶md5對cs文件進行壓縮打包一個文件,命名根據gulp-rev插件md5以後的命名進行命名,如build-asd323.min.css,並輸出到build/cs文件夾 * 五、(可選)使用帶md5對img文件夾的所有文件進行重命名,命名根據gulp-rev插件md5以後的命名進行命名,如common-asdf123.jpg,並輸出到build/img文件夾;若是這部不操做,下面第10步將不執行。 * 六、將build目錄下的所有html頁面進行壓縮處理,採用gulp-minhtml插進 * 七、因爲項目上使用了模塊開發,而後每一個頁面上都會引入common.js文件,而合併後的js文件爲build.min.js,因此使用gulp-replace插進對html頁面進行替換,並將html文件輸出到build目錄上 * 八、再次在build目錄上,將html進行common.css文件替換成build.min.css * 九、使用gulp-rev-collectorc插件對剛纔生成帶參數的js和css文件在html頁面上進行替換,如build.min.js替換成build-asdf123.min.js。仍是輸出到build目錄。 * 十、(可選)使用gulp-rev-collectorc插件對剛纔生成帶參數的img文件在css文件上進行替換,如common.jpg替換成common-asdf12.jpg。輸出到目錄 * */ gulp.task('default',['clean:Build','copy','minifyjsmd5','minifycssmd5','minifyimgmd5','html','replacejs','replacecss','rev','revimg']); //默認任務2,輸出的js和css文件不帶參數 /*執行順序: * 一、清除編譯輸出目錄build的所有文件 * 二、複製第三方組件依賴到build文件夾 * 三、對js文件進行壓縮打包一個文件,命名如build.min.js,並輸出到build/js文件夾 * 四、對cs文件進行壓縮打包一個文件,命名如build.min.css,並輸出到build/cs文件夾 * 五、將build目錄下的所有html頁面進行壓縮處理,採用gulp-minhtml插進 * 六、因爲項目上使用了模塊開發,而後每一個頁面上都會引入common.js文件,而合併後的js文件爲build.min.js,因此使用gulp-replace插進對html頁面進行替換,並將html文件輸出到build目錄上 * 七、再次在build目錄上,將html進行common.css文件替換成build.min.css * */ gulp.task('default2', ['clean:Build','copy','copyimg','minifyjs','minifycss','html','replacejs','replacecss']); //開發使用默認任務,js和css不帶參數,且不合並 /*執行順序: * 一、清除編譯輸出目錄build的所有文件 * 二、複製第三方組件依賴到build文件夾 * 三、對js文件進行壓縮打包一個文件,命名如build.js,並輸出到build/js文件夾 * 四、對cs文件進行壓縮打包一個文件,命名如build.css,並輸出到build/cs文件夾 * 五、將build目錄下的所有html頁面進行壓縮處理,採用gulp-minhtml插進 * 六、因爲項目上使用了模塊開發,而後每一個頁面上都會引入common.js文件,而合併後的js文件爲build.js,因此使用gulp-replace插進對html頁面進行替換,並將html文件輸出到build目錄上 * 七、再次在build目錄上,將html進行common.css文件替換成build.css * */ gulp.task('defaultdev', ['clean:Build','copy','copyimg','minifyjs','minifycss','html','replacejsdev','replacecssdev']);
可是很糾結的一個問題,我這樣去執行默認任務:gulp,發現沒有按順序執行。
下載將改寫上面的配置,加入同步順序執行。我收集了一些同步執行的資料,參考這個:http://www.cnblogs.com/EasonJim/p/6209725.html
如下爲我增長同步執行的方法:
var gulp = require('gulp');//gulp主組件 var htmlmin = require('gulp-htmlmin');//html壓縮組件 var jshint = require('gulp-jshint');//js語法檢查 var concat = require('gulp-concat');//多個文件合併爲一個 var minifyCss = require('gulp-minify-css');//壓縮CSS爲一行; var uglify = require('gulp-uglify');//js文件壓縮 var rev = require('gulp-rev');//對文件名加MD5後綴 var revCollector = require('gulp-rev-collector');//路徑替換 var gulpRemoveHtml = require('gulp-remove-html');//標籤清除,參考:https://www.npmjs.com/package/gulp-remove-html var removeEmptyLines = require('gulp-remove-empty-lines');//清除空白行,參考:https://www.npmjs.com/package/gulp-remove-empty-lines var replace = require('gulp-replace');//文件名替換,參考:https://www.npmjs.com/package/gulp-replace var gulpSequence = require('gulp-sequence');//同步執行,參考:https://github.com/teambition/gulp-sequence var clean = require('gulp-clean');//清除文件插件,參考:https://github.com/teambition/gulp-clean var buildBasePath = 'build/';//構建輸出的目錄 //刪除Build文件 gulp.task('clean:Build', function (cb) { return gulp.src(buildBasePath, {read: false}) .pipe(clean()); }); //複製文件夾 gulp.task('copy', function() { return gulp.src('plugins/**/*') .pipe(gulp.dest(buildBasePath+'plugins')); }); gulp.task('copyimg', function() { //若是下面執行了md5資源文件img,那麼這步能夠省略 return gulp.src('img/**/*') .pipe(gulp.dest(buildBasePath+'img')); }); //合併js,css文件以後壓縮代碼 //js gulp.task('minifyjs', function(){ return gulp.src('js/**/*.js') .pipe(concat('build.js'))//合成到一個js .pipe(gulp.dest(buildBasePath+'js'))//輸出到js目錄 .pipe(uglify())//壓縮js到一行 .pipe(concat('build.min.js'))//壓縮後的js .pipe(gulp.dest(buildBasePath+'js'));//輸出到js目錄 }); //jsmd5,壓縮後並用md5進行命名,下面使用revCollector進行路徑替換 gulp.task('minifyjsmd5', function() { return gulp.src('js/**/*.js') .pipe(concat('build.min.js'))//壓縮後的js .pipe(uglify())//壓縮js到一行 .pipe(rev())//文件名加MD5後綴 .pipe(gulp.dest(buildBasePath+'js'))//輸出到js目錄 .pipe(rev.manifest('rev-js-manifest.json'))////生成一個rev-manifest.json .pipe(gulp.dest('rev'));//將 rev-manifest.json 保存到 rev 目錄內 }); //css gulp.task('minifycss', function (){ return gulp.src('css/**/*.css') .pipe(concat('build.css'))//合成到一個css .pipe(gulp.dest(buildBasePath+'css'))//輸出到css目錄 .pipe(minifyCss())//壓縮css到同樣 .pipe(concat('build.min.css'))//壓縮後的css .pipe(gulp.dest(buildBasePath+'css'));//輸出到css目錄 }); //cssmd5,壓縮後並用md5進行命名,下面使用revCollector進行路徑替換 gulp.task('minifycssmd5', function (){ return gulp.src('css/**/*.css') .pipe(concat('build.min.css'))//壓縮後的css .pipe(minifyCss())//壓縮css到同樣 .pipe(rev())//文件名加MD5後綴 .pipe(gulp.dest(buildBasePath+'css'))//輸出到css目錄 .pipe(rev.manifest('rev-css-manifest.json'))//生成一個rev-manifest.json .pipe(gulp.dest('rev'));//將 rev-manifest.json 保存到 rev 目錄內 }); //imgmd5,壓縮後並用md5進行命名,下面使用revCollector進行路徑替換 gulp.task('minifyimgmd5', function (){ return gulp.src(['img/**/*.jpg','img/**/*.png','img/**/*.gif']) .pipe(rev())//文件名加MD5後綴 .pipe(gulp.dest(buildBasePath+'img'))//輸出到css目錄 .pipe(rev.manifest('rev-img-manifest.json'))//生成一個rev-manifest.json .pipe(gulp.dest('rev'));//將 rev-manifest.json 保存到 rev 目錄內 }); //html壓縮 gulp.task('html',function(){ var options = { removeComments: true,//清除HTML註釋 collapseWhitespace: false,//壓縮HTML collapseBooleanAttributes: true,//省略布爾屬性的值 <input checked="true"/> ==> <input /> removeEmptyAttributes: true,//刪除全部空格做屬性值 <input id="" /> ==> <input /> removeScriptTypeAttributes: true,//刪除<script>的type="text/javascript" removeStyleLinkTypeAttributes: true,//刪除<style>和<link>的type="text/css" minifyJS: true,//壓縮頁面JS minifyCSS: true//壓縮頁面CSS }; return gulp.src('*.html') .pipe(gulpRemoveHtml())//清除特定標籤 .pipe(removeEmptyLines({removeComments: true}))//清除空白行 .pipe(htmlmin(options)) .pipe(gulp.dest(buildBasePath)); }); //生產使用,替換文件名,common.js替換爲build.min.js gulp.task('replacejs', function(){ return gulp.src([buildBasePath+'*.html']) .pipe(replace('common.js', 'build.min.js')) .pipe(gulp.dest(buildBasePath)); }); //生產使用,替換文件名,common.css替換爲build.min.css gulp.task('replacecss', function(){ return gulp.src([buildBasePath+'*.html']) .pipe(replace('common.css', 'build.min.css')) .pipe(gulp.dest(buildBasePath)); }); //開發使用,替換文件名,common.js替換爲build.js gulp.task('replacejsdev', function(){ return gulp.src([buildBasePath+'*.html']) .pipe(replace('common.js', 'build.js')) .pipe(gulp.dest(buildBasePath)); }); //開發使用,替換文件名,common.css替換爲build.css gulp.task('replacecssdev', function(){ return gulp.src([buildBasePath+'*.html']) .pipe(replace('common.css', 'build.css')) .pipe(gulp.dest(buildBasePath)); }); //使用rev替換成md5文件名,這裏包括html和css的資源文件也一塊兒 gulp.task('rev', function() { //html,針對js,css,img return gulp.src(['rev/**/*.json', buildBasePath+'**/*.html']) .pipe(revCollector({replaceReved:true })) .pipe(gulp.dest(buildBasePath)); }); gulp.task('revimg', function() { //css,主要是針對img替換 return gulp.src(['rev/**/rev-img-manifest.json', buildBasePath+'css/*.css']) .pipe(revCollector({replaceReved:true })) .pipe(gulp.dest(buildBasePath+'css')); }); //監視文件的變化,有修改時,自動調用default缺省默認任務 gulp.task('watch', function () { gulp.watch('**/*.html', ['default']); }); //缺省默認任務,輸出的js和css文件都帶參數 /*執行順序: * 一、清除編譯輸出目錄build的所有文件 * 二、複製第三方組件依賴到build文件夾 * 三、使用帶md5對js文件進行壓縮打包一個文件,命名根據gulp-rev插件md5以後的命名進行命名,如build-asdf123.min.js,並輸出到build/js文件夾 * 四、使用帶md5對cs文件進行壓縮打包一個文件,命名根據gulp-rev插件md5以後的命名進行命名,如build-asd323.min.css,並輸出到build/cs文件夾 * 五、(可選)使用帶md5對img文件夾的所有文件進行重命名,命名根據gulp-rev插件md5以後的命名進行命名,如common-asdf123.jpg,並輸出到build/img文件夾;若是這部不操做,下面第10步將不執行。 * 六、將build目錄下的所有html頁面進行壓縮處理,採用gulp-minhtml插進 * 七、因爲項目上使用了模塊開發,而後每一個頁面上都會引入common.js文件,而合併後的js文件爲build.min.js,因此使用gulp-replace插進對html頁面進行替換,並將html文件輸出到build目錄上 * 八、再次在build目錄上,將html進行common.css文件替換成build.min.css * 九、使用gulp-rev-collectorc插件對剛纔生成帶參數的js和css文件在html頁面上進行替換,如build.min.js替換成build-asdf123.min.js。仍是輸出到build目錄。 * 十、(可選)使用gulp-rev-collectorc插件對剛纔生成帶參數的img文件在css文件上進行替換,如common.jpg替換成common-asdf12.jpg。輸出到目錄 * */ gulp.task('default',gulpSequence('clean:Build','copy','minifyjsmd5','minifycssmd5','minifyimgmd5','html','replacejs','replacecss','rev','revimg')); //默認任務2,輸出的js和css文件不帶參數 /*執行順序: * 一、清除編譯輸出目錄build的所有文件 * 二、複製第三方組件依賴到build文件夾 * 三、對js文件進行壓縮打包一個文件,命名如build.min.js,並輸出到build/js文件夾 * 四、對cs文件進行壓縮打包一個文件,命名如build.min.css,並輸出到build/cs文件夾 * 五、將build目錄下的所有html頁面進行壓縮處理,採用gulp-minhtml插進 * 六、因爲項目上使用了模塊開發,而後每一個頁面上都會引入common.js文件,而合併後的js文件爲build.min.js,因此使用gulp-replace插進對html頁面進行替換,並將html文件輸出到build目錄上 * 七、再次在build目錄上,將html進行common.css文件替換成build.min.css * */ gulp.task('default2', gulpSequence('clean:Build','copy','copyimg','minifyjs','minifycss','html','replacejs','replacecss')); //開發使用默認任務,js和css不帶參數,且不合並 /*執行順序: * 一、清除編譯輸出目錄build的所有文件 * 二、複製第三方組件依賴到build文件夾 * 三、對js文件進行壓縮打包一個文件,命名如build.js,並輸出到build/js文件夾 * 四、對cs文件進行壓縮打包一個文件,命名如build.css,並輸出到build/cs文件夾 * 五、將build目錄下的所有html頁面進行壓縮處理,採用gulp-minhtml插進 * 六、因爲項目上使用了模塊開發,而後每一個頁面上都會引入common.js文件,而合併後的js文件爲build.js,因此使用gulp-replace插進對html頁面進行替換,並將html文件輸出到build目錄上 * 七、再次在build目錄上,將html進行common.css文件替換成build.css * */ gulp.task('defaultdev', gulpSequence('clean:Build','copy','copyimg','minifyjs','minifycss','html','replacejsdev','replacecssdev'));
同步任務使用了gulp-sequence插件,其中del插件去除,這個不管如何都是異步的stream,因此替換成了gulp-clean插件。
最後,我發現插件html標籤這個插件也是須要用到的,好比像上面我不替換common.js,直接add一個編譯後的標籤時,使用這個插件:https://www.npmjs.com/package/gulp-inject
而後好像一些近乎完美,但是一個隱含的問題沒有測試出,就是watch,當你運行watch時,會出現順序執行的錯誤: Error: The thunkFunction already filled,其實這個錯誤是用了gulp-sequence插件致使的,解決辦法參考:https://github.com/teambition/gulp-sequence/issues/2,原理就是加入callback回調。更新後的js文件以下:
var gulp = require('gulp');//gulp主組件 var htmlmin = require('gulp-htmlmin');//html壓縮組件 var jshint = require('gulp-jshint');//js語法檢查 var concat = require('gulp-concat');//多個文件合併爲一個 var minifyCss = require('gulp-minify-css');//壓縮CSS爲一行; var uglify = require('gulp-uglify');//js文件壓縮 var rev = require('gulp-rev');//對文件名加MD5後綴 var revCollector = require('gulp-rev-collector');//路徑替換 var gulpRemoveHtml = require('gulp-remove-html');//標籤清除,參考:https://www.npmjs.com/package/gulp-remove-html var removeEmptyLines = require('gulp-remove-empty-lines');//清除空白行,參考:https://www.npmjs.com/package/gulp-remove-empty-lines var replace = require('gulp-replace');//文件名替換,參考:https://www.npmjs.com/package/gulp-replace var gulpSequence = require('gulp-sequence');//同步執行,參考:https://github.com/teambition/gulp-sequence var clean = require('gulp-clean');//清除文件插件,參考:https://github.com/teambition/gulp-clean var buildBasePath = 'build/';//構建輸出的目錄 //刪除Build文件 gulp.task('clean:Build', function (cb) { return gulp.src(buildBasePath, {read: false}) .pipe(clean()); }); //複製文件夾 gulp.task('copy', function() { return gulp.src('plugins/**/*') .pipe(gulp.dest(buildBasePath+'plugins')); }); gulp.task('copyimg', function() { //若是下面執行了md5資源文件img,那麼這步能夠省略 return gulp.src('img/**/*') .pipe(gulp.dest(buildBasePath+'img')); }); //合併js,css文件以後壓縮代碼 //js gulp.task('minifyjs', function(){ return gulp.src('js/**/*.js') .pipe(concat('build.js'))//合成到一個js .pipe(gulp.dest(buildBasePath+'js'))//輸出到js目錄 .pipe(uglify())//壓縮js到一行 .pipe(concat('build.min.js'))//壓縮後的js .pipe(gulp.dest(buildBasePath+'js'));//輸出到js目錄 }); //jsmd5,壓縮後並用md5進行命名,下面使用revCollector進行路徑替換 gulp.task('minifyjsmd5', function() { return gulp.src('js/**/*.js') .pipe(concat('build.min.js'))//壓縮後的js .pipe(uglify())//壓縮js到一行 .pipe(rev())//文件名加MD5後綴 .pipe(gulp.dest(buildBasePath+'js'))//輸出到js目錄 .pipe(rev.manifest('rev-js-manifest.json'))////生成一個rev-manifest.json .pipe(gulp.dest('rev'));//將 rev-manifest.json 保存到 rev 目錄內 }); //css gulp.task('minifycss', function (){ return gulp.src('css/**/*.css') .pipe(concat('build.css'))//合成到一個css .pipe(gulp.dest(buildBasePath+'css'))//輸出到css目錄 .pipe(minifyCss())//壓縮css到同樣 .pipe(concat('build.min.css'))//壓縮後的css .pipe(gulp.dest(buildBasePath+'css'));//輸出到css目錄 }); //cssmd5,壓縮後並用md5進行命名,下面使用revCollector進行路徑替換 gulp.task('minifycssmd5', function (){ return gulp.src('css/**/*.css') .pipe(concat('build.min.css'))//壓縮後的css .pipe(minifyCss())//壓縮css到同樣 .pipe(rev())//文件名加MD5後綴 .pipe(gulp.dest(buildBasePath+'css'))//輸出到css目錄 .pipe(rev.manifest('rev-css-manifest.json'))//生成一個rev-manifest.json .pipe(gulp.dest('rev'));//將 rev-manifest.json 保存到 rev 目錄內 }); //imgmd5,壓縮後並用md5進行命名,下面使用revCollector進行路徑替換 gulp.task('minifyimgmd5', function (){ return gulp.src(['img/**/*.jpg','img/**/*.png','img/**/*.gif']) .pipe(rev())//文件名加MD5後綴 .pipe(gulp.dest(buildBasePath+'img'))//輸出到css目錄 .pipe(rev.manifest('rev-img-manifest.json'))//生成一個rev-manifest.json .pipe(gulp.dest('rev'));//將 rev-manifest.json 保存到 rev 目錄內 }); //html壓縮 gulp.task('html',function(){ var options = { removeComments: true,//清除HTML註釋 collapseWhitespace: false,//壓縮HTML collapseBooleanAttributes: true,//省略布爾屬性的值 <input checked="true"/> ==> <input /> removeEmptyAttributes: true,//刪除全部空格做屬性值 <input id="" /> ==> <input /> removeScriptTypeAttributes: true,//刪除<script>的type="text/javascript" removeStyleLinkTypeAttributes: true,//刪除<style>和<link>的type="text/css" minifyJS: true,//壓縮頁面JS minifyCSS: true//壓縮頁面CSS }; return gulp.src('*.html') .pipe(gulpRemoveHtml())//清除特定標籤 .pipe(removeEmptyLines({removeComments: true}))//清除空白行 .pipe(htmlmin(options)) .pipe(gulp.dest(buildBasePath)); }); //生產使用,替換文件名,common.js替換爲build.min.js gulp.task('replacejs', function(){ return gulp.src([buildBasePath+'*.html']) .pipe(replace('common.js', 'build.min.js')) .pipe(gulp.dest(buildBasePath)); }); //生產使用,替換文件名,common.css替換爲build.min.css gulp.task('replacecss', function(){ return gulp.src([buildBasePath+'*.html']) .pipe(replace('common.css', 'build.min.css')) .pipe(gulp.dest(buildBasePath)); }); //開發使用,替換文件名,common.js替換爲build.js gulp.task('replacejsdev', function(){ return gulp.src([buildBasePath+'*.html']) .pipe(replace('common.js', 'build.js')) .pipe(gulp.dest(buildBasePath)); }); //開發使用,替換文件名,common.css替換爲build.css gulp.task('replacecssdev', function(){ return gulp.src([buildBasePath+'*.html']) .pipe(replace('common.css', 'build.css')) .pipe(gulp.dest(buildBasePath)); }); //使用rev替換成md5文件名,這裏包括html和css的資源文件也一塊兒 gulp.task('rev', function() { //html,針對js,css,img return gulp.src(['rev/**/*.json', buildBasePath+'**/*.html']) .pipe(revCollector({replaceReved:true })) .pipe(gulp.dest(buildBasePath)); }); gulp.task('revimg', function() { //css,主要是針對img替換 return gulp.src(['rev/**/rev-img-manifest.json', buildBasePath+'css/*.css']) .pipe(revCollector({replaceReved:true })) .pipe(gulp.dest(buildBasePath+'css')); }); //監視文件的變化,有修改時,自動調用default缺省默認任務 gulp.task('watch', function () { gulp.watch('**/*.html', ['default']); }); //監視文件的變化,有修改時,自動調用default2缺省默認任務 gulp.task('watch2', function () { gulp.watch('**/*.html', ['default2']); }); //監視文件的變化,有修改時,自動調用defaultdev缺省默認任務 gulp.task('watchdev', function () { gulp.watch('**/*.html', ['defaultdev']); }); //缺省默認任務,輸出的js和css文件都帶參數 /*執行順序: * 一、清除編譯輸出目錄build的所有文件 * 二、複製第三方組件依賴到build文件夾 * 三、使用帶md5對js文件進行壓縮打包一個文件,命名根據gulp-rev插件md5以後的命名進行命名,如build-asdf123.min.js,並輸出到build/js文件夾 * 四、使用帶md5對cs文件進行壓縮打包一個文件,命名根據gulp-rev插件md5以後的命名進行命名,如build-asd323.min.css,並輸出到build/cs文件夾 * 五、(可選)使用帶md5對img文件夾的所有文件進行重命名,命名根據gulp-rev插件md5以後的命名進行命名,如common-asdf123.jpg,並輸出到build/img文件夾;若是這部不操做,下面第10步將不執行。 * 六、將build目錄下的所有html頁面進行壓縮處理,採用gulp-minhtml插進 * 七、因爲項目上使用了模塊開發,而後每一個頁面上都會引入common.js文件,而合併後的js文件爲build.min.js,因此使用gulp-replace插進對html頁面進行替換,並將html文件輸出到build目錄上 * 八、再次在build目錄上,將html進行common.css文件替換成build.min.css * 九、使用gulp-rev-collectorc插件對剛纔生成帶參數的js和css文件在html頁面上進行替換,如build.min.js替換成build-asdf123.min.js。仍是輸出到build目錄。 * 十、(可選)使用gulp-rev-collectorc插件對剛纔生成帶參數的img文件在css文件上進行替換,如common.jpg替換成common-asdf12.jpg。輸出到目錄 * */ gulp.task('default',function(cb){gulpSequence('clean:Build','copy','minifyjsmd5','minifycssmd5','minifyimgmd5','html','replacejs','replacecss','rev','revimg')(cb);}); //默認任務2,輸出的js和css文件不帶參數 /*執行順序: * 一、清除編譯輸出目錄build的所有文件 * 二、複製第三方組件依賴到build文件夾 * 三、對js文件進行壓縮打包一個文件,命名如build.min.js,並輸出到build/js文件夾 * 四、對cs文件進行壓縮打包一個文件,命名如build.min.css,並輸出到build/cs文件夾 * 五、將build目錄下的所有html頁面進行壓縮處理,採用gulp-minhtml插進 * 六、因爲項目上使用了模塊開發,而後每一個頁面上都會引入common.js文件,而合併後的js文件爲build.min.js,因此使用gulp-replace插進對html頁面進行替換,並將html文件輸出到build目錄上 * 七、再次在build目錄上,將html進行common.css文件替換成build.min.css * */ gulp.task('default2',function(cb){gulpSequence('clean:Build','copy','copyimg','minifyjs','minifycss','html','replacejs','replacecss')(cb);}); //開發使用默認任務,js和css不帶參數,且不合並 /*執行順序: * 一、清除編譯輸出目錄build的所有文件 * 二、複製第三方組件依賴到build文件夾 * 三、對js文件進行壓縮打包一個文件,命名如build.js,並輸出到build/js文件夾 * 四、對cs文件進行壓縮打包一個文件,命名如build.css,並輸出到build/cs文件夾 * 五、將build目錄下的所有html頁面進行壓縮處理,採用gulp-minhtml插進 * 六、因爲項目上使用了模塊開發,而後每一個頁面上都會引入common.js文件,而合併後的js文件爲build.js,因此使用gulp-replace插進對html頁面進行替換,並將html文件輸出到build目錄上 * 七、再次在build目錄上,將html進行common.css文件替換成build.css * */ gulp.task('defaultdev',function(cb){gulpSequence('clean:Build','copy','copyimg','minifyjs','minifycss','html','replacejsdev','replacecssdev')(cb);});
最後附上package.json文件:
{ "name": "test", "version": "1.0.0", "description": "test", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "jim", "license": "MIT", "devDependencies": { "del": "^2.2.2", "gulp": "^3.9.1", "gulp-awaitable-tasks": "^1.0.0", "gulp-clean": "^0.3.2", "gulp-concat": "^2.6.1", "gulp-htmlmin": "^3.0.0", "gulp-jshint": "^2.0.4", "gulp-minify-css": "^1.2.4", "gulp-order": "^1.1.1", "gulp-remove-empty-lines": "0.0.8", "gulp-remove-html": "^1.3.0", "gulp-rename": "^1.2.2", "gulp-replace": "^0.5.4", "gulp-rev": "^7.1.2", "gulp-rev-collector": "^1.0.5", "gulp-sequence": "^0.4.6", "gulp-sync": "^0.1.4", "gulp-sync-task": "^1.0.3", "gulp-uglify": "^2.0.0", "jshint": "^2.9.4", "run-sequence": "^1.2.2" } }