1、概述&安裝 |
Gulp,簡而言之,就是前端自動化開發工具,利用它,咱們能夠提升開發效率。css
好比:html
一、 壓縮js前端
二、 壓縮cssnode
三、 壓縮lessnpm
四、 壓縮圖片gulp
等等…less
咱們徹底能夠利用Gulp來自動化地完成這些重複性很強的工做。ide
好了,廢話很少說了。既然要了解Gulp,就得先安裝它。函數
Gulp是基於node來實現的,so你得先有個node環境(見「初探nodeJS」)。工具
node環境有了後,安裝Gulp就很easy咯。
命令行中,輸入npm install gulp –g就OK啦。(-g表明全局)。
以下:
安裝完成後,輸入gulp –v查看是否安裝成功。
以下:
但,就算你這麼安裝了全局gulp,你每次到項目中時,還得在相應目錄下安裝gulp。
緣由就是,gulp就這麼設置的,避免發生版本衝突。
因此這步安裝gulp能夠可無,不過就當初步瞭解它嘛。
2、小試牛刀之壓縮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')); });
好了,在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']); });
執行上述,只需在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']);
注: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']);
上述代碼已經很完美了,可是壓縮的文件名與沒壓縮的文件名同樣滴,總感受怪怪的,不是麼?一般壓縮文件應該帶有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']);
OK,gulp來壓縮JavaScript之路,就到此爲止咯。
3、其餘 |
相似的:CSS、LESS、圖片等的壓縮與上述」小試牛刀之壓縮JavaScript」實際上是同樣的道理,惟一的不一樣就是它們所引入的壓縮包不同。
如:
CSS ----- 對應gulp-minify-css模塊
LESS ----- 對應gulp-less模塊
圖片 ----- 對應gulp-imagemin模塊
...
晚安,everyone~