細說gulp


一、概述&安裝

Gulp,簡而言之,就是前端自動化開發工具,利用它,我們可以提高開發效率。

比如:

  1、  壓縮js

  2、  壓縮css

  3、  壓縮less

  4、  壓縮圖片

  等等…

我們完全可以利用Gulp來自動化地完成這些重復性很強的工作。

好了,廢話不多說了。既然要了解Gulp,就得先安裝它。

Gulp是基於node來實現的,so你得先有個node環境(見“初探nodeJS”)

node環境有了后,安裝Gulp就很easy咯。

命令行中,輸入npm install gulp –g就OK啦。(-g代表全局)。

如下:

安裝完成后,輸入gulp –v查看是否安裝成功。

如下:

 

但,就算你這么安裝了全局gulp,你每次到項目中時,還得在相應目錄下安裝gulp。

原因就是,gulp就這么設置的,避免發生版本沖突

所以這步安裝gulp可以可無,不過就當初步了解它嘛。

二、小試牛刀之壓縮Javascript

因為gulp是自動化工具,所以我們得告訴它,需要怎么做,才能達到我們的目的。

我們首先得新建一個js文件,用來編寫我們的需求,以便gulp能按着我們的意願來執行。

如,我將這個js文件取名叫gulpfile( 且必須取為gulpfile名,否則在node環境下運行是,會報錯:No gulpfile found),並放置在D盤中的gulp文件夾里。

隨后,打開新建的gulpfile.js,開始我們的壓縮JavaScript之路吧。

gulp作為node的一個模塊,所以,第一步我們得在gulpfile.js里引入gulp這個模塊。

如下:

接着,因為我們此次的目的是壓縮JavaScript,所以還得引入一個壓縮Javascript的模塊(gulp-uglify)

如下:

最后,就是具體編寫我們的需求了。

如我的需求是,將script文件夾中的JavaScript文件壓縮到newScript文件夾中。

具體代碼如下:

//引入gulp
var gulp = require('gulp');
//引入gulp-uglify模塊,用於壓縮JS
var uglify = require('gulp-uglify');
//'firstScript'為我們自定義的任務名,匿名函數為'firstScript'具體任務
gulp.task('firstScript', function(){
    // 'script/*.js'是即將壓縮的js文件
    gulp.src('script/*.js')
        //uglify()是調用的壓縮方法,去壓縮js
        .pipe(uglify())
        //gulp.dest是將壓縮后的文件另存為哪的方法,如存到newScript文件夾中
        .pipe(gulp.dest('newScript'));        
});
EntireCode

好了,在node環境下運行上述代碼,不過不是利用node哈,因為是gulp,所以得用gulp命令,如下(’firstScript’為剛才自定義的任務名)

 

敲擊回車,執行:

 

但是,報錯。

原因:我們就沒有將gulp、gulp-uglify這兩個模塊到本地嘛。

咦,gulp,我們不在前面安裝了么?安裝的全局gulp呢

是的,是安裝了,但是大概為了避免gulp的版本沖突吧,所以我們還得安裝,所以全局安裝沒卵用。

請在命令中輸入npm install gulp和npm install gulp-uglify安裝它們。安裝好后,會發現在相應目錄下會多出個node_modules的文件夾,里面就涵蓋了我們安裝的模塊。

另外,再在script文件夾中加入一段js代碼用來測試壓縮效果,如:

function hello(){
    console.log('hello world');
};

好了,再次運行上述代碼。

得下圖:

Perfect!!這就壓縮好了,我們在script文件夾中發現多了一個newScript文件夾,且,里面有壓縮好的js文件哦。

截取壓縮好的js如下:

 

但,不知道大家發現上述的代碼有個不足沒?

如果文件改變了,我們每次都得自己手動在node環境下,輸入gulp + 相應任務名執行操作。

說好的自動化呢?

所以我們得修改上述代碼,讓其自動化--一旦script文件下的js文件變動,就自己自行壓縮。

利用gulp.watch方法,可監聽文件,來彌補這一不足,如:在這里監聽script下的js文件。(一旦變化,就自動壓縮)

如下:

 

//引入gulp
var gulp = require('gulp');
//引入gulp-uglify模塊,用於壓縮JS
var uglify = require('gulp-uglify');
//'firstScript'為我們自定義的任務名,匿名函數為'firstScript'具體任務
gulp.task('firstScript', function(){
    // 'script/*.js'是即將壓縮的js文件
    gulp.src('script/*.js')
        //uglify()是調用的壓縮方法,去壓縮js
        .pipe(uglify())
        //gulp.dest是將壓縮后的文件另存為哪的方法,如存到newScript文件夾中
        .pipe(gulp.dest('newScript'));        
});
//新增一個auto任務
gulp.task('auto', function(){
    //利用watch方法監聽script下的js文件,如果變動,則執行firstScript任務
    gulp.watch('script/*.js', ['firstScript']);
});
EntireCode

執行上述,只需在node環境下輸入gulp auto就OK啦,一旦script文件下的js文件改變,它就自動壓縮。

且,因為是監聽,所以當輸入gulp auto時,不會首先壓縮一遍script下js文件。

But,我們不還得輸入’auto’這個任務名嗎?!!

所以,為了更加完善,我們可以這么做:

