04_gulp介紹

環(huán)境

Centos 7 X86_64(虛擬機(jī))

初始化

# yum install epel -y
# yum install vim nodejs npm -y

安裝gulp

# npm install gulp --global

package.json

創(chuàng)建package.json配置文件(package.json是用來記錄項(xiàng)目依賴組件的配置文件.)

# npm init      # 根據(jù)提示一步一步定義最基本的配置文件.

//下面配置完成之后的內(nèi)容.
{
  "name": "normandy",
  "version": "1.0.0",
  "description": "bai yuan web projects",
  "main": "index.js",
  "scripts": {
    "test": "echo \\\"Error: no test specified\\\" && exit 1"
  },
  "author": "",
  "license": "ISC",
}

維護(hù)package.json

常規(guī)的維護(hù)可以通過vim或者直接用編輯器對package.json文件進(jìn)行編輯塌西,只有當(dāng)需要為項(xiàng)目固化依賴組建時才會使用到下面這個命令來更新package.json.

# npm install npm install gulp gulp-buffer gulp-clean-css --save-dev

// 下面是配置更新后的內(nèi)容.
{
  "name": "normandy",
  "version": "1.0.0",
  "description": "bai yuan web projects",
  "main": "index.js",
  "scripts": {
    "test": "echo \\\"Error: no test specified\\\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "babel-core": "^6.24.0",
    "babel-preset-es2015": "^6.24.0",
    "gulp": "^3.9.1",
    "gulp-buffer": "0.0.2",
    "gulp-clean-css": "^3.0.3",
  }
}

Gulp編程

Gulp可以將指定目錄下的文件或者正則匹配到的文件進(jìn)行讀取,然后以數(shù)據(jù)流形式通過管道可以與其他命令協(xié)作完成對項(xiàng)目文件的定制。官方明確表示它僅僅是一個基礎(chǔ)的任務(wù)管理系統(tǒng)伊脓。這段話讀起來有點(diǎn)繞口沟绪,gulp將它拆成了四個命令(gulp.task割卖、gulp.src疙驾、gulp.dest杠河、gulp.watch)氢架,下面單獨(dú)對著四個命令進(jìn)行簡單描述(另外在延伸gulp的pipe屬性方法和through插件庫)傻咖。

Gulp.task

Gulp.task只負(fù)責(zé)執(zhí)行命令, 其他的什么都不管, 運(yùn)行Gulp.task不需要有任何準(zhǔn)備, 不對任何文件和目錄結(jié)構(gòu)有要求。它僅僅是一個命令執(zhí)行方法岖研。

javascript的寫法: gulpfile.js

var gulp = require('gulp');
gulp.task('hello_javascript', function() {
    console.log('hello JavaScript!')
})

ECMAScript的寫法: gulpfile.babel.js

import gulp from 'gulp';
gulp.task('hello_ecmascript', () => {
    console.log('hello ECMAScript');
})

# 輸出結(jié)果
[root@localhost ~]# gulp hello_ecmascript
[04:40:30] Requiring external module babel-register
[04:40:30] Using gulpfile ~/gulpfile.babel.js
[04:40:30] Starting 'hello_ecmascript'...
hello ECMAScript
[04:40:30] Finished 'hello_ecmascript' after 324 μs

語法: gulp.task(name [, deps] [, fn])
name和[, fn]著兩個參數(shù)已經(jīng)在上面兩個例子中有使用過了,
[, deps]尚未使用卿操,它主要的作用是控制執(zhí)行順序,
例如:gulp.task('hello_ecmascript', ['hello_javascript'], () => { ... })這個任務(wù)的意思是說, 在執(zhí)行hello_ecmascript之前需要先執(zhí)行hello_javascript孙援。

Gulp.pipe

管道(pipe)用于傳輸文件字節(jié)流(數(shù)據(jù)流)害淤,gulp默認(rèn)采用了vinyl-fs來處理文件對象,而vinyl-fs采用through2來處理數(shù)據(jù)流拓售;在處理多文件的數(shù)據(jù)流這件事情上gulp一般都脫離不了through2窥摄。參考網(wǎng)址
through2會將gulp.src指定的多個文件(例如: gulp.src('src/*.js')),通過回調(diào)的方式挨個挨個將文件對象傳遞給through2础淤,下面舉兩個例子來介紹pipe屬性方法和through2的工作原理崭放。

文件合并(gulp-concat)

# 創(chuàng)建一個案例目錄
[root@localhost ~]# mkdir -p simple_merge/src
[root@localhost ~]# cd simple_merge/

# 安裝gulp和react
[root@localhost simple_merge]# cnpm install gulp gulp-concat vue react --save-dev

# 將react.js和vue復(fù)制到src目錄
[root@localhost simple_merge]# cp node_modules/react/dist/react.js node_modules/vue/dist/vue.js src/

# 撰寫gulpfile.js文件
[root@localhost simple_merge]# vim gulpfile.js
var gulp   = require('gulp'),
    concat = require('gulp-concat')

gulp.task('compress', function() {
    return gulp.src('src/*.js')
           .pipe(concat('bundle.js'))
           .pipe(gulp.dest('dist/'))
})

# 構(gòu)建(文件合并)
[root@localhost simple_merge]# ./node_modules/gulp/bin/gulp.js compress
[20:13:51] Using gulpfile ~/fron_end/simple_merge/gulpfile.js
[20:13:51] Starting 'compress'...
[20:13:51] Finished 'compress' after 51 ms

# 查看當(dāng)前目錄結(jié)構(gòu)
[root@localhost simple_merge]# ls
dist  gulpfile.js  node_modules  package.json  src

# 查看dist目錄結(jié)構(gòu)
[root@localhost simple_merge]# ls -lah dist/
total 364K
drwxr-xr-x 2 root root   23 Mar 26 20:13 .
drwxr-xr-x 5 root root   88 Mar 26 20:13 ..
-rw-r--r-- 1 root root 364K Mar 26 20:13 bundle.js

首先gulp.src框定了讀取src目錄下的所有文件名后綴為.js的文件,并通過.pipe屬性方法將數(shù)據(jù)流傳遞給concat插件鸽凶,而concat運(yùn)行時根據(jù)制定的文件生成名稱(bundle.js)將多個文件對象逐一進(jìn)行讀取以及寫入到該制定的文件生成名稱的對象中币砂,并通過this關(guān)鍵字寫入到當(dāng)前實(shí)例,最終gulp.dest會根據(jù)標(biāo)準(zhǔn)接口去完成寫入的行為(創(chuàng)建目錄玻侥、寫入文件)决摧。

理解數(shù)據(jù)流轉(zhuǎn)發(fā)過程(through2)
上面這個例子從代碼層面來看,就一行有效代碼凑兰,但是從文字描述來看可能過于復(fù)雜和帶有不確定性掌桩,所以我這里將采用through2來打印一些日志來觀察它的運(yùn)行原理和過程(請注意:這個例子并沒有做文件合并。)票摇;其實(shí)通過查看gulp-concat插件的源代碼就可以發(fā)現(xiàn)它也是采用through2來完成文件對象的獲取拘鞋。

# 創(chuàng)建一個案例目錄
[root@localhost ~]# mkdir -p simple_pipeline/src
[root@localhost ~]# cd simple_pipeline/

# 安裝gulp和react
[root@localhost simple_pipeline]# cnpm install gulp vue react through2 --save-dev

# 將react.js和vue復(fù)制到src目錄
[root@localhost simple_pipeline]# cp node_modules/react/dist/react.js node_modules/vue/dist/vue.js src/

# 撰寫gulpfile.js文件
[root@localhost simple_merge]# vim gulpfile.js
var gulp = require('gulp'),
    through = require('through2')

gulp.task('displayDetails', function() {
    return gulp.src('src/*.js')
           .pipe(through.obj(function(file, encode, callback) {
               console.log(file);
               console.log(encode);
               console.log(callback);
               callback();
           }))
           .pipe(gulp.dest('dist/'))
})

# 觀察運(yùn)行過程
[root@localhost simple_gulppipe]# ./node_modules/gulp/bin/gulp.js displayDetails
[20:39:24] Using gulpfile ~/fron_end/simple_gulppipe/gulpfile.js
[20:39:24] Starting 'displayDetails'...


<File "react.js" <Buffer 20 2f 2a 2a 0a 20 20 2a 20 52 65 61 63 74 20 76 31 35 2e 34 2e 32 0a 20 20 2a 2f 0a 28 66 75 6e 63 74 69 6f 6e 28 66 29 7b 69 66 28 74 79 70 65 6f 66 ... >>
utf8
[Function]


<File "vue.js" <Buffer 2f 2a 21 0a 20 2a 20 56 75 65 2e 6a 73 20 76 32 2e 32 2e 35 0a 20 2a 20 28 63 29 20 32 30 31 34 2d 32 30 31 37 20 45 76 61 6e 20 59 6f 75 0a 20 2a 20 ... >>
utf8
[Function]


[20:39:24] Finished 'displayDetails' after 55 ms

Gulp.src

語法:
gulp.src(globs[, options])
根據(jù)提供的參數(shù)來讀取文件源,并返回一個基于Vinyl風(fēng)格的文件對象(流數(shù)據(jù))矢门,這種文件對象可以通過pipe管道以一個文件對象傳遞給其他程序繼續(xù)完成整合的行為盆色。

globs
支持兩種類型的數(shù)據(jù)灰蛙,分別是字符串(glob)和列表(array of globs)。

glob支持字符串形式以通配符的方式來匹配文件集合隔躲。

// src/*.js標(biāo)識匹配src目錄下的所有后綴名為.js的文件摩梧,
// 并將它們逐一轉(zhuǎn)換成Vinyl風(fēng)格的文件對象。
gulp.src('src/*.js')   

array of globs支持列表形式以通配符的方式來匹配文件集合宣旱。

gulp.src(['src/*.js', 'server/*.js', 'client/*.js'])

options
options選項(xiàng)是可選的仅父,因?yàn)槌绦蚰J(rèn)會給它賦值,除非有特定需求浑吟,否則一般不需要配置options笙纤;默認(rèn)情況下程序會這樣在程序內(nèi)部幫你實(shí)現(xiàn)賦值。

gulp.src('src/*.js', { buffer: true, read: true, base: null })

還有另外一個options要單獨(dú)進(jìn)行處理(那就是base)组力,默認(rèn)情況下base是一個null的值(也可以在glob處通配符'**'或指定一個明確的指)省容,意思是說,當(dāng)所有程序處理完之后燎字,最終交付給gulp.dest生成文件時腥椒,是否在指定的目錄下生成有子目錄結(jié)構(gòu)的存放;例如:
樣例1: 通配符

# 查看目錄結(jié)構(gòu)
[root@localhost simple_gulpsrc]# ls 
node_modules    package.json    src
[root@localhost simple_gulpsrc]# tree src
src
└── client
    └── js
        ├── jianshu
        │   ├── react-with-addons.js
        │   ├── react-with-addons.min.js
        │   ├── react.js
        │   └── react.min.js
        └── youdao
            ├── vue.common.js
            ├── vue.common.min.js
            ├── vue.esm.js
            ├── vue.js
            ├── vue.min.js
            ├── vue.runtime.common.js
            ├── vue.runtime.esm.js
            ├── vue.runtime.js
            └── vue.runtime.min.js

# 創(chuàng)建通配符版本gulpfile_wildcard.js
[root@localhost simple_gulpsrc]# vim gulpfile_wildcard.js
var gulp = require('gulp')

gulp.task('build', functioin () {
    return gulp.src('src/client/js/**/*.js')
           .pipe(gulp.dest('dist'))
})

# 生成目標(biāo)文件
[root@localhost simple_gulpsrc]# ./node_modules/gulp/bin/gulp.js --gulpfile gulpfile_wildcard.js build
[10:40:13] Using gulpfile ~/zhengtong/gulp_srcbase/gulpfile_wildcard.js
[10:40:13] Starting 'build'...
[10:40:13] Finished 'build' after 72 ms

# 查看目標(biāo)目錄
[root@localhost simple_gulpsrc]# tree dist
dist
├── jianshu
│   ├── react-with-addons.js
│   ├── react-with-addons.min.js
│   ├── react.js
│   └── react.min.js
└── youdao
    ├── vue.common.js
    ├── vue.common.min.js
    ├── vue.esm.js
    ├── vue.js
    ├── vue.min.js
    ├── vue.runtime.common.js
    ├── vue.runtime.esm.js
    ├── vue.runtime.js
    └── vue.runtime.min.js

樣例2:通配符 + base

# 刪除dist目錄
[root@localhost simple_gulpsrc]# rm -rf dist/

# 創(chuàng)建通配符+base版本的gulpfile_wildcardBase.js
[root@localhost simple_gulpsrc]# vim gulpfile_wildcardBase.js
var gulp = require('gulp')

gulp.task('build', function () {
    return gulp.src('src/client/js/**/*.js', {base: 'src'})
           .pipe(gulp.dest('dist'))
})

# 生成目標(biāo)文件
[root@localhost simple_gulpsrc]# ./node_modules/gulp/bin/gulp.js --gulpfile gulpfile_wildcardBase.js build
[10:45:18] Using gulpfile ~/zhengtong/gulp_srcbase/gulpfile_wildcardBase.js
[10:45:18] Starting 'build'...
[10:45:18] Finished 'build' after 65 ms

# 查看目標(biāo)目錄
[root@localhost simple_gulpsrc]# tree dist
dist
└── client
    └── js
        ├── jianshu
        │   ├── react-with-addons.js
        │   ├── react-with-addons.min.js
        │   ├── react.js
        │   └── react.min.js
        └── youdao
            ├── vue.common.js
            ├── vue.common.min.js
            ├── vue.esm.js
            ├── vue.js
            ├── vue.min.js
            ├── vue.runtime.common.js
            ├── vue.runtime.esm.js
            ├── vue.runtime.js
            └── vue.runtime.min.js
Gulp.dest
Gulp.watch
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末候衍,一起剝皮案震驚了整個濱河市笼蛛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蛉鹿,老刑警劉巖滨砍,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異榨为,居然都是意外死亡惨好,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門随闺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蔓腐,你說我怎么就攤上這事矩乐。” “怎么了回论?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵散罕,是天一觀的道長。 經(jīng)常有香客問我傀蓉,道長欧漱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任葬燎,我火速辦了婚禮误甚,結(jié)果婚禮上缚甩,老公的妹妹穿的比我還像新娘。我一直安慰自己窑邦,他們只是感情好擅威,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著冈钦,像睡著了一般郊丛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瞧筛,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天厉熟,我揣著相機(jī)與錄音,去河邊找鬼较幌。 笑死庆猫,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的绅络。 我是一名探鬼主播月培,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼恩急!你這毒婦竟也來了杉畜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤衷恭,失蹤者是張志新(化名)和其女友劉穎此叠,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體随珠,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡灭袁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了窗看。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茸歧。...
    茶點(diǎn)故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖显沈,靈堂內(nèi)的尸體忽然破棺而出软瞎,到底是詐尸還是另有隱情,我是刑警寧澤拉讯,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布涤浇,位于F島的核電站,受9級特大地震影響魔慷,放射性物質(zhì)發(fā)生泄漏只锭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一院尔、第九天 我趴在偏房一處隱蔽的房頂上張望蜻展。 院中可真熱鬧喉誊,春花似錦、人聲如沸铺呵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽片挂。三九已至幻林,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間音念,已是汗流浹背沪饺。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留闷愤,地道東北人整葡。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像讥脐,于是被迫代替她去往敵國和親遭居。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容

  • gulpjs是一個前端構(gòu)建工具旬渠,與gruntjs相比俱萍,gulpjs無需寫一大堆繁雜的配置參數(shù),API也非常簡單告丢,學(xué)...
    小裁縫sun閱讀 922評論 0 3
  • gulpjs是一個前端構(gòu)建工具枪蘑,與gruntjs相比,gulpjs無需寫一大堆繁雜的配置參數(shù)岖免,API也非常簡單岳颇,學(xué)...
    依依玖玥閱讀 3,149評論 7 55
  • gulpjs是一個前端構(gòu)建工具,與gruntjs相比颅湘,gulpjs無需寫一大堆繁雜的配置參數(shù)话侧,API也非常簡單,學(xué)...
    井皮皮閱讀 1,292評論 0 10
  • gulpjs是一個前端構(gòu)建工具栅炒,與gruntjs相比掂摔,gulpjs無需寫一大堆繁雜的配置參數(shù),API也非常簡單赢赊,學(xué)...
    build1024閱讀 527評論 0 0
  • 1、gulp的安裝 首先確保你已經(jīng)正確安裝了nodejs環(huán)境级历。然后以全局方式安裝gulp: npm install...
    F_imok閱讀 2,364評論 1 11