前端構(gòu)建工具Gulp.js 你知多少..(webpack/gulp/grunt)

@TOC

寫在前面

前幾天在更新webpack知識的時候,想起來三年前用過的前端構(gòu)建工具gulp/grunt,遂寫個筆記總結(jié)一下在抛,出來混總是要還的唠帝,忘得七七八八了...

閱讀本文章之前雀摘,相信你已經(jīng)對前端構(gòu)建工具(webpack赂鲤、gulp、grunt)有一定的認知和了解了棍掐,那么他們之間究竟有什么區(qū)別呢藏雏?

什么是gulp?

gulp文檔上面有這么一句話\color{blue} {用自動化構(gòu)建工具增強你的工作流程作煌!} 掘殴,也就是說 gulp是一個自動化構(gòu)建工具;
gulp的一些功能如下(包括但不限于):

自動化構(gòu)建工具gulp

gulp或grunt和webpack的區(qū)別

其實Webpack和另外兩個并沒有太多的可比性

  • Gulp/Grunt是一種能夠優(yōu)化前端的開發(fā)流程的工具粟誓,而WebPack是一種模塊化的解決方案奏寨,不過Webpack的優(yōu)點使得Webpack在很多場景下可以替代Gulp/Grunt類的工具。

  • Grunt和Gulp的工作方式是:在一個配置文件中鹰服,指明對某些文件進行類似編譯病瞳,組合揽咕,壓縮等任務(wù)的具體步驟,工具之后可以自動替你完成這些任務(wù)套菜。


    Grunt和Gulp的工作流程
  • Webpack的工作方式是:把你的項目當(dāng)做一個整體亲善,通過一個給定的主文件(如:index.js),Webpack將從這個文件開始找到你的項目的所有依賴文件逗柴,使用loaders處理它們蛹头,最后打包為一個(或多個)瀏覽器可識別的JavaScript文件。

    Webpack的工作方式

    上述內(nèi)容轉(zhuǎn)自@zhangwang的入門Webpack戏溺,看這篇就夠了

gulp起步

傻瓜式起步照搬官網(wǎng)文檔
1.安裝

// 全局安裝
$ npm install -g gulp
或者
$ npm install --global gulp

// 作為項目的開發(fā)依賴(devDependencies)安裝:
$ npm install --save-dev gulp

2.在項目根目錄下創(chuàng)建一個名為 gulpfile.js 的文件:

var gulp = require('gulp');

gulp.task('default', function() {
  // 將你的默認的任務(wù)代碼放在這
});

3.運行 gulp:

$ gulp

默認的名為 default 的任務(wù)(task)將會被運行渣蜗,在這里,這個任務(wù)并未做任何事情旷祸。
具體詳情可以查看gulpjs.com文檔

項目搭建

新建一個項目gulp-test
環(huán)境:

$ node -v // v9.1.0
$ npm -v // 6.5.0

1.新建文件以下文件如下

gulp-test/
          css/
               index.scss
           js/
               helloworld.js
           index.html
           gulpfile.js

其中 gulpfile.js 是我們gulp的配置文件袍睡,啟動gulp默認會找個這個文件并執(zhí)行;
2.接下來安裝依賴

$ npm init

一直按回車Enter初始化package.json文件(小技巧: npm iniy -y 可以免去繁瑣的enter步驟)
此時我們的目錄結(jié)構(gòu)是這樣了

gulp-test/
          css/
               index.scss
           js/
               helloworld.js
           index.html
           gulpfile.js
           package.json

安裝依賴

npm i --save-dev gulp        // gulp自動化構(gòu)建工具
npm i --save-dev gulp-uglify //js壓縮
npm i --save-dev gulp-concat //文件合并
npm i --save-dev gulp-jshint //js語法檢測
npm i --save-dev gulp-rename //文件重命名
npm i --save-dev gulp-sass //sass編譯工具
npm i --save-dev gulp-minify-css //css壓縮
npm i --save-dev del       //文件刪除
// 以下三選一
npm i --save-dev gulp-connect       // 自動刷新頁面
npm i --save-dev  browser-sync       // 自動刷新頁面
npm i --save-dev gulp-livereload       // 自動刷新頁面

這里頁面實時刷新只講這個gulp-connect 肋僧,其他詳情可以參照Browsersync和文章gulp-livereload

安裝完依賴后配置gulpfile.js如下:

// 定義依賴項和插件
const gulp=require('gulp');
const  uglify=require('gulp-uglify'); //js壓縮
const  concat=require('gulp-concat'); //文件合并
const jshint = require('gulp-jshint'); //js語法檢測
const rename = require('gulp-rename'); // 重命名
const sass = require('gulp-sass'); // 編譯scss
const  minifycss = require('gulp-minify-css'); // 壓縮css
// const livereload = require('gulp-livereload'); // 自動刷新頁面
const  del = require('del'); //文件刪除
const connect = require('gulp-connect'); // 自動刷新頁面

gulp.task('server', function() {
  connect.server({
    port: 8080, //指定端口號,在瀏覽器中輸入localhost:8080就可以直接訪問生成的html頁面
    root: './', //指定html文件起始的根目錄
    livereload: true //啟動實時刷新功能(配合上邊的connect.reload()方法同步使用)
  });
});

// 定義名為 "my-task" 的任務(wù)壓縮js
gulp.task('my-task-js', function(){
  gulp.src('./js/*.js')
    .pipe(jshint())
    .pipe(uglify())
    .pipe(concat('all.js'))
    .pipe(rename({suffix: '.min'}))
    .pipe(gulp.dest('./dist/js'))
    .pipe(connect.reload())
});


// 定義名為 "my-task-css" 的任務(wù)編譯scss壓縮css
gulp.task('my-task-css', function() {
  gulp.src('./css/*.scss')
    .pipe(sass().on('error', sass.logError))
    .pipe(concat('all.css'))
    .pipe(rename({suffix: '.min'}))
    .pipe(minifycss())
    .pipe(connect.reload())
    .pipe(gulp.dest('./dist/css'))

});

gulp.task('html', function(){
  gulp.src('*.html')
    .pipe(gulp.dest('dist/html'))
    .pipe(connect.reload())
})
//執(zhí)行壓縮前控淡,先刪除以前壓縮的文件
gulp.task('clean', function() {
  return del(['./dist/css/all.css', './dist/css/all.min.css', './dist/all.js','./dist/all.min.js', './dist/html'])
});
// 定義默認任務(wù)

gulp.task('default',['clean'],function() {
  gulp.start('my-task-js', 'my-task-css', 'watch', 'server' );
});
// 任務(wù)監(jiān)聽
gulp.task('watch', function() {
  // Watch.js files
  gulp.watch('./js/*.js', ['my-task-js']);
  // Watch .scss files
  gulp.watch('./css/*.scss', ['my-task-css']);
  // Watch .html files
  gulp.watch('./*.html', ['html']);
  // Watch any files in dist/, reload on change
  // gulp.watch(['dist/!**']).on('change', livereload.changed);
});

大概講解一下gulpfile.js:

// ...
// 定義名為 "my-task" 的任務(wù)壓縮js
gulp.task('my-task-js', function(){
  gulp.src('./js/*.js')
    .pipe(jshint()) //js檢測
    .pipe(uglify()) //js壓縮
    .pipe(concat('all.js')) //合并為all.js
    .pipe(rename({suffix: '.min'})) // 重命名為all.mim.js
    .pipe(gulp.dest('./dist/js')) //輸出到/dist/js目錄
    .pipe(connect.reload()) // 更新頁面
});
// ...

gulp.task是gulp的api 定義一個使用 Orchestrator 實現(xiàn)的任務(wù)(task)
如上我們定義了my-task-js嫌吠,my-task-csshtml掺炭,clean辫诅,defaultwatch涧狮,server等任務(wù)炕矮,其中:


my-task-js 是將 符合所提供的匹配模式的js 進行檢測(gulp-jshint)、壓縮(gulp-uglify)者冤、合并(gulp-concat)肤视、重命名(gulp-rename)、輸出(gulp.dest)到/dist/js目錄下涉枫;


my-task-css 是將 符合所提供的匹配模式的sass進行編譯(gulp-sass)邢滑、壓縮(gulp-uglify)、合并(gulp-concat)愿汰、重命名(gulp-rename)困后、輸出(gulp.dest)到/dist/css目錄下;


html 是將 符合所提供的匹配模式的html進行監(jiān)聽衬廷,如果有變化則connect.reload()


clean 是如果任務(wù)重新啟動時 刪除舊文件摇予;


default gulp默認啟動的任務(wù)


watch gulp的api 監(jiān)視文件,并且可以在文件發(fā)生改動時候做一些事情吗跋。它總會返回一個 EventEmitter 來發(fā)射(emit) change 事件侧戴。


server 依賴gulp-connect啟動一個服務(wù)器

gulp.task('server', function() {
  connect.server({
    port: 8080, //指定端口號,在瀏覽器中輸入localhost:8080就可以直接訪問生成的html頁面
    root: './', //指定html文件起始的根目錄
    livereload: true //啟動實時刷新功能(配合上邊的connect.reload()方法同步使用)
  });
});

配置完gulpfile.js之后,我們給js和css及html加點東西:

首先js/helloworld.js

// helloworld.js
console.log('hello world')

css/index.scss

// index.scss

// 變量測試
$fontColor:  #red;
$backColor: aqua;
// 嵌套類測試
div {
  p {
    font-weight: bold;
    font-size: 20px;
    color: $fontColor;
  }
}

div{
  background: $backColor;
}

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>gulp-study</title>
    <link href=/dist/css/all.min.css rel=stylesheet>
</head>
<body>
    <div id="firstDiv">
        <p>我是gulp</p>
        <p>hello world</p>
    </div>
<p>我是p標(biāo)簽</p>
<p>我是p標(biāo)簽</p>
</body>
<script src="/dist/js/all.min.js"></script>
</html>

運行g(shù)ulp

$ gulp 
運行輸出

瀏覽器效果:


效果

接下來我們修改helloworld.js來看看是否能實時刷新
修改如下:

// helloworld.js
console.log('hello world');

let firstDiv =  document.getElementById('firstDiv')

console.log(firstDiv)

按保存之后救鲤,終端給我們報了一個錯:


Unhandled 'error' event

查看js發(fā)現(xiàn)我們用了es6語法的聲明語句\color{red}{let} 但當(dāng)前gulp無法處理es6語法久窟,有問題解決問題,es6=>es5

解決方案:
安裝gulp-babel babel-core babel-preset-es2015

npm i  --save-dev  gulp-babel babel-core babel-preset-es2015

gulpfile.js修改如下:

// ...
const babel = require('gulp-babel');
// ...
// 定義名為 "my-task" 的任務(wù)壓縮js
gulp.task('my-task-js', function(){
  gulp.src('./js/*.js')
    .pipe(babel())
    .pipe(jshint())
    .pipe(uglify())
    .pipe(concat('all.js'))
    .pipe(rename({suffix: '.min'}))
    .pipe(gulp.dest('./dist/js'))
    .pipe(connect.reload())
});
// ...

運行

$ gulp

依然報上面的錯本缠;找了一些原因發(fā)現(xiàn)斥扛,雖然安裝了相關(guān)依賴,卻沒有配置.babelrc文件丹锹,即babel還沒轉(zhuǎn)化es6

根目錄添加.babelrc文件

{
    "presets": ["es2015"]
}

重新運行:

$ gulp
結(jié)果如下

查看dist下的js文件


let已經(jīng)轉(zhuǎn)化成var

改變helloworld.js檢查頁面是否刷新

// helloworld.js
console.log('hello world');

let firstDiv =  document.getElementById('firstDiv')

console.log(firstDiv)
firstDiv.style.backgroundColor = 'yellow';

保存稀颁,頁面的天空藍換成你們喜歡的yellow顏色


頁面的天空藍換成你們喜歡的yellow顏色

修改index.scss 查看是否會刷新頁面

// index.scss

// 變量測試
$fontColor:  #red;
$backColor: aqua;
// 嵌套類測試
div {
  p {
    font-weight: bold;
    font-size: 20px;
    color: $fontColor;
  }
}

div{
  background: $backColor;
  width: 400px;
  height: 400px;
  margin: 0 auto;
}


頁面更新正常

最后修改index.html 查看是否會刷新頁面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>gulp-study</title>
    <link href=/dist/css/all.min.css rel=stylesheet>
</head>
<body>
    <div id="firstDiv">
        <p>我是gulp</p>
        <p>hello world</p>
    </div>
<div>
    <p>我是真的皮</p>
</div>
</body>
<script src="/dist/js/all.min.js"></script>
</html>

輸出完美

此次項目源碼請轉(zhuǎn)@王一諾gulp-study

文章最后

今天主要學(xué)習(xí)了gulp的簡單項目搭建及實時更新配置;其實gulp類似于grunt的弱化版楣黍,但更簡單好用匾灶,只是插件會少一些,目前主流的項目搭建工具主要是webpack租漂,但依然有不少項目還用著gulp或者grunt

擴展:

webpack中文網(wǎng)
gulpjs中文網(wǎng)
gruntjs中文網(wǎng)

下面還有一些樓主的學(xué)習(xí)筆記:

@webpack4+加vue2+從零開始搭設(shè)vue項目
@nginx部署/代理/跨域

有興趣的可以多多交流@樓主博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末阶女,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子哩治,更是在濱河造成了極大的恐慌秃踩,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件业筏,死亡現(xiàn)場離奇詭異憔杨,居然都是意外死亡,警方通過查閱死者的電腦和手機蒜胖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門消别,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人台谢,你說我怎么就攤上這事寻狂。” “怎么了对碌?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵荆虱,是天一觀的道長。 經(jīng)常有香客問我朽们,道長怀读,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任骑脱,我火速辦了婚禮菜枷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘叁丧。我一直安慰自己啤誊,他們只是感情好岳瞭,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蚊锹,像睡著了一般瞳筏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上牡昆,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天姚炕,我揣著相機與錄音,去河邊找鬼丢烘。 笑死柱宦,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的播瞳。 我是一名探鬼主播掸刊,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼赢乓!你這毒婦竟也來了忧侧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤牌芋,失蹤者是張志新(化名)和其女友劉穎苍柏,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體姜贡,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年棺棵,在試婚紗的時候發(fā)現(xiàn)自己被綠了楼咳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡烛恤,死狀恐怖母怜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情缚柏,我是刑警寧澤苹熏,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站币喧,受9級特大地震影響轨域,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜杀餐,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一干发、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧史翘,春花似錦枉长、人聲如沸冀续。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽洪唐。三九已至,卻和暖如春吼蚁,著一層夾襖步出監(jiān)牢的瞬間凭需,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工桂敛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留功炮,地道東北人。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓术唬,卻偏偏與公主長得像薪伏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子粗仓,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355