20分鐘上手gulp

<pre>

流程

1. 輸入命令(可以使用git bash或者命令控制臺(tái)cmd) npm install -g gulp

  • 安裝全局gulp命令

2. 創(chuàng)建一個(gè)項(xiàng)目文件夾, 當(dāng)前項(xiàng)目文件夾下輸入命令npm init

當(dāng)前項(xiàng)目文件夾下輸入命令npm install gulp --save-dev

全局安裝gulp后鳞尔,還需要在每個(gè)要使用gulp的項(xiàng)目中都單獨(dú)安裝一次

開(kāi)始使用gulp

其實(shí), gulp的使用比webpack要簡(jiǎn)單很多.

配置gulpflie.js文件

在當(dāng)前項(xiàng)目文件下創(chuàng)建文件名為gulpfile.js文件, 作為該項(xiàng)目配置文件.

//gulpfile.js

var gulp = require('gulp');
gulp.task('default',function(){
    console.log('hello world');
});

其實(shí)在項(xiàng)目文件夾下輸入命令gulp時(shí), 就是觸發(fā)這個(gè)default任務(wù), 因此, 我們定義多個(gè)自定義事件, 這樣在輸入gulp時(shí), 就可以直接將我們寫(xiě)的命令也一起觸發(fā).
</pre>
gulp API
gulp.src(globs[, options])
globs參數(shù)是文件匹配模式(類似正則表達(dá)式)嬉橙,用來(lái)匹配文件路徑(包括文件名),當(dāng)然這里也可以直接指定某個(gè)具體的文件路徑寥假。當(dāng)有多個(gè)匹配模式時(shí)市框,該參數(shù)可以為一個(gè)數(shù)組。
options為可選參數(shù)糕韧。通常情況下我們不需要用到枫振。

下面我們重點(diǎn)說(shuō)說(shuō)Gulp用到的glob的匹配規(guī)則以及一些文件匹配技巧。
名稱 說(shuō)明

  • 匹配文件路徑中的0個(gè)或多個(gè)字符萤彩,但不會(huì)匹配路徑分隔符粪滤,除非路徑分隔符出現(xiàn)在末尾
    ** 匹配路徑中的0個(gè)或多個(gè)目錄及其子目錄,需要單獨(dú)出現(xiàn),即它左右不能有其他東西了雀扶。如果出現(xiàn)在末尾额衙,也能匹配文件。
    ? 匹配文件路徑中的一個(gè)字符(不會(huì)匹配路徑分隔符)
    [...] 匹配方括號(hào)中出現(xiàn)的字符中的任意一個(gè)怕吴,當(dāng)方括號(hào)中第一個(gè)字符為^或!時(shí),則表示不匹配方括號(hào)中出現(xiàn)的其他字符中的任意一個(gè)县踢,類似js正則表達(dá)式中的用法
    !(pattern|pattern|pattern) 匹配任何與括號(hào)中給定的任一模式都不匹配的
    ?(pattern|pattern|pattern) 匹配括號(hào)中給定的任一模式0次或1次转绷,類似于js正則中的(pattern|pattern|pattern)?
    +(pattern|pattern|pattern) 匹配括號(hào)中給定的任一模式至少1次,類似于js正則中的(pattern|pattern|pattern)+
    (pattern|pattern|pattern) 匹配括號(hào)中給定的任一模式0次或多次硼啤,類似于js正則中的(pattern|pattern|pattern)
    @(pattern|pattern|pattern) 匹配括號(hào)中給定的任一模式1次议经,類似于js正則中的(pattern|pattern|pattern)
    例子:

//轉(zhuǎn)換html文件
gulp.task('html', function(){
gulp.src('./src/index.html')
.pipe(connect.reload())
.pipe(gulp.dest('./dist'));//寫(xiě)入命令
});
當(dāng)有多種匹配模式時(shí)可以使用數(shù)組

//使用數(shù)組的方式來(lái)匹配多種文件
gulp.src(['js/.js','css/.css','*.html'])
使用數(shù)組的方式還有一個(gè)好處就是可以很方便的使用排除模式,在數(shù)組中的單個(gè)匹配模式前加上!即是排除模式谴返,它會(huì)在匹配的結(jié)果中排除這個(gè)匹配煞肾,要注意一點(diǎn)的是不能在數(shù)組中的第一個(gè)元素中使用排除模式

gulp.src([.js,'!b.js']) //匹配所有js文件,但排除掉以b開(kāi)頭的js文件
gulp.src(['!b.js',.js]) //不會(huì)排除任何文件嗓袱,因?yàn)榕懦J讲荒艹霈F(xiàn)在
數(shù)組的第一個(gè)元素中
此外籍救,還可以使用展開(kāi)模式。展開(kāi)模式以花括號(hào)作為定界符渠抹,根據(jù)它里面的內(nèi)容蝙昙,會(huì)展開(kāi)為多個(gè)模式,最后匹配的結(jié)果為所有展開(kāi)的模式相加起來(lái)得到的結(jié)果梧却。展開(kāi)的例子如下:

a{b,c}d 會(huì)展開(kāi)為 abd,acd
a{b,}c 會(huì)展開(kāi)為 abc,ac
a{0..3}d 會(huì)展開(kāi)為 a0d,a1d,a2d,a3d
a{b,c{d,e}f}g 會(huì)展開(kāi)為 abg,acdfg,acefg
a{b,c}d{e,f}g 會(huì)展開(kāi)為 abdeg,acdeg,abdeg,abdfg
gulp.dest(path[,options])
gulp.dest()方法是用來(lái)寫(xiě)文件的
path為寫(xiě)入文件的路徑
options為一個(gè)可選的參數(shù)對(duì)象奇颠,通常我們不需要用到

要想使用好gulp.dest()這個(gè)方法,就要理解給它傳入的路徑參數(shù)與最終生成的文件的關(guān)系放航。

gulp的使用流程一般是這樣子的:首先通過(guò)gulp.src()方法獲取到我們想要處理的文件流烈拒,然后把文件流通過(guò)pipe方法導(dǎo)入到gulp的插件中,最后把經(jīng)過(guò)插件處理后的流再通過(guò)pipe方法導(dǎo)入到gulp.dest()中,gulp.dest()方法則把流中的內(nèi)容寫(xiě)入到文件中荆几,這里首先需要弄清楚的一點(diǎn)是吓妆,我們給gulp.dest()傳入的路徑參數(shù),只能用來(lái)指定要生成的文件的目錄伴郁,而不能指定生成文件的文件名耿战,它生成文件的文件名使用的是導(dǎo)入到它的文件流自身的文件名,所以生成的文件名是由導(dǎo)入到它的文件流決定的焊傅,即使我們給它傳入一個(gè)帶有文件名的路徑參數(shù)剂陡,然后它也會(huì)把這個(gè)文件名當(dāng)做是目錄名,例如:

var gulp = require('gulp');
gulp.src('script/jquery.js')
.pipe(gulp.dest('dist/foo.js'));
//最終生成的文件路徑為 dist/foo.js/jquery.js,而不是dist/foo.js
要想改變文件名狐胎,可以使用插件gulp-rename
下面說(shuō)說(shuō)生成的文件路徑與我們給gulp.dest()方法傳入的路徑參數(shù)之間的關(guān)系鸭栖。
gulp.dest(path)生成的文件路徑是我們傳入的path參數(shù)后面再加上gulp.src()中有通配符開(kāi)始出現(xiàn)的那部分路徑。例如:

var gulp = reruire('gulp');
//有通配符開(kāi)始出現(xiàn)的那部分路徑為 /.js
gulp.src('script/
/.js')
.pipe(gulp.dest('dist')); //最后生成的文件路徑為 dist/*/.js
//如果 */.js 匹配到的文件為 jquery/jquery.js ,則生成的文件路徑為 dist/jquery/jquery.js
再舉更多一點(diǎn)的例子

gulp.src('script/avalon/avalon.js') //沒(méi)有通配符出現(xiàn)的情況
.pipe(gulp.dest('dist')); //最后生成的文件路徑為 dist/avalon.js

//有通配符開(kāi)始出現(xiàn)的那部分路徑為 /underscore.js
gulp.src('script/
/underscore.js')
//假設(shè)匹配到的文件為script/util/underscore.js
.pipe(gulp.dest('dist')); //則最后生成的文件路徑為 dist/util/underscore.js

gulp.src('script/*') //有通配符出現(xiàn)的那部分路徑為 *
//假設(shè)匹配到的文件為script/zepto.js
.pipe(gulp.dest('dist')); //則最后生成的文件路徑為 dist/zepto.js
通過(guò)指定gulp.src()方法配置參數(shù)中的base屬性握巢,我們可以更靈活的來(lái)改變gulp.dest()生成的文件路徑晕鹊。
當(dāng)我們沒(méi)有在gulp.src()方法中配置base屬性時(shí),base的默認(rèn)值為通配符開(kāi)始出現(xiàn)之前那部分路徑暴浦,例如:

gulp.src('app/src/*/.css') //此時(shí)base的值為 app/src
上面我們說(shuō)的gulp.dest()所生成的文件路徑的規(guī)則溅话,其實(shí)也可以理解成,用我們給gulp.dest()傳入的路徑替換掉gulp.src()中的base路徑歌焦,最終得到生成文件的路徑飞几。

gulp.src('app/src/*/.css') //此時(shí)base的值為app/src,也就是說(shuō)它的base路徑為app/src
//設(shè)該模式匹配到了文件 app/src/css/normal.css
.pipe(gulp.dest('dist')) //用dist替換掉base路徑,最終得到 dist/css/normal.css
所以改變base路徑后独撇,gulp.dest()生成的文件路徑也會(huì)改變

gulp.src(script/lib/*.js) //沒(méi)有配置base參數(shù)屑墨,此時(shí)默認(rèn)的base路徑為script/lib
//假設(shè)匹配到的文件為script/lib/jquery.js
.pipe(gulp.dest('build')) //生成的文件路徑為 build/jquery.js

gulp.src(script/lib/*.js, {base:'script'}) //配置了base參數(shù),此時(shí)base路徑為script
//假設(shè)匹配到的文件為script/lib/jquery.js
.pipe(gulp.dest('build')) //此時(shí)生成的文件路徑為 build/lib/jquery.js
用gulp.dest()把文件流寫(xiě)入文件后纷铣,文件流仍然可以繼續(xù)使用卵史。
gulp.task(name[, deps], fn)
gulp.task方法用來(lái)定義任務(wù),內(nèi)部使用的是Orchestrator

name 為任務(wù)名
deps 是當(dāng)前定義的任務(wù)需要依賴的其他任務(wù)搜立,為一個(gè)數(shù)組以躯。當(dāng)前定義的任務(wù)會(huì)在所有依賴的任務(wù)執(zhí)行完畢后才開(kāi)始執(zhí)行。如果沒(méi)有依賴啄踊,則可省略這個(gè)參數(shù)
fn 為任務(wù)函數(shù)寸潦,我們把任務(wù)要執(zhí)行的代碼都寫(xiě)在里面。該參數(shù)也是可選的社痛。

gulp.task('mytask', ['array', 'of', 'task', 'names'], function() { //定義一個(gè)有依賴的任務(wù)
// Do something
});
gulp.task()這個(gè)API沒(méi)什么好講的见转,但需要知道執(zhí)行多個(gè)任務(wù)時(shí)怎么來(lái)控制任務(wù)執(zhí)行的順序。
gulp中執(zhí)行多個(gè)任務(wù)蒜哀,可以通過(guò)任務(wù)依賴來(lái)實(shí)現(xiàn)斩箫。例如我想要執(zhí)行one,two,three這三個(gè)任務(wù)吏砂,那我們就可以定義一個(gè)空的任務(wù),然后把那三個(gè)任務(wù)當(dāng)做這個(gè)空的任務(wù)的依賴就行了:

//只要執(zhí)行default任務(wù)乘客,就相當(dāng)于把one,two,three這三個(gè)任務(wù)執(zhí)行了
gulp.task('default',['one','two','three']);
如果任務(wù)相互之間沒(méi)有依賴狐血,任務(wù)會(huì)按你書(shū)寫(xiě)的順序來(lái)執(zhí)行,如果有依賴的話則會(huì)先執(zhí)行依賴的任務(wù)易核。
但是如果某個(gè)任務(wù)所依賴的任務(wù)是異步的匈织,就要注意了,gulp并不會(huì)等待那個(gè)所依賴的異步任務(wù)完成牡直,而是會(huì)接著執(zhí)行后續(xù)的任務(wù)缀匕。例如:

gulp.task('one',function(){
//one是一個(gè)異步執(zhí)行的任務(wù)
setTimeout(function(){
console.log('one is done')
},5000);
});

//two任務(wù)雖然依賴于one任務(wù),但并不會(huì)等到one任務(wù)中的異步操作完成后再執(zhí)行
gulp.task('two',['one'],function(){
console.log('two is done');
});
上面的例子中我們執(zhí)行two任務(wù)時(shí),會(huì)先執(zhí)行one任務(wù)碰逸,但不會(huì)去等待one任務(wù)中的異步操作完成后再執(zhí)行two任務(wù)乡小,而是緊接著執(zhí)行two任務(wù)。所以two任務(wù)會(huì)在one任務(wù)中的異步操作完成之前就執(zhí)行了饵史。

那如果我們想等待異步任務(wù)中的異步操作完成后再執(zhí)行后續(xù)的任務(wù)满钟,該怎么做呢?
有三種方法可以實(shí)現(xiàn):
第一:在異步操作完成后執(zhí)行一個(gè)回調(diào)函數(shù)來(lái)通知gulp這個(gè)異步任務(wù)已經(jīng)完成,這個(gè)回調(diào)函數(shù)就是任務(wù)函數(shù)的第一個(gè)參數(shù)胳喷。

gulp.task('one',function(cb){ //cb為任務(wù)函數(shù)提供的回調(diào)湃番,用來(lái)通知任務(wù)已經(jīng)完成
//one是一個(gè)異步執(zhí)行的任務(wù)
setTimeout(function(){
console.log('one is done');
cb(); //執(zhí)行回調(diào),表示這個(gè)異步任務(wù)已經(jīng)完成
},5000);
});

//這時(shí)two任務(wù)會(huì)在one任務(wù)中的異步操作完成后再執(zhí)行
gulp.task('two',['one'],function(){
console.log('two is done');
});
第二:定義任務(wù)時(shí)返回一個(gè)流對(duì)象吭露。適用于任務(wù)就是操作gulp.src獲取到的流的情況吠撮。

gulp.task('one',function(cb){
var stream = gulp.src('client/*/.js')
.pipe(dosomething()) //dosomething()中有某些異步操作
.pipe(gulp.dest('build'));
return stream;
});

gulp.task('two',['one'],function(){
console.log('two is done');
});
第三:返回一個(gè)promise對(duì)象,例如

var Q = require('q'); //一個(gè)著名的異步處理的庫(kù) https://github.com/kriskowal/q
gulp.task('one',function(cb){
var deferred = Q.defer();
// 做一些異步操作
setTimeout(function() {
deferred.resolve();
}, 5000);
return deferred.promise;
});

gulp.task('two',['one'],function(){
console.log('two is done');
});

gulp.task()就這些了奴饮,主要是要知道當(dāng)依賴是異步任務(wù)時(shí)的處理。

gulp.watch(glob[, opts], tasks)
gulp.watch()用來(lái)監(jiān)視文件的變化择浊,當(dāng)文件發(fā)生變化后戴卜,我們可以利用它來(lái)執(zhí)行相應(yīng)的任務(wù),例如文件壓縮等琢岩。
glob 為要監(jiān)視的文件匹配模式投剥,規(guī)則和用法與gulp.src()方法中的glob相同。
opts 為一個(gè)可選的配置對(duì)象担孔,通常不需要用到
tasks 為文件變化后要執(zhí)行的任務(wù)江锨,為一個(gè)數(shù)組

gulp.task('uglify',function(){
//do something
});
gulp.task('reload',function(){
//do something
});
gulp.watch('js/*/.js', ['uglify','reload']);
gulp.watch()還有另外一種使用方式:

gulp.watch(glob[, opts, cb])
glob和opts參數(shù)與第一種用法相同
cb參數(shù)為一個(gè)函數(shù)。每當(dāng)監(jiān)視的文件發(fā)生變化時(shí)糕篇,就會(huì)調(diào)用這個(gè)函數(shù),并且會(huì)給它傳入一個(gè)對(duì)象啄育,該對(duì)象包含了文件變化的一些信息,type屬性為變化的類型拌消,可以是added,changed,deleted挑豌;path屬性為發(fā)生變化的文件的路徑

gulp.watch('js/*/.js', function(event){
console.log(event.type); //變化類型 added為新增,deleted為刪除,changed為改變
console.log(event.path); //變化的文件的路徑
});

<pre>

一些常用的gulp插件

1. 自動(dòng)加載插件

使用:gulp-load-plugins

安裝:npm install --save-dev gulp-load-plugins

要使用gulp的插件,首先得用require來(lái)把插件加載進(jìn)來(lái)氓英,如果我們要使用的插件非常多侯勉,那我們的gulpfile.js文件開(kāi)頭可能就會(huì)是這個(gè)樣子的:

var gulp = require('gulp'),
    //一些gulp插件,abcd這些命名只是用來(lái)舉個(gè)例子
    a = require('gulp-a'), 
    b = require('gulp-b'),
    c = require('gulp-c'),
    d = require('gulp-d'),
    e = require('gulp-e'),
    f = require('gulp-f'),
    g = require('gulp-g'),
    //更多的插件...
    z = require('gulp-z');   

雖然這沒(méi)什么問(wèn)題,但會(huì)使我們的gulpfile.js文件變得很冗長(zhǎng)铝阐,看上去不那么舒服址貌。gulp-load-plugins插件正是用來(lái)解決這個(gè)問(wèn)題。

gulp-load-plugins這個(gè)插件能自動(dòng)幫你加載package.json文件里的gulp插件徘键。例如假設(shè)你的package.json文件里的依賴是這樣的:

{
  "devDependencies": {
    "gulp": "~3.6.0",
    "gulp-rename": "~1.2.0",
    "gulp-ruby-sass": "~0.4.3",
    "gulp-load-plugins": "~0.5.1"
  }
}

然后我們可以在gulpfile.js中使用gulp-load-plugins來(lái)幫我們加載插件:

var gulp = require('gulp');
//加載gulp-load-plugins插件练对,并馬上運(yùn)行它
var plugins = require('gulp-load-plugins')();

然后我們要使用gulp-renamegulp-ruby-sass這兩個(gè)插件的時(shí)候,就可以使用plugins.renameplugins.rubySass來(lái)代替了,也就是原始插件名去掉gulp-前綴啊鸭,之后再轉(zhuǎn)換為駝峰命名锹淌。

實(shí)質(zhì)上gulp-load-plugins是為我們做了如下的轉(zhuǎn)換

plugins.rename = require('gulp-rename');
plugins.rubySass = require('gulp-ruby-sass');

gulp-load-plugins并不會(huì)一開(kāi)始就加載所有package.json里的gulp插件,而是在我們需要用到某個(gè)插件的時(shí)候赠制,才去加載那個(gè)插件赂摆。

最后要提醒的一點(diǎn)是,因?yàn)?code>gulp-load-plugins是通過(guò)你的k文件來(lái)加載插件的钟些,所以必須要保證你需要自動(dòng)加載的插件已經(jīng)寫(xiě)入到了package.json文件里烟号,并且這些插件都是已經(jīng)安裝好了的。

2. 重命名

使用:gulp-rename

安裝:npm install --save-dev gulp-rename

用來(lái)重命名文件流中的文件政恍。用gulp.dest()方法寫(xiě)入文件時(shí)汪拥,文件名使用的是文件流中的文件名,如果要想改變文件名篙耗,那可以在之前用gulp-rename插件來(lái)改變文件流中的文件名迫筑。

var gulp = require('gulp'),
    rename = require('gulp-rename'),
    uglify = require("gulp-uglify");

gulp.task('rename', function () {
    gulp.src('js/jquery.js')
    .pipe(uglify())  //壓縮
    .pipe(rename('jquery.min.js')) //會(huì)將jquery.js重命名為jquery.min.js
    .pipe(gulp.dest('js'));
    //關(guān)于gulp-rename的更多強(qiáng)大的用法請(qǐng)參考https://www.npmjs.com/package/gulp-rename
});

3. js文件壓縮

使用 : gulp-uglify

安裝:npm install --save-dev gulp-uglify

用來(lái)壓縮js文件,使用的是uglify引擎

var gulp = require('gulp');
var uglify = require('gulp-uglify');
var pump = require('pump');

gulp.task('compress', function (cb) {
  pump([
        gulp.src('lib/*.js'),
        uglify(),
        gulp.dest('dist')
    ],
    cb
  );
});

4. css文件壓縮

使用 : gulp-clean-css

安裝:npm install gulp-clean-css --save-dev

要壓縮css文件時(shí)可以使用該插件

var gulp = require('gulp');
var cleanCSS = require('gulp-clean-css');

gulp.task('minify-css', function() {
  return gulp.src('styles/*.css')
    .pipe(cleanCSS({compatibility: 'ie8'}))
    .pipe(gulp.dest('dist'));
});

5. html文件壓縮

使用 : gulp-htmlmin

安裝:npm i gulp-htmlmin --save-dev

用來(lái)壓縮html文件

var gulp = require('gulp');
var htmlmin = require('gulp-htmlmin');

gulp.task('minify', function() {
  return gulp.src('src/*.html')
    .pipe(htmlmin({collapseWhitespace: true}))
    .pipe(gulp.dest('dist'));
});

<pre>

6. js代碼檢查

使用 : gulp-jshint

安裝:npm install --save-dev gulp-jshint

用來(lái)檢查js代碼

var gulp = require('gulp'),
    jshint = require("gulp-jshint");

gulp.task('jsLint', function () {
    gulp.src('js/*.js')
    .pipe(jshint())
    .pipe(jshint.reporter()); // 輸出檢查結(jié)果
});

7. 文件合并

使用 : gulp-concat

安裝:npm install --save-dev gulp-concat

用來(lái)把多個(gè)文件合并為一個(gè)文件,我們可以用它來(lái)合并js或css文件等宗弯,這樣就能減少頁(yè)面的http請(qǐng)求數(shù)了

var gulp = require('gulp'),
    concat = require("gulp-concat");

gulp.task('concat', function () {
    gulp.src('js/*.js')  //要合并的文件
    .pipe(concat('all.js'))  // 合并匹配到的js文件并命名為 "all.js"
    .pipe(gulp.dest('dist/js'));
});

8. less和sass的編譯

less使用gulp-less,安裝:npm install --save-dev gulp-less

var gulp = require('gulp'),
    less = require("gulp-less");

gulp.task('compile-less', function () {
    gulp.src('less/*.less')
    .pipe(less())
    .pipe(gulp.dest('dist/css'));
});

sass使用gulp-sass,安裝:npm install --save-dev gulp-sass

var gulp = require('gulp'),
    sass = require("gulp-sass");

gulp.task('compile-sass', function () {
    gulp.src('sass/*.sass')
    .pipe(sass())
    .pipe(gulp.dest('dist/css'));
});

9. 圖片壓縮

可以使用gulp-imagemin插件來(lái)壓縮jpg脯燃、png、gif等圖片蒙保。

安裝:npm install --save-dev gulp-imagemin

var gulp = require('gulp');
var imagemin = require('gulp-imagemin');
var pngquant = require('imagemin-pngquant'); //png圖片壓縮插件

gulp.task('default', function () {
    return gulp.src('src/images/*')
        .pipe(imagemin({
            progressive: true,
            use: [pngquant()] //使用pngquant來(lái)壓縮png圖片
        }))
        .pipe(gulp.dest('dist'));
});

gulp-imagemin的使用比較復(fù)雜一點(diǎn)辕棚,而且它本身也有很多插件,建議去它的項(xiàng)目主頁(yè)看看文檔

10. 自動(dòng)刷新

使用gulp-livereload插件邓厕,安裝:npm install --save-dev gulp-livereload逝嚎。

當(dāng)代碼變化時(shí),它可以幫我們自動(dòng)刷新頁(yè)面

該插件最好配合谷歌瀏覽器來(lái)使用详恼,且要安裝livereload chrome extension擴(kuò)展插件,不能下載的請(qǐng)自行FQ补君。

var gulp = require('gulp'),
    less = require('gulp-less'),
    livereload = require('gulp-livereload');

gulp.task('less', function() {
  gulp.src('less/*.less')
    .pipe(less())
    .pipe(gulp.dest('css'))
    .pipe(livereload());
});

gulp.task('watch', function() {
  livereload.listen(); //要在這里調(diào)用listen()方法
  gulp.watch('less/*.less', ['less']);
});

11. 服務(wù)器

使用 : gulp-connect插件,

安裝 : npm install --save-dev gulp-connect

Gulp plugin to run a webserver (with LiveReload), 開(kāi)服務(wù)器昧互,并集成了LiveReload(自動(dòng)刷新), 下載這個(gè)插件上面的LiverReload插件就不用再下載了.

var gulp = require('gulp'),
  connect = require('gulp-connect');

gulp.task('connect', function() {
  connect.server({
    root: 'app',
    livereload: true
  });
});

作者:劉翾
鏈接:http://www.reibang.com/p/48f87550b434
來(lái)源:簡(jiǎn)書(shū)
著作權(quán)歸作者所有赚哗。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)她紫,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。</pre>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末屿储,一起剝皮案震驚了整個(gè)濱河市贿讹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌够掠,老刑警劉巖民褂,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異疯潭,居然都是意外死亡赊堪,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)竖哩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)哭廉,“玉大人,你說(shuō)我怎么就攤上這事相叁∽翊拢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵增淹,是天一觀的道長(zhǎng)椿访。 經(jīng)常有香客問(wèn)我,道長(zhǎng)虑润,這世上最難降的妖魔是什么成玫? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮拳喻,結(jié)果婚禮上哭当,老公的妹妹穿的比我還像新娘。我一直安慰自己冗澈,他們只是感情好钦勘,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著渗柿,像睡著了一般个盆。 火紅的嫁衣襯著肌膚如雪脖岛。 梳的紋絲不亂的頭發(fā)上朵栖,一...
    開(kāi)封第一講書(shū)人閱讀 52,158評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音柴梆,去河邊找鬼陨溅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛绍在,可吹牛的內(nèi)容都是我干的门扇。 我是一名探鬼主播雹有,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼臼寄!你這毒婦竟也來(lái)了霸奕?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤吉拳,失蹤者是張志新(化名)和其女友劉穎质帅,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體留攒,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡煤惩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了炼邀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片魄揉。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖拭宁,靈堂內(nèi)的尸體忽然破棺而出洛退,到底是詐尸還是另有隱情,我是刑警寧澤红淡,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布不狮,位于F島的核電站,受9級(jí)特大地震影響在旱,放射性物質(zhì)發(fā)生泄漏摇零。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一桶蝎、第九天 我趴在偏房一處隱蔽的房頂上張望驻仅。 院中可真熱鬧,春花似錦登渣、人聲如沸噪服。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)粘优。三九已至,卻和暖如春呻顽,著一層夾襖步出監(jiān)牢的瞬間雹顺,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工廊遍, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嬉愧,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓喉前,卻偏偏與公主長(zhǎng)得像没酣,于是被迫代替她去往敵國(guó)和親王财。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359