//引入gulp
var gulp = require('gulp');
//引入gulp-uglify模塊,用於壓縮JS
var uglify = require('gulp-uglify');
//'firstScript'為我們自定義的任務名,匿名函數為'firstScript'具體任務
gulp.task('firstScript', function(){
    // 'script/*.js'是即將壓縮的js文件
    gulp.src('script/*.js')
        //uglify()是調用的壓縮方法,去壓縮js
        .pipe(uglify())
        //gulp.dest是將壓縮后的文件另存為哪的方法,如存到newScript文件夾中
        .pipe(gulp.dest('newScript'));        
});
//新增一個auto任務
gulp.task('auto', function(){
    //利用watch方法監聽script下的js文件,如果變動,則執行firstScript任務
    gulp.watch('script/*.js', ['firstScript']);
});
//將需要默認執行的任務名,添加到default任務中,如,添加上面的‘auto’任務
gulp.task('default',['auto']);
EntireCode  

注:default任務名不能改變哦。

這樣我們就可以直接在node環境下:gulp + 回車,去執行default中的相關任務。

但,上述代碼還是不夠完美,且不足還很大,就是:當gulp.watch方法監聽到script文件夾中的某個js代碼發生改變時,gulp會將script下所有的js都壓縮一遍,極大地影響性能。(不信,自己可以測試下)

納尼?這可如何是好。

不用怕,利用gulp-watch-path這個模塊,就可以做到修改了什么,就實時壓縮對應文件,而不是盲目地全壓縮。

代碼如下:

 

//引入gulp
var gulp = require('gulp');
//引入gulp-uglify模塊,用於壓縮JS
var uglify = require('gulp-uglify');
//引入gulp-watch-path
var watchPath = require('gulp-watch-path');
//'firstScript'為我們自定義的任務名,匿名函數為'firstScript'具體任務
gulp.task('firstScript', function(){
    // 'script/*.js'是即將壓縮的js文件
    gulp.src('script/*.js')
        //uglify()是調用的壓縮方法,去壓縮js
        .pipe(uglify())
        //gulp.dest是將壓縮后的文件另存為哪的方法,如存到newScript文件夾中
        .pipe(gulp.dest('newScript'));        
});
//新增一個auto任務
gulp.task('auto', function(){
    //利用watch方法監聽script下的js文件,如果變動,則執行firstScript任務
    //gulp.watch('script/*.js', ['firstScript']);
    //event為gulp.watch回調函數中的event
    gulp.watch('script/*.js', function(event){
        var paths = watchPath(event, 'script', 'newScript');
        gulp.src(paths.srcPath)
            .pipe(uglify())
            //paths.distDir為目錄文件,如果換成paths.distPath,會報錯:file already exists
            .pipe(gulp.dest(paths.distDir));
    });
});
//將需要默認執行的任務名,添加到default任務中,如,添加上面的‘auto’任務
gulp.task('default',['auto']);
EntireCode

上述代碼已經很完美了,但是壓縮的文件名與沒壓縮的文件名一樣滴,總感覺怪怪的,不是么?通常壓縮文件應該帶有min的后綴吧。所以我們再來修改修改。

引入gulp-rename這個模塊,用於重命名壓縮后的文件。

代碼如下:

//引入gulp
var gulp = require('gulp');
//引入gulp-uglify模塊,用於壓縮JS
var uglify = require('gulp-uglify');
//引入gulp-watch-path
var watchPath = require('gulp-watch-path');
//引入gulp-rename
var rename = require('gulp-rename');
//'firstScript'為我們自定義的任務名,匿名函數為'firstScript'具體任務
gulp.task('firstScript', function(){
    // 'script/*.js'是即將壓縮的js文件
    gulp.src('script/*.js')
        //uglify()是調用的壓縮方法,去壓縮js
        .pipe(uglify())
        //給壓縮后的文件,添加min后綴名
        .pipe(rename({suffix: '.min'}))
        //gulp.dest是將壓縮后的文件另存為哪的方法,如存到newScript文件夾中
        .pipe(gulp.dest('newScript'));        
});
//新增一個auto任務
gulp.task('auto', function(){
    //利用watch方法監聽script下的js文件,如果變動,則執行firstScript任務
    //gulp.watch('script/*.js', ['firstScript']);
    //event為gulp.watch回調函數中的event
    gulp.watch('script/*.js', function(event){
        var paths = watchPath(event, 'script', 'newScript');
        gulp.src(paths.srcPath)
            .pipe(uglify())
            //給壓縮后的文件,添加min后綴名
            .pipe(rename({suffix: '.min'}))
            //paths.distDir為目錄文件,如果換成paths.distPath,會報錯:file already exists
            .pipe(gulp.dest(paths.distDir));
    });
});
//將需要默認執行的任務名,添加到default任務中,如,添加上面的‘auto’任務
gulp.task('default',['auto']);
EntireCode  

OK,gulp來壓縮JavaScript之路,就到此為止咯。

三、其他

類似的:CSS、LESS、圖片等的壓縮與上述”小試牛刀之壓縮JavaScript”其實是一樣的道理,唯一的不同就是它們所引入的壓縮包不一樣。

如:

  CSS     -----    對應gulp-minify-css模塊

  LESS    -----    對應gulp-less模塊

  圖片    -----    對應gulp-imagemin模塊

  ...

晚安,everyone~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM