gulp構建工具整理
gulp 是基於node 的一個構建工具 , 所謂構建工具是指通過簡單配置就可以幫我們實現合併、壓縮、校驗、預處理等一系列任務的軟體工具。常見的構建工具包括:Grunt、Gulp、Webpack 以及百度的F.I.S
下面我們來說下gulp , gulp 提供外掛的機制 ,不會產生臃腫 , 如果有需要再裝上相應的外掛就可以了。比如這個autoprefixer包,用於css自動新增字首,其實,gulp不幹什麼事情,專門指揮它的外掛幹活。官方文件
安裝
- 全域性安裝
- $ npm install -g gulp
本地安裝
- $ npm install gulp –save-dev
- 本地安裝是為了把gulp作為專案的依賴
建立gulpfile.js檔案 ,定義一個任務,簡單的示例:
// 檔案開頭,把gulp模組引入進來 , 以後在文章中的示例就不重複獲取了 var gulp = require('gulp'); gulp.task('default,function(){ // 任務程式碼 });
gulp 中常用到的外掛和使用方式
自動新增字首 autoprefixer
- 先安裝 gulp-autoprefixer 包 :
$ npm install gulp-autoprefixer –save-dev 開始使用
// 引入模組 autoprefixer
然後在bash或命令視窗中執行
$ gulp css- 這裡總結下幾個函式的意思
gulp.task() 用於構建任務,去配置我們的具體任務 gulp.src()用於獲取需要構建資源的路徑 傳遞的引數必須是個路徑,常見的配置項 {base:'./'} gulp.dest() 放置構建好的資源路徑,傳遞引數也是一個路徑 pipe() 是node中的管道,在這裡是將上一步處理的結果傳給下一步
- 先安裝 gulp-autoprefixer 包 :
合併js外掛 gulp-concat
- 安裝外掛: $ npm install gulp-concat –save-dev
使用外掛:
// 獲取模組 var concat = require('gulp-concat'); // 建立任務 gulp.task('js',function(){ /*將當前js資料夾下的所有js檔案獲取到*/ gulp.src('./js/*.js') /*合併成app.js*/ .pipe(concat('app.js')) /*輸出到dist資料夾下*/ .pipe(gulp.dest('./dist')) })
執行命令
$ gulp js
圖片壓縮外掛 gulp-imagemin
- 獲取模組
$ npm install gulp-imagemin –save-dev 使用模組
var imagemin = require('gulp-imagemin'); gulp.task('image',function(){ gulp.src('./image/*') .pipe(imagemin()) .pipe(gulp.dest('./dist')); })
執行任務
$ gulp image
- 獲取模組
壓縮html外掛 gulp-htmlmin
- 安裝模組
$ npm install gulp-htmlmin 使用模組
var htmlmin = require('gulp-htmlmin'); gulp.task('html',function(){ gulp.src('./*.html',{ "removeComments":true, "collapseWhitespace":true, "minifyJS":true }) .pipe(htmlmin()) .pipe(gulp.dest('./dist')); });
執行任務
$ gulp html
- 安裝模組
把檔名修改成hash值模組 gulp-rev
- 安裝模組
$ npm install gulp-rev –save-dev 使用模組
var rev = require('gulp-rev'); gulp.task('rev',function(){ /* 下面 ** 的方式叫做global語法,表示目錄下面的所有 */ gulp.src(['./dist/**/*.css','./dist/**/*.js','./dist/**/*'],{base:'./'}) /* 轉換成新的檔名 */ .pipe(rev()) .pipe(gulp.dest('./dist')) /*收集原檔名與新檔名的關係*/ .pipe(rev.manifest()) // 將檔案以json的形式存在當前專案下的 ./rev 目錄下 .pipe(gulp.dest('./rev')); });
執行任務
$ gulp rev
- 安裝模組
替換檔案路徑外掛 gulp-rev-collector
- 安裝模組
$ npm install gulp-rev-collector –save-dev 使用模組
var revCollector = require('gulp-rev-collector'); /* 使用這個模組,需要依賴rev任務,所以需要注入rev任務,如果不注入需要先執行rev任務 */ gulp.task('revCollector',['rev'],function(){ // 根據生成的json檔案,去替換html裡的路徑 gulp.src(['./rev/*.json','./dist/*.html']) .pipe(revCollector()) .pipe(gulp.dest('./dest')); })
執行任務
$ gulp revCollector
- 安裝模組
優化gulp 命令
從上面看到,我們每每去執行一條任務,就要執行一條命令,這樣顯然是不合理的,所以我們需要進行優化。優化的方式就是任務注入以及 return 的使用
下面是優化的程式碼:
var gulp = require('gulp');
var autoprefixer = require('gulp-autoprefixer');
var concat = require('gulp-concat');
var imagemin = require('gulp-imagemin');
var htmlmin = require('gulp-htmlmin');
var rev = require('gulp-rev');
var revCollector = require('gulp-rev-collector');
var uglify = require('gulp-uglify');
// 處理CSS
gulp.task('css', function () {
return gulp.src('./css/*.css', {base: './'})
.pipe(autoprefixer())
.pipe(gulp.dest('./dist'));
});
// 此處就不做CSS壓縮的演示了,原理相同。
// 壓縮js
gulp.task('js', function() {
return gulp.src('./js/*.js', {base: './'})
.pipe(uglify())
.pipe(gulp.dest('./dist'));
});
// 壓縮圖片
gulp.task('image', function () {
return gulp.src('./images/*', {base: './'})
.pipe(imagemin())
.pipe(gulp.dest('./dist'));
});
// 壓縮html
gulp.task('html', function () {
return gulp.src('./*.html')
.pipe(htmlmin({
removeComments: true,
collapseWhitespace: true,
minifyJS: true
}))
.pipe(gulp.dest('./dist'));
});
// 生成hash檔名
gulp.task('rev',['css', 'js', 'image', 'html'], function () {
// 其中加!字首的是表示過濾該檔案
return gulp.src(['./dist/**/*', '!**/*.html'], {base: './dist'})
.pipe(rev())
.pipe(gulp.dest('./dist'))
.pipe(rev.manifest())
.pipe(gulp.dest('./rev'));
});
// 替換檔案路徑
gulp.task('revCollector',['rev'], function () {
// 根據生成的json檔案,去替換html裡的路徑
return gulp.src(['./rev/*.json', './dist/*.html'])
.pipe(revCollector())
.pipe(gulp.dest('./dist'));
});
// gulp中預設以default為任務名稱
gulp.task('default', ['revCollector']);
執行任務 , 在命令列中,我們只需要執行 下面的命令
$ gulp
或者是
$ gulp default
就可以對 專案進行構建了。
上面只是簡單的演示了一下, 還有很多問題存在,比如 合併js的時候,使用 gulp-concat 生成的新js裡面,原來html裡面並沒有引用,還需要使用gulp-inject 來將生成的js注入到html,還有很多東西要學習。
常用外掛
Gulp-uglify
Gulp-autoprefixer
Gulp-htmlmin
Gulp-less
Gulp-livereload
Gulp-minify-css
Gulp-imagemin
Gulp-concat
gulp-rev
gulp-rev-collector
gulp-clean
gulp-inject