一、安裝
1)安裝nodejs
通過nodejs的npm安裝gulp,插件也可以通過npm安裝。windows系統是個.msi工具,只要一直下一步即可,軟件會自動在寫入環境變量中,這樣就能在cmd命令窗口中直接使用node或npm指令。
我上面的cmd,已經被git封裝過了,字體都變成彩色的了。安裝了這個工具后,還可以通過Git Bash打Linux的命令。git是版本控制的工具,這里也不多說了。

2)npm
npm(node package manager)nodejs的包管理器,用於node插件管理(包括安裝、卸載、管理依賴等)
gulp赫然出現在npm的首頁中。
命令提示符執行:
npm install <name> [-g] [--save-dev]
1. <name>:node插件名稱。例:npm install gulp-less --save-dev
2. -g:全局安裝。將會安裝在C:\Users\Administrator\AppData\Roaming\npm,並且寫入系統環境變量;
非全局安裝:將會安裝在當前定位目錄;
全局安裝可以通過命令行在任何地方調用它,本地安裝將安裝在定位目錄的node_modules文件夾下,通過require()調用;
3. --save:將保存配置信息至package.json(package.json是nodejs項目配置文件);
4. -dev:保存至package.json的devDependencies節點,不指定-dev將保存至dependencies節點
配置文件package.json是為了方便下載相關的包,只需要在有這個文件的文件夾下面執行“npm install”(如果安裝了cnpm就用“cnpm install”),則會根據package.json下載所有需要的包。【注:我用demo中的package文件在另外一台電腦上面直接安裝,打“gulp watch”的時候出現了很多錯誤】
3)cnpm
因為npm安裝插件是從國外服務器下載,受網絡影響大,可能出現異常。
在國內推薦使用淘寶NPM鏡像。“這是一個完整 npmjs.org 鏡像,你可以用此代替官方版本(只讀),同步頻率目前為 10分鍾 一次以保證盡量與官方服務同步”
安裝指令如下:
npm install -g cnpm --registry=https://registry.npm.taobao.org
注意安裝的時候會出現錯誤提示,你可以關閉命令窗口再打開,打入“cnpm -v”可以查看版本號。cnpm跟npm用法完全一致。

4)全局安裝gulp
cnpm install gulp -g
如果在某個工程文件夾中提示錯誤,那就手動再安裝下“gulp”:

5)新建package.json文件
在命令窗口輸入指令“cnpm init”。如果在Git Bash打這個指令,會報“No gulpfile found”的錯誤。
6)新建gulpfile.js文件
gulpfile.js是gulp項目的配置文件,里面是task的配置。簡易代碼如下:
var gulp = require('gulp'); gulp.task('default', function() { // 將你的默認的任務代碼放在這 });
7)刪除node_modules文件夾
當安裝了各種插件后,在你相應的目錄下面會出現node_modules文件夾,里面又嵌套了很深的文件夾目錄,如果你用右鍵刪除的方式,會變得很慢,並且還會提示錯誤“無法刪除”。

這里有個方法,用npm里面一個專門用於刪除的模塊插件“rimraf”。
cnpm install -g rimraf
只需要打簡單的指令就可刪除:
1 cd xxx[include node_modules folder] //用cd指令將文件目錄設置到包含nod_modules的位置 2 3 rimraf node_modules
二、插件與功能
1)全局配置config
可以將需要在gulpfile中引用的參數,放到這里,包括一些路徑,功能的開關等。例如:
module.exports = { name : '.....', devPath : '.....', //項目根路徑,根路徑下可以包含多個項目 prodPath : '....', //生產路徑根路徑 sassPath : '.....', //SASS包含文件路徑 rmHtmlWhitespace : false,//html中是否去除空格 webpackEntry : { index : 'index.js'//js合並 }, server : { port : 8088 } };
注意下這里使用了module.exports,這是nodejs的語法。在gulpfile中將會用require引用config。
//加載項目配置 var config = require('./config');
2)監控gulp.watch
這個是gulp自帶的,就是當你的文件改動了后,就做相應的task。還有一個插件gulp-watch。
監控sass中的文件變化,一有變化就做sass的編譯。“**”與“*”這種語法可以參考《Gulp:任務自動管理工具》
gulp.task('watch', function() {
livereload.listen();
gulp.watch('**.html', ['html']);
gulp.watch('./sass/*.scss', ['sass']);
gulp.watch('./css/*.css', ['css']);
gulp.watch('./js/*.js', ['js']);
});
監控了四個地方的修改,js、html、css和sass,並且有做了自動刷新livereload。這個是通過“gulp-livereload”來實現的。
firefox貨chrome要分別安裝插件才可運行。chrom插件如下:

安裝完后會在瀏覽器中出現個小按鈕,
,注意是黑色的時候才是在執行中。還有就是要在相應的task中加相應的代碼:
.pipe(livereload())
3)sass編譯與css壓縮
通過sass編寫css,能更模塊化,多人協作比較方便。安裝gulp-sass。
“plumber()”是引用了“gulp-plumber”,任務錯誤中斷自動重傳。在使用一段時間后發現,執行了“plumber()”后監控是還繼續的,但是sass就不會自動編譯了。
后面把“plumber()”去掉,添加紅色部分,這樣就不會出現不編譯的情況了。
gulp.task('sass', function() {
gulp.src('./sass/*.scss')
.pipe(plumber())
.pipe(sass().on('error', sass.logError))
.pipe(gulp.dest('./css'))
.pipe(livereload());
});
gulp-cssnano,壓縮CSS代碼。
gulp.task('css', ['sass'], function() {
//先刪除dist中的css,有時候會不更新
gulp.src('./dist/css/*.css')
.pipe(rimraf({force: true}));
gulp.src('./css/*.css')
.pipe(cssnano())
.pipe(gulp.dest('./dist/css'))
.pipe(livereload());
});
4)js壓縮與模塊化合並
使用gulp-uglify做js的壓縮。gulpRimraf()用來刪除文件夾,引用自gulp-rimraf。
gulp.task('js', function() {
//先刪除dist中的css,有時候會不更新
gulp.src('./dist/js/*.js')
.pipe(rimraf({force: true}));
gulp.src('./js/*.js')
.pipe(plumber())
.pipe(jshint())
.pipe(jshint.reporter('default'))
.pipe(uglify())
.pipe(gulp.dest('./dist/js'))
.pipe(livereload());
});
上面的jshint是用來分析代碼的,例如分號沒寫。通過打指令“gulp-jshint”。

模塊化合並使用webpack-stream,點擊查看文檔。github上面還有篇說明教程。
gulp.task('webpack', function(){
var entry = {};
for(var name in config.webpackEntry){
entry[name] = './js/' + config.webpackEntry[name];
}
//排除bundle文件
return gulp.src('./js/*[^bundle].js')
.pipe(plumber())
.pipe(webpack({
entry: entry,
output: {
filename: '[name].bundle.js',
}
}))
.pipe(gulp.dest('./js'));
});
5)image圖片無損壓縮
通過gulp-image壓縮的圖片,有時候能牙70%以上,非常給力。
gulp.task('image', function(){
gulp.src('./img/*.+(jpg|png|gif|svg)')
.pipe(imagemin())
.pipe(gulp.dest('./dist/img'));
});
6)html壓縮
經過gulp-htmlmin壓縮過的html可以縮小很多,可以看到都擠到了一起,有很多參數可以選擇,比如去除空格等。
還可以通過gulp-replace來給靜態資源文件加個版本號。
gulp.task('html', function() {
gulp.src('*.html')
.pipe(replace('__VERSION', Date.now().toString(16)))
.pipe(htmlmin({collapseWhitespace: true}))
.pipe(gulp.dest('./dist'))
.pipe(livereload());
});
7)fontmin字體壓縮
網上有很多webfont,例如國外的Font Awesome,國內的iconfont。都能做出漂亮的自定義字體。
與西文字體不同,由於字符集過大,中文字體無法享受 webfont 帶來的便利。為了讓中文字體也乘上這道風,我們需要對其進行min。使用指令“gulp-fontmin”。
gulp.task('font', function() {
gulp.src('font/*.+(eot|svg|ttf|woff)')
.pipe(fontmin({
text: '人曬'
}))
.pipe(gulp.dest('dist/font'));
});
配置的兩個字“人曬”與沒配置的“國”,明顯有區別。

8)CSS自動加瀏覽器前綴
“gulp-autoprefixer”可以自動加“-webkit”、“-moz”等的前綴,自己可以少寫很多兼容代碼。可以在上面的sass的編譯中添加一個引用。
有多個參數,點擊查看說明。“last 2 versions”是瀏覽器的過濾設置,還有多個值,可以查看這里。插件並不僅僅是加個前綴,還能編譯出舊的語法。例如flex的不同寫法。
后面又查到一個插件“autoprefixer”,用戶量非常,這是一個PostCSS插件,需要引入“gulp-postcss”。更多的PostCSS插件可以查看這里。
gulp.task('sass', function() {
gulp.src('./sass/*.scss')
.pipe(plumber())
.pipe(sass().on('error', sass.logError))
.pipe(autoprefix({ browsers: ['last 2 versions', 'Firefox < 20'],
cascade: false }))
.pipe(gulp.dest('./css'))
.pipe(livereload());
});

輸出:

9)將px自動轉換為rem
使用了一個PostCSS插件,“postcss-px2rem”。
如果不想編譯成rem單位,就在屬性后面寫“/*px*/”或“/*no*/”,這兩個值也有點不同,具體參考這里。
var postcss = require('gulp-postcss'); var px2rem = require('postcss-px2rem'); gulp.task('sass', function () { var processors = [px2rem({remUnit: 75})]; return gulp.src('./sass/*.scss') .pipe(gulpSass().on('error', gulpSass.logError)) .pipe(postcss(processors)) .pipe(gulp.dest('./css/')).pipe(livereload()); });
10)啟動一個本地調試服務器
通過gulp-connect,可以做個server。如果你用notpad++這種開發頁面,那這個指令會很有用。
gulp.task('server', function(){
var option = {
root : config.devPath,
port : config.server.port
};
if(config.server.root){
option.root = config.server.root;
}
connect.server(option);
});
上面的localhost可以改成本機的IP地址,手機與電腦在同一個網段的話,就可以直接用手機調試了。
11)node_modules目錄
node_modules目錄中的內容非常大,如果在每個工程下面都安裝,會造成很大的浪費。可以將其放在各個工程的公共父級中,而在各個目錄下面使用自己的gulpfile.js,config.js等配置文件。
例如工程都在public文件夾中,我就將node_modules放在public的平級。

demo下載地址:
http://download.csdn.net/download/loneleaf1/9416080
參考資料:
http://www.ydcss.com/archives/18 gulp詳細入門教程
http://www.runoob.com/nodejs/nodejs-npm.html NPM 使用介紹
http://javascript.ruanyifeng.com/tool/gulp.html Gulp:任務自動管理工具
http://www.ghostchina.com/module-exports-and-exports-in-node-js/ Node.js 系列之 —— module.exports 與 exports
http://segmentfault.com/a/1190000002658165?utm_source=tuicool JGulp: 利用Gulp 配置的前端項目自動化工作流
http://www.w3ctech.com/topic/935 Fontmin 快速指南
