【前端工具】gulp構(gòu)建工具的基本使用

gulp

gulp是什么聂喇?

  • gulp是前端開發(fā)中經(jīng)常使用的自動化構(gòu)建工具辖源。自動化構(gòu)建又是什么?
  • 簡單來說希太,一個完整的項目需要經(jīng)歷兩個過程:開發(fā)階段development和項目上線階段production克饶。在程序中又常稱作開發(fā)環(huán)境和生產(chǎn)環(huán)境,其實并沒有多少含義誊辉,只是為了理清業(yè)務(wù)邏輯而已矾湃,了解就好。
  • 在開發(fā)環(huán)境我們的項目代碼需要把less轉(zhuǎn)成css(因為less不能直接被瀏覽器解析)堕澄,需要給css3中的屬性添加前綴邀跃,需要開啟服務(wù)器自動監(jiān)聽文件的變化(改了一個寬度顏色啊,改了一個函數(shù)方法啊等等)蛙紫,然后自動刷新頁面(減少手動操作拍屑,提高開發(fā)效率)。等等一些需要在開發(fā)階段解決的問題
  • 在生產(chǎn)環(huán)境我們的項目代碼也要進行許多處理坑傅,比如代碼的壓縮僵驰、圖片壓縮、去除調(diào)試語句唁毒、提取公共代碼等等蒜茴。
  • 所以,自動化構(gòu)建簡單來說就是進行上面的操作的枉证,而自動化構(gòu)建工具就集成了這一大堆的操作矮男,大大提高了開發(fā)效率。

那我們一起來用gulp構(gòu)建一個簡單的項目吧

提前操作:創(chuàng)建項目基本結(jié)構(gòu)

基本目錄結(jié)構(gòu)

第一步:安裝gulp

  • npm install gulp -g 安裝全局gulp
  • 以下都以gulp@3.9.1版本為例室谚,4.x版本請參考其他文檔毡鉴。如果不小心下載了4版本崔泵,可以使用npm install gulp@3.9.1 -g操作來覆蓋之前的版本
  • npm init -y 初始化項目
  • npm install gulp -D 安裝局部gulp依賴

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

  • gulpfile.js類似webpack中的配置文件,就是配置你到底要做哪些操作猪瞬。
  • 在gulpfile.js文件中寫入如下基礎(chǔ)代碼憎瘸,基本含義是:加載gulp模塊工具,然后創(chuàng)建默認任務(wù)陈瘦,default是固定寫法不能改變幌甘。后面的函數(shù)就是要執(zhí)行的操作。而task方法就是創(chuàng)建任務(wù)的gulp方法痊项。
  //gulpfile.js
  
  var gulp = require('gulp');
  
  gulp.task('default', function() {
      //將你的默認的任務(wù)操作代碼放在這里
  })
  • 還可以這樣寫用來把任務(wù)操作抽出
  //gulpfile.js
  
  var gulp = require('gulp');
  
  gulp.task("html", function () {}) //創(chuàng)建html操作任務(wù)锅风。"html"只是名稱,可以任意取
  gulp.task("css", function () {})  //創(chuàng)建css操作任務(wù)
  gulp.task("js", function () {})   //創(chuàng)建js操作任務(wù)
  
  //創(chuàng)建默認執(zhí)行任務(wù)鞍泉,執(zhí)行內(nèi)容是 html操作任務(wù)皱埠、css操作任務(wù)、js操作任務(wù)
  gulp.task('default', ["html","css","js"]) 

第三步:運行g(shù)ulp

  • 命令行執(zhí)行
    $ gulp
  • 默認的名為"default"的任務(wù)將會被運行咖驮。

第四步:創(chuàng)建幾個基本任務(wù)

  • 創(chuàng)建"default"默認任務(wù)并把任務(wù)操作分發(fā)給其他任務(wù)
  • 創(chuàng)建"html"任務(wù)用于對html文件的操作
  • 創(chuàng)建"css"任務(wù)用于對css文件的操作
  • 創(chuàng)建"js"任務(wù)用于對js文件的操作
  • 創(chuàng)建"image"任務(wù)用于對圖片的操作
//gulpfile.js

    //加載gulp模塊
    var gulp = require('gulp');

    // 創(chuàng)建html任務(wù)
    gulp.task("html", function () {
    
    })
    // 創(chuàng)建css任務(wù)
    gulp.task("css", function () {
    
    })
    // 創(chuàng)建js任務(wù)
    gulp.task("js", function () {
        
    })
    // 創(chuàng)建image任務(wù)
    gulp.task("image", function () {
        
    })

    //創(chuàng)建默認任務(wù)边器,默認任務(wù)正好是創(chuàng)建的html任務(wù),運行g(shù)ulp會自動執(zhí)行默認任務(wù)
    gulp.task("default", ["html", "css", "js", "image"]);

第五步:給各個任務(wù)添加具體操作:獲取文件-->輸出文件

  • gulp.src方法含義:簡單來說就是獲取文件托修,要對哪一個文件進行操作忘巧。
  • gulp.pipe方法含義:gulp操作是基于的操作,我們把整個操作過程都當作一條水管睦刃,pipe方法類似于把每一步操作放到水管中砚嘴。
  • gulp.dest方法含義:簡單來說就是文件操作完了輸出到哪里。
  • 一般我們會創(chuàng)建兩個目錄眯勾,一個是開發(fā)環(huán)境目錄./src 一個是生產(chǎn)環(huán)境目錄./dist枣宫。如果沒有創(chuàng)建生產(chǎn)環(huán)境目錄,gulp操作完成之后會自動創(chuàng)建目錄吃环,并且dist目錄下輸出的文集及目錄也會按照輸出的地址自動創(chuàng)建也颤。
    //路徑管理 以便后續(xù)文件路徑更改操作
    var folder = {
        src: "src/",
        dist: "dist/"   //生產(chǎn)環(huán)境的目錄,如果沒有創(chuàng)建gulp操作會自動創(chuàng)建dist文件目錄
    }
    // 創(chuàng)建html任務(wù)
    gulp.task("html", function () {
        gulp.src(folder.src + "html/*")             //獲取html文件
            .pipe(gulp.dest(folder.dist + "html/")) //輸出文件 
    })
    // 創(chuàng)建css任務(wù)
    gulp.task("css", function () {
        gulp.src(folder.src + "css/*")              //獲取less文件
            .pipe(gulp.dest(folder.dist + "css/"))  //輸出文件
    })
    // 創(chuàng)建js任務(wù)
    gulp.task("js", function () {
       gulp.src(folder.src + "js/*")                //獲取js文件 
            pipe(gulp.dest(folder.dist + "js/"))    //輸出文件
    })
    // 創(chuàng)建image任務(wù)
    gulp.task("image", function () {
        gulp.src(folder.src + "image/*")             //獲取圖片
            .pipe(gulp.dest(folder.dist + "image/")) //輸出文件
    })

第六步:給各個任務(wù)添加具體操作:壓縮文件郁轻,轉(zhuǎn)換less翅娶,添加css前綴,去除js調(diào)試語句

  • 這一步驟需要gulp的插件支持好唯,如何使用插件進行操作竭沫?
  • 插件使用的基本過程:下載插件 --> 取到插件 --> 應(yīng)用插件
  • 下載插件
    $ npm install gulp-htmlclean    
    $ npm install gulp-imagemin
    $ npm install gulp-uglify
    $ npm install gulp-strip-debug
    $ npm install gulp-less
    $ npm install gulp-postcss autoprefixer
    $ npm install gulp-strip-debug
  • 獲取插件
// 添加如下代碼
// 壓縮html
// 下載插件 gulp-htmlclean
var htmlClean = require('gulp-htmlclean');   //取到插件

// 壓縮圖片
// 下載插件 gulp-imagemin
var imageMin = require('gulp-imagemin');

// 壓縮js
// 下載插件 gulp-uglify
var uglify = require('gulp-uglify');

// 去掉js中的調(diào)試語句
// 下載插件 gulp-strip-debug
var debug = require('gulp-strip-debug');

// 壓縮css 
// 下載插件 gulp-clean-css
var cleanCss = require('gulp-clean-css')

// 給css添加前綴
// 下載插件 gulp-postcss  autoprefixer
var postcss = require('gulp-postcss')
var autoprefixer = require('autoprefixer')

// less轉(zhuǎn)css
// 下載插件 gulp-less
var less = require('gulp-less');

  • 應(yīng)用插件
    //更新之前的代碼
    // 創(chuàng)建html任務(wù)
    gulp.task("html", function () {
        gulp.src(folder.src + "html/*")             //獲取html文件
            .pipe(htmlClean())                      //壓縮文件
            .pipe(gulp.dest(folder.dist + "html/")) //輸出文件
    })
    // 創(chuàng)建css任務(wù)
    gulp.task("css", function () {
       gulp.src(folder.src + "css/*")               //獲取less文件
            .pipe(less())                           //less轉(zhuǎn)css
            .pipe(postcss([autoprefixer()]));       //添加前綴
            .pipe(cleanCss())                       //壓縮css
            .pipe(gulp.dest(folder.dist + "css/"))  //輸出文件
    })
    // 創(chuàng)建js任務(wù)
    gulp.task("js", function () {
        gulp.src(folder.src + "js/*")               //獲取js文件 
            .pipe(debug())                          //清除調(diào)試語句
            .pipe(uglify())                         //壓縮js文件
            .pipe(gulp.dest(folder.dist + "js/"))   //輸出文件
    })
    // 創(chuàng)建image任務(wù)
    gulp.task("image", function () {
        gulp.src(folder.src + "image/*")            //獲取圖片
            .pipe(imageMin())                       //執(zhí)行壓縮插件
            .pipe(gulp.dest(folder.dist + "image/"))//輸出文件
    })
  • 這樣基本上該有的能力都有了,但還剩一個問題沒解決

第七步:開啟服務(wù)器代理和自動監(jiān)聽文件變化并刷新頁面

  • 理清思路:gulp上開啟服務(wù)器需要依賴插件骑篙,那么我們下載插件并獲取到
    $ npm install gulp-connect
    // 開啟服務(wù)器
    // 下載插件 gulp-connect
    var connect = require('gulp-connect')
  • 如何開啟蜕提?需要創(chuàng)建開啟服務(wù)器的任務(wù)"server"
    //開啟服務(wù)器任務(wù)
    gulp.task('server', function () {
        connect.server({
            port: "8888",           // 設(shè)置端口號,不設(shè)置默認8080
            livereload: true        //開啟刷新,什么時候刷新呢靶端?需要在各個任務(wù)函數(shù)中設(shè)置
        });
    })
    gulp.task("default", ["html", "css", "js", "image", "server"]); //默認任務(wù)中也要添加服務(wù)器任務(wù)
  • 開啟了服務(wù)器運行$ gulp就可以在http://localhost:8888/中查看我們的頁面了谎势。
  • 接下來是監(jiān)聽文件變化凛膏,同樣的也需要創(chuàng)建監(jiān)聽任務(wù)
    // 創(chuàng)建監(jiān)聽任務(wù)
    gulp.task('watch', function () {
        gulp.watch(folder.src + 'html/*', ['html'])  //監(jiān)聽html文件,一旦文件變化就執(zhí)行html任務(wù)
        gulp.watch(folder.src + 'css/*', ['css'])    //監(jiān)聽css文件
        gulp.watch(folder.src + 'js/*', ['js'])      //監(jiān)聽js文件
    })
    gulp.task("default", ["html", "css", "js", "image", "server", "watch"]); //默認任務(wù)中也要添加監(jiān)聽任務(wù)
  • 接下來是自動刷新脏榆,上面設(shè)置了自動刷新livereload: true,但是需要明確幾點
    1. 開啟監(jiān)聽任務(wù)并不能自動刷新頁面猖毫,因為監(jiān)聽任務(wù)只監(jiān)聽變化,并不會幫助自動刷新頁面须喂。
    2. 自動刷新功能是開啟了吁断,但是什么時候自動刷新呢? 當然是在代碼內(nèi)容發(fā)生更改的時候自動刷新頁面
    3. 所以我們在各個任務(wù)操作函數(shù)中進行添加自動刷新操作gulp.pipe(connect.reload())
    4. 拿html任務(wù)舉例坞生,其余任務(wù)類似
    //更新之前的代碼
    gulp.task("html", function () {
        gulp.src(folder.src + "html/*") 
            .pipe(connect.reload());             //每次文件改變刷新頁面
            .pipe(htmlClean())                   //壓縮文件
            .pipe(gulp.dest(folder.dist + "html/"))  
    })

第八步:針對不同環(huán)境進行操作

  • 由于上面操作集合了開發(fā)環(huán)境和生產(chǎn)環(huán)境仔役,不利于開發(fā),下面將兩者操作分開
  • 其實就是讓開發(fā)階段做開發(fā)的事恨胚,項目上線階段做上線的事(壓縮代碼等操作)
  • 需要明確幾點:
  • 如何設(shè)置當前的操作環(huán)境骂因,比如我就想設(shè)置一下當前是在開發(fā)環(huán)境下,可以在命令行中執(zhí)行:
   $ export NODE_ENV=development    # 同樣的,生產(chǎn)環(huán)境是production
  • 那么如何判斷當前處在什么環(huán)境呢赃泡?從而執(zhí)行$ gulp進行不同環(huán)境下的任務(wù)操作
  • 有如下方法進行判斷
    var devMode = process.env.NODE_ENV == "development"; //判斷環(huán)境變量
  • 所以就可以在各個任務(wù)函數(shù)中判斷當前所處環(huán)境,再進行不同操作乘盼,如下升熊,以html任務(wù)為例,其他任務(wù)同理
    //更新之前的代碼
    gulp.task("html", function () {
        var page = gulp.src(folder.src + "html/*")  
                        .pipe(connect.reload());     //每次文件改變刷新頁面
        if (!devMode) {                              //如果是生產(chǎn)環(huán)境
            page.pipe(htmlClean())                   //壓縮文件
        }
        page.pipe(gulp.dest(folder.dist + "html/"))  
    })
  • 這樣整個項目利用gulp的簡單構(gòu)建就完成了绸栅。如果有錯誤歡迎指出级野,共同學習。以上都是本人手敲的粹胯,如果覺得不錯不妨點個小心心
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蓖柔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子风纠,更是在濱河造成了極大的恐慌况鸣,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竹观,死亡現(xiàn)場離奇詭異镐捧,居然都是意外死亡,警方通過查閱死者的電腦和手機臭增,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門懂酱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人誊抛,你說我怎么就攤上這事列牺。” “怎么了拗窃?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵瞎领,是天一觀的道長泌辫。 經(jīng)常有香客問我,道長默刚,這世上最難降的妖魔是什么甥郑? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮荤西,結(jié)果婚禮上澜搅,老公的妹妹穿的比我還像新娘。我一直安慰自己邪锌,他們只是感情好勉躺,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著觅丰,像睡著了一般饵溅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上妇萄,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天蜕企,我揣著相機與錄音,去河邊找鬼冠句。 笑死轻掩,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的懦底。 我是一名探鬼主播唇牧,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼聚唐!你這毒婦竟也來了丐重?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤杆查,失蹤者是張志新(化名)和其女友劉穎扮惦,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體根灯,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡径缅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了烙肺。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纳猪。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖桃笙,靈堂內(nèi)的尸體忽然破棺而出氏堤,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布鼠锈,位于F島的核電站闪檬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏购笆。R本人自食惡果不足惜粗悯,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望同欠。 院中可真熱鬧样傍,春花似錦、人聲如沸铺遂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽襟锐。三九已至撤逢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間粮坞,已是汗流浹背蚊荣。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留莫杈,地道東北人妇押。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像姓迅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子俊马,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350