gulp

Gulp.js 是一個(gè)自動(dòng)化構(gòu)建工具,開發(fā)者可以使用它在項(xiàng)目開發(fā)過程中自動(dòng)執(zhí)行常見任務(wù)锦援。Gulp.js 是基于 Node.js 構(gòu)建的,利用 Node.js 流的威力,你可以快速構(gòu)建項(xiàng)目.

為什么要用Node環(huán)境:

js是一個(gè)腳本文件昂拂,不能直接用來操作文件。但是嘹黔,在項(xiàng)目過程中舶斧,免不了需要經(jīng)常操作一些文件,包括移動(dòng)復(fù)制壓縮上傳修改等。如果重新學(xué)習(xí)C之類底層操作的語言的未免成本太高调窍,此時(shí)node的橫空出世,解決了這個(gè)問題张遭。因?yàn)閚ode使用了js的語法邓萨,而且使用js的人也越來越多,node就理所當(dāng)然的火遍大江南北
在node中有很多插件菊卷,類似于手機(jī)中的軟件缔恳,拿到一個(gè)新手機(jī)沒有任何軟件是沒有辦法使用的。
gulp就是node中的工具之一洁闰。類似前端工程化工具還有:webpack歉甚,grunt,browserify扑眉。
gulp是一種前端自動(dòng)化工具纸泄,在使用gulp之前需要先安裝gulp
安裝gulp有兩種方式,一種是通過下載軟件安裝腰素,一種是通過類似手機(jī)的應(yīng)用商店的軟件下載聘裁,而node就是這個(gè)應(yīng)用商店
直接在網(wǎng)頁上下載安裝不僅安全性無法保證,而且還會(huì)造成不兼容等問題弓千;
通過手機(jī)的應(yīng)用商店下載的軟件會(huì)自動(dòng)適配當(dāng)前手機(jī)的型號(hào)和cpu等信息衡便,既保證了安全,也保證的軟件的功能完整性

配置nodejs

在配置gulp環(huán)境之前需要有node環(huán)境,去官網(wǎng)下載node
node是一個(gè)命令行工具洋访,使用這個(gè)工具需要用到兩個(gè)命令

npm install 安裝軟件
npm uninstall 卸載軟件

1.需要注意的是node沒有可視化界面操作镣陕,直接在命令行中進(jìn)行操作
node -v 顯示node的版本

2.gulp的全局環(huán)境類似于下載器,在使用gulp之前需要先安裝環(huán)境
npm install gulp -g
下載完成之后執(zhí)行

gulp -v

查看gulp的版本姻政,安裝完成

3.創(chuàng)建一個(gè)文件夾呆抑,起個(gè)任意名字,從命令行中進(jìn)入當(dāng)前文件夾

執(zhí)行npm install gulp --save-dev

配置局部環(huán)境 下載完成后執(zhí)行g(shù)ulp -v會(huì)出現(xiàn)全局和局部的版本號(hào)

執(zhí)行npm init 設(shè)置配置信息扶歪,可以全部為默認(rèn)常用插件配置文件

開始使用gulp

實(shí)現(xiàn)功能將線下版本的文件放在線上版本中
在命令行中輸入gulp理肺,提示沒有g(shù)ulpfile文件,需要手動(dòng)創(chuàng)建固定文件名gulpfile.js文件
在該文件中引入gulp模塊善镰,

let gulp = require("gulp");

gulp為gulp模塊返回的對(duì)象妹萨,在這個(gè)對(duì)象中,有一些方法
gulp.task("指令名字",()=>{指令執(zhí)行函數(shù)}) 綁定指令的方法

gulp.task("index",()=>{
    gulp.src()//找到源文件的目錄
    gulp.pipe()//在連綴之中繼續(xù)調(diào)用gulp方法
    gulp.dest()//轉(zhuǎn)存方法
    //實(shí)現(xiàn)功能的時(shí)候炫欺,一定要用ruturn
    return gulp.src("index.html").pipe(gulp.dest("dist"));
    })

在gulp.src中可以接收數(shù)組乎完,表示多個(gè)文件
文件名可以用*代替,表示通配
*/表示多層文件夾嵌套
!文件路徑品洛,表示除了此文件

gulp.watch()監(jiān)控
gulp.task("watch",()=>{
    //監(jiān)控index.html文件树姨,如果發(fā)生改變摩桶,那么執(zhí)行index指令
    gulp.watch("index.html",["index"]);
})
gulp原生默認(rèn)指令(default):
  • default 為gulp自帶默認(rèn)指令,當(dāng)在命令行中執(zhí)行g(shù)ulp后不跟任何指令名的時(shí)候帽揪,所執(zhí)行的指令
  • gulp.task("default",["hello"]); //第二個(gè)參數(shù)為要執(zhí)行的命令名硝清,可以接受多個(gè),表示默認(rèn)執(zhí)行的指令

gulp插件(服務(wù)器插件)創(chuàng)建本地服務(wù)

安裝插件(插件只有局部转晰,沒有全局芦拿,所以要安裝在項(xiàng)目文件夾中)

npm install gulp-connect

引入插件

在gulpfile文件中引用:

let connect = require("gulp-connect");

配置gulp-connect
gulp.task("server",()=>{
    connect.server({
    root:"dist",     //以哪個(gè)文件夾為服務(wù)器
    port:8888,       //端口號(hào)
    livereload:true  //是否可以自動(dòng)刷新
    })
})

此時(shí)可以在瀏覽器中輸入本地地址,訪問服務(wù)器
如果要實(shí)現(xiàn)保存自動(dòng)刷新功能查邢,首先需要在index指令中調(diào)用connect插件

gulp.src("index.html").pipe(gulp.dest("dist")).pipe(connect.reload());

其次需要同時(shí)運(yùn)行服務(wù)器指令和監(jiān)測(cè)指令蔗崎,可通過默認(rèn)指令實(shí)現(xiàn)

gulp.task("default",["server","watch"]);

表示先打開server,再打開watch扰藕,就可以進(jìn)行實(shí)時(shí)監(jiān)測(cè)缓苛,實(shí)現(xiàn)本地修改保存,服務(wù)器自動(dòng)修改

服務(wù)器代理(解決跨域問題)

安裝http-proxy-middleware插件(gulp代理中間件插件)

npm install http-proxy-middleware

引入插件
let proxy = require('http-proxy-middleware’);
//開啟服務(wù)
gulp.task('proxyServer', function() {
    connect.server({
        root: 'src',
        port: 8888,
        middleware: function(connect, opt) {
            return [
                proxy('/api',  {
                    target: 'https://api.douban.com/v2',    //代理的目標(biāo)地址
                    changeOrigin:true
                    pathRewrite:{    //路徑重寫規(guī)則
                        '^/api':''
                    }
                })
            ]
        }
    });
});
說明:proxy()參數(shù)解釋
  • '/api' => 匹配你要代理的請(qǐng)求地址前綴
  • target => 你要把請(qǐng)求代理到哪
  • pathRewrite => 是把在頁面中寫的請(qǐng)求地址的某部分的重寫為后面的字符串
此時(shí)頁面中請(qǐng)求的寫法:
$.post('/api/book/1226666',function(data){
    console.log(data);
})
 // 也就是發(fā)往 /api/book/1226666的請(qǐng)求最終會(huì)被發(fā)往 https://api.douban.com/v2/book/1226666

文件拷貝

我們可以通過剛剛學(xué)習(xí)的拷貝命令去拷貝其他項(xiàng)目中的文件邓深,包括項(xiàng)目中的圖片

gulp.task("images",()=>{
    return gulp.src("images/*.jpg").pipe(gulp.dest("dist/images"))  //*代表所有
})

拷貝多種文件及文件夾:

  • 拷貝多種后綴名

gulp.src("images/*.{jpg,png}")

  • 如果要拷貝文件夾下所有內(nèi)容

gulp.src("images//")

  • 如果要拷貝所有的話未桥, 可以使用 images/*/ 去表示當(dāng)前images文件夾下所有的內(nèi)容全部進(jìn)行拷貝。

  • 將兩個(gè)文件夾拷貝到同一個(gè)目標(biāo)文件夾下

gulp.src(['xml/.xml','json/.json']).pipe(gulp.dest('dist/data’))

  • 排除 !

gulp.src(['xml/.xml','json/.json','!json/secret.json']).pipe(gulp.dest('dist/data'))

  • 任務(wù)合并執(zhí)行
gulp.task('build',['index-copy','image-copy','data'],()=>{
    console.log('編譯成功')
})

偵測(cè)文件變化庐完,自動(dòng)執(zhí)行任務(wù)
gulp.watch()

gulp.task('watch',()=>{
    gulp.watch('index.html',['index-copy']);
    gulp.watch('images/**/*',['images-copy']);
    gulp.watch(['json/*.json','xml/*.xml','!json/secret.json'],['data']);
})

偵測(cè)自動(dòng)執(zhí)行钢属,如果文件發(fā)生改變那么將執(zhí)行對(duì)應(yīng)任務(wù)。

ES6轉(zhuǎn)ES5 gulp-babel

用于將es6轉(zhuǎn)成es5需要先安裝babel插件

npm install gulp-babel@7

再安裝babel上的將es6轉(zhuǎn)成es5的插件

npm install babel-preset-es2015

根據(jù)babel指引不需要這個(gè)门躯,但是實(shí)際少了會(huì)報(bào)錯(cuò)

npm install babel-core

在當(dāng)前gulp目錄中淆党,創(chuàng)建.babelrc的文件,里面的內(nèi)容是{"presets":["es2015"]}

gulp.task('toes5',()=>{
    return gulp.src(['js/*.js'])
    .pipe(babel())
    .pipe(gulp.dest('dist/js'))
})

gulp合并插件 gulp-concat用于合并js文件

gulp.task('scripts',()=>{
    return gulp.src(['js/nav.js','js/banner.js’])
    .pipe(babel())
    .pipe(concat('index.js'))
    .pipe(gulp.dest('dist/js'))
})

gulp代碼壓縮插件gulp-uglify

gulp.task('scripts',()=>{
    return gulp.src(['js/nav.js','js/banner.js’])
    .pipe(babel())
    .pipe(concat('index.js'))
    .pipe(uglify())
    .pipe(gulp.dest('dist/js'))
})

我們是否可以保存兩份js文件讶凉,一份已經(jīng)壓縮染乌,另一份沒有壓縮的那?

重命名 gulp-rename插件

gulp.task('scripts',()=>{
    return gulp.src(['js/nav.js','js/banner.js’])
    .pipe(babel())
    .pipe(concat('index.js'))
    .pipe(gulp.dest('dist/js'))
    .pipe(uglify())
    .pipe(rename('index.min.js'))
    .pipe(gulp.dest('dist/js'))
})

css壓縮 gulp-minify-css

此處需要配合sass插件懂讯,將sass文件先編譯成css文件后荷憋,在進(jìn)行壓縮

gulp.task('sass',()=>{
    return gulp.src('stylesheet/**/*.scss')
    .pipe(sass())
    .pipe(minifyCSS())
    .pipe(gulp.dest('dist/css'))
})

圖片壓縮gulp-imagemin插件

gulp.task('image-copy',()=>{
    return gulp.src('images/**/*’)
    .pipe(imagemin())
    .pipe(gulp.dest('dist/images'))
})

gulp插件

插件官網(wǎng)http://gulpjs.com/plugins/
將插件安裝到本地之后, 要require引入之后才可以正常使用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末褐望,一起剝皮案震驚了整個(gè)濱河市勒庄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瘫里,老刑警劉巖实蔽,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異谨读,居然都是意外死亡局装,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铐尚,“玉大人拨脉,你說我怎么就攤上這事⌒觯” “怎么了玫膀?”我有些...
    開封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)统舀。 經(jīng)常有香客問我匆骗,道長(zhǎng),這世上最難降的妖魔是什么誉简? 我笑而不...
    開封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮盟广,結(jié)果婚禮上闷串,老公的妹妹穿的比我還像新娘。我一直安慰自己筋量,他們只是感情好烹吵,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著桨武,像睡著了一般肋拔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上呀酸,一...
    開封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天凉蜂,我揣著相機(jī)與錄音,去河邊找鬼性誉。 笑死窿吩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的错览。 我是一名探鬼主播纫雁,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼倾哺!你這毒婦竟也來了轧邪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤羞海,失蹤者是張志新(化名)和其女友劉穎忌愚,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扣猫,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡菜循,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片癌幕。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡衙耕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出勺远,到底是詐尸還是另有隱情橙喘,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布胶逢,位于F島的核電站厅瞎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏初坠。R本人自食惡果不足惜和簸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望碟刺。 院中可真熱鬧锁保,春花似錦、人聲如沸半沽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽者填。三九已至浩村,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間占哟,已是汗流浹背心墅。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留重挑,地道東北人嗓化。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像谬哀,于是被迫代替她去往敵國(guó)和親刺覆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

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

  • babel官網(wǎng) babel 介紹 Babel 是一個(gè)通用的多用途 JavaScript 編譯器史煎。通過 Babel ...
    鋒享前端閱讀 1,820評(píng)論 0 10
  • 我的新作觀點(diǎn)網(wǎng)http://www.guandn.com(觀點(diǎn)網(wǎng)是一個(gè)獵獲新奇篇梭、收獲知識(shí)氢橙、重在獨(dú)立思考的網(wǎng)站),它...
    pizCat閱讀 2,452評(píng)論 1 18
  • 前言 眾所周知目前比較火的工具就是gulp和webpack恬偷,但webpack和gulp卻有所不同悍手,本人兩者的底層研...
    cduyzh閱讀 1,369評(píng)論 0 13
  • gulpjs是一個(gè)前端構(gòu)建工具,與gruntjs相比,gulpjs無需寫一大堆繁雜的配置參數(shù)坦康,API也非常簡(jiǎn)單竣付,學(xué)...
    井皮皮閱讀 1,301評(píng)論 0 10
  • 傲雪凌霜 風(fēng)寂寞 雪飄落 穿越千年 自從走近你的那一刻 沸騰的庫(kù)機(jī)人 那么的強(qiáng)勁有力 只因你 庫(kù)機(jī)的魔力 車窗外有...
    益樂閱讀 464評(píng)論 0 2