Gulp入門教程

Gulp簡介

最近流行前端構建工具,苦于之前使用Grunt总棵,代碼很難閱讀改含,現(xiàn)在出了Gulp,真是擺脫了痛苦骤视。發(fā)現(xiàn)了一篇很好的Gulp英文教程鹃觉,整理翻譯給大家看看。

為什么使用Gulp

Gulp基于Node.js的前端構建工具祷肯,通過Gulp的插件可以實現(xiàn)前端代碼的編譯(sass疗隶、less)、壓縮蒋纬、測試;圖片的壓縮法牲;瀏覽器自動刷新琼掠,還有許多強大的插件可以在這里查找瓷蛙。比起Grunt不僅配置簡單而且更容易閱讀和維護,我們可以做一個對比:

Grunt:

sass: {
  dist: {
    options: {
      style: 'expanded'
    },
    files: {
      'dist/assets/css/main.css': 'src/styles/main.scss',
    }
  }
},
autoprefixer: {
  dist: {
    options: {
      browsers: [
        'last 2 version', 'safari 5', 'ie 8', 'ie 9', 'opera 12.1', 'ios 6', 'android 4'
      ]
    },
    src: 'dist/assets/css/main.css',
    dest: 'dist/assets/css/main.css'
  }
},
grunt.registerTask('styles', ['sass', 'autoprefixer']);

在Grunt里面横堡,每個插件使用的方式相對獨立冠桃,正如上面的代碼通過sass插件將main.sass文件編譯成main.css文件,接著autoprefixer插件再對編譯好的main.css文件進行修改胸蛛,最后覆蓋main.css樱报。那么覆蓋文件就是多余的了,有沒辦法做到sass和autoprefixer一并處理完再生成main.css民珍?我們來看看Gulp是如何做到的:

Gulp:

gulp.task('sass', function() {
  return gulp.src('src/styles/main.scss')
    .pipe(sass({ style: 'compressed' }))
    .pipe(autoprefixer('last 2 version', 'safari 5', 'ie 8', 'ie 9', 'opera 12.1', 'ios 6', 'android 4'))
    .pipe(gulp.dest('dist/assets/css'))
});

使用Gulp我們只需要放一個路徑盗飒,通過管道方式使用插件逆趣,最后生成文件,是不是有種jQuery的感覺身坐。這種方式不僅提高效率而且一眼就看清了輸入文件和輸出文件落包,再也不用看gruntfile看得眼花繚亂了。

再打個比喻涯鲁,Grunt的插件就像獨立的工廠,這個工廠生成出來的產(chǎn)品打包封裝好后再送到另一個工廠去加工岛请,使用了Gulp后實現(xiàn)了工廠的合并警绩,所有東西都在一個工廠里完成了。現(xiàn)在是否對Gulp感興趣了后室,那就開始使用Gulp吧混狠!

安裝

首先我們要全局安裝一遍:

$ npm install gulp -g

接著我們要進去到項目的根目錄再安裝一遍(確保你根目錄存在package.json文件):

$ npm install gulp --save-dev

—save-dev這個屬性會將條目保存到你package.json的devDependencies里面

安裝Gulp插件

我們將要使用Gulp插件來完成我們以下任務:

安裝這些插件需要運行如下命令:

$ npm install gulp-ruby-sass gulp-autoprefixer gulp-minify-css gulp-jshint gulp-concat gulp-uglify gulp-imagemin gulp-notify gulp-rename gulp-livereload gulp-cache del --save-dev

上面是一些常用的插件予弧,如果想要找更多的插件點擊這里

加載插件

接著我們要創(chuàng)建一個gulpfile.js在根目錄下,然后在里面加載插件:

var gulp = require('gulp'),
    sass = require('gulp-ruby-sass'),
    autoprefixer = require('gulp-autoprefixer'),
    minifycss = require('gulp-minify-css'),
    jshint = require('gulp-jshint'),
    uglify = require('gulp-uglify'),
    imagemin = require('gulp-imagemin'),
    rename = require('gulp-rename'),
    concat = require('gulp-concat'),
    notify = require('gulp-notify'),
    cache = require('gulp-cache'),
    livereload = require('gulp-livereload'),
    del = require('del');

Gulp的插件和Grunt有些許不一樣皇筛,Grunt插件是為了更好的完成一項任務坠七。就像Grunt的imagemin插件就利用了緩存來避免重復壓縮彪置,而Gulp要利用gulp-cache來完成蝇恶,當然啦,不僅限定于緩存圖片潘懊。

建立任務

編譯sass贿衍、自動添加css前綴和壓縮

首先我們編譯sass,添加前綴释树,保存到我們指定的目錄下面,還沒結束秸仙,我們還要壓縮桩盲,給文件添加.min后綴再輸出壓縮文件到指定目錄,最后提醒任務完成了:

gulp.task('styles', function() {
  return gulp.src('src/styles/main.scss')
    .pipe(sass({ style: 'expanded' }))
    .pipe(autoprefixer('last 2 version', 'safari 5', 'ie 8', 'ie 9', 'opera 12.1', 'ios 6', 'android 4'))
    .pipe(gulp.dest('dist/assets/css'))
    .pipe(rename({suffix: '.min'}))
    .pipe(minifycss())
    .pipe(gulp.dest('dist/assets/css'))
    .pipe(notify({ message: 'Styles task complete' }));
});

讓我解釋一下:

gulp.task('styles', function () {...});

gulp.task這個API用來創(chuàng)建任務弊攘,在命令行下可以輸入$ gulp styles來執(zhí)行上面的任務襟交。

return gulp.src('src/styles/main.scss')

gulp.src這個API設置需要處理的文件的路徑伤靠,可以是多個文件以數(shù)組的形式[main.scss, vender.scss],也可以是正則表達式/*/.scss焕梅。

.pipe(sass({ style: 'expanded' }))

我們使用.pipe()這個API將需要處理的文件導向sass插件卦洽,那些插件的用法可以在github上找到,為了方便大家查找我已經(jīng)在上面列出來了该窗。

.pipe(gulp.dest('dist/assets/css'));

gulp.dest()API設置生成文件的路徑蚤霞,一個任務可以有多個生成路徑,一個可以輸出未壓縮的版本规肴,另一個可以輸出壓縮后的版本夜畴。

為了更好的了解Gulp API,強烈建議看一下Gulp API文檔兑牡,其實Gulp API就這么幾個兔簇,沒什么好可怕的硬耍。

js代碼校驗边酒、合并和壓縮

希望大家已經(jīng)知道如何去創(chuàng)建一個任務了墩朦,接下來我們完成scripts的校驗、合并和壓縮的任務吧:

gulp.task('scripts', function() {
  return gulp.src('src/scripts/**/*.js')
    .pipe(jshint('.jshintrc'))
    .pipe(jshint.reporter('default'))
    .pipe(concat('main.js'))
    .pipe(gulp.dest('dist/assets/js'))
    .pipe(rename({suffix: '.min'}))
    .pipe(uglify())
    .pipe(gulp.dest('dist/assets/js'))
    .pipe(notify({ message: 'Scripts task complete' }));
});

需要提醒的是我們要設置JSHint的reporter方式牛哺,上面使用的是default默認的劳吠,了解更多點擊這里痒玩。

壓縮圖片

gulp.task('images', function() {
  return gulp.src('src/images/**/*')
    .pipe(imagemin({ optimizationLevel: 3, progressive: true, interlaced: true }))
    .pipe(gulp.dest('dist/assets/img'))
    .pipe(notify({ message: 'Images task complete' }));
});

這個任務使用imagemin插件把所有在src/images/目錄以及其子目錄下的所有圖片(文件)進行壓縮,我們可以進一步優(yōu)化奴曙,利用緩存保存已經(jīng)壓縮過的圖片草讶,使用之前裝過的gulp-cache插件,不過要修改一下上面的代碼:

將這行代碼:

.pipe(imagemin({ optimizationLevel: 3, progressive: true, interlaced: true }))

修改成:

.pipe(cache(imagemin({ optimizationLevel: 5, progressive: true, interlaced: true })))

現(xiàn)在坤溃,只有新建或者修改過的圖片才會被壓縮了践啄。

清除文件

在任務執(zhí)行前屿讽,最好先清除之前生成的文件:

gulp.task('clean', function(cb) {
    del(['dist/assets/css', 'dist/assets/js', 'dist/assets/img'], cb)
});

在這里沒有必要使用Gulp插件了吠裆,可以使用NPM提供的插件。我們用一個回調函數(shù)(cb)確保在退出前完成任務诵棵。

設置默認任務(default)

我們在命令行下輸入$ gulp執(zhí)行的就是默認任務履澳,現(xiàn)在我們?yōu)槟J任務指定執(zhí)行上面寫好的三個任務:

gulp.task('default', ['clean'], function() {
    gulp.start('styles', 'scripts', 'images');
});

在這個例子里面,clean任務執(zhí)行完成了才會去運行其他的任務柄冲,在gulp.start()里的任務執(zhí)行的順序是不確定的忠蝗,所以將要在它們之前執(zhí)行的任務寫在數(shù)組里面。

監(jiān)聽文件

為了監(jiān)聽文件的是否修改以便執(zhí)行相應的任務戒祠,我們需要創(chuàng)建一個新的任務速种,然后利用gulp.watchAPI實現(xiàn):

gulp.task('watch', function() {
  // Watch .scss files
  gulp.watch('src/styles/**/*.scss', ['styles']);
  // Watch .js files
  gulp.watch('src/scripts/**/*.js', ['scripts']);
  // Watch image files
  gulp.watch('src/images/**/*', ['images']);
});

我們將不同類型的文件分開處理配阵,執(zhí)行對應的數(shù)組里的任務。現(xiàn)在我們可以在命令行輸入$ gulp watch執(zhí)行監(jiān)聽任務饱亮,當.sass舍沙、.js和圖片修改時將執(zhí)行對應的任務。

自動刷新頁面

Gulp也可以實現(xiàn)當文件修改時自動刷新頁面壹无,我們要修改watch任務感帅,配置LiveReload:

gulp.task('watch', function() {
  // Create LiveReload server
  livereload.listen();
  // Watch any files in dist/, reload on change
  gulp.watch(['dist/**']).on('change', livereload.changed);
});

要使這個能夠工作失球,還需要在瀏覽器上安裝LiveReload插件,除此之外還能這樣做

所有

/*!
 * gulp
 * $ npm install gulp-ruby-sass gulp-autoprefixer gulp-minify-css gulp-jshint gulp-concat gulp-uglify gulp-imagemin gulp-notify gulp-rename gulp-livereload gulp-cache del --save-dev
 */
// Load plugins
var gulp = require('gulp'),
    sass = require('gulp-ruby-sass'),
    autoprefixer = require('gulp-autoprefixer'),
    minifycss = require('gulp-minify-css'),
    jshint = require('gulp-jshint'),
    uglify = require('gulp-uglify'),
    imagemin = require('gulp-imagemin'),
    rename = require('gulp-rename'),
    concat = require('gulp-concat'),
    notify = require('gulp-notify'),
    cache = require('gulp-cache'),
    livereload = require('gulp-livereload'),
    del = require('del');
// Styles
gulp.task('styles', function() {
  return gulp.src('src/styles/main.scss')
    .pipe(sass({ style: 'expanded', }))
    .pipe(autoprefixer('last 2 version', 'safari 5', 'ie 8', 'ie 9', 'opera 12.1', 'ios 6', 'android 4'))
    .pipe(gulp.dest('dist/styles'))
    .pipe(rename({ suffix: '.min' }))
    .pipe(minifycss())
    .pipe(gulp.dest('dist/styles'))
    .pipe(notify({ message: 'Styles task complete' }));
});
// Scripts
gulp.task('scripts', function() {
  return gulp.src('src/scripts/**/*.js')
    .pipe(jshint('.jshintrc'))
    .pipe(jshint.reporter('default'))
    .pipe(concat('main.js'))
    .pipe(gulp.dest('dist/scripts'))
    .pipe(rename({ suffix: '.min' }))
    .pipe(uglify())
    .pipe(gulp.dest('dist/scripts'))
    .pipe(notify({ message: 'Scripts task complete' }));
});
// Images
gulp.task('images', function() {
  return gulp.src('src/images/**/*')
    .pipe(cache(imagemin({ optimizationLevel: 3, progressive: true, interlaced: true })))
    .pipe(gulp.dest('dist/images'))
    .pipe(notify({ message: 'Images task complete' }));
});
// Clean
gulp.task('clean', function(cb) {
    del(['dist/assets/css', 'dist/assets/js', 'dist/assets/img'], cb)
});
// Default task
gulp.task('default', ['clean'], function() {
    gulp.start('styles', 'scripts', 'images');
});
// Watch
gulp.task('watch', function() {
  // Watch .scss files
  gulp.watch('src/styles/**/*.scss', ['styles']);
  // Watch .js files
  gulp.watch('src/scripts/**/*.js', ['scripts']);
  // Watch image files
  gulp.watch('src/images/**/*', ['images']);
  // Create LiveReload server
  livereload.listen();
  // Watch any files in dist/, reload on change
  gulp.watch(['dist/**']).on('change', livereload.changed);
});

在gist上有源碼,并且附上Grunt的實現(xiàn)作為對比聪轿。

參考鏈接:http://markgoodyear.com/2014/01/getting-started-with-gulp/
http://markpop.github.io/2014/09/17/Gulp%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末陆错,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子牧愁,更是在濱河造成了極大的恐慌外莲,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異声邦,居然都是意外死亡,警方通過查閱死者的電腦和手機邓了,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門骗炉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛇受,“玉大人,你說我怎么就攤上這事乍丈“呀” “怎么了察蹲?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長叼屠。 經(jīng)常有香客問我绞铃,道長嫂侍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任颓影,我火速辦了婚禮懒鉴,結果婚禮上,老公的妹妹穿的比我還像新娘璃俗。我一直安慰自己悉默,他們只是感情好,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著跟磨,像睡著了一般抵拘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上仑濒,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天墩瞳,我揣著相機與錄音,去河邊找鬼热凹。 笑死泪电,一個胖子當著我的面吹牛,可吹牛的內容都是我干的碟渺。 我是一名探鬼主播突诬,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼骏令!你這毒婦竟也來了垄提?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤摘昌,失蹤者是張志新(化名)和其女友劉穎聪黎,沒想到半個月后备恤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年侣姆,在試婚紗的時候發(fā)現(xiàn)自己被綠了沉噩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蚜厉,死狀恐怖昼牛,靈堂內的尸體忽然破棺而出康聂,到底是詐尸還是另有隱情,我是刑警寧澤伶椿,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站游昼,受9級特大地震影響尝蠕,放射性物質發(fā)生泄漏载庭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一靖榕、第九天 我趴在偏房一處隱蔽的房頂上張望茁计。 院中可真熱鬧谓松,春花似錦、人聲如沸娜膘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至颤枪,卻和暖如春淑际,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背春缕。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工盗胀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人锄贼。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓票灰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子屑迂,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內容

  • 簡介:gulp是前端開發(fā)過程中對代碼進行構建的工具浸策,是自動化項目的構建利器;她不僅能對網(wǎng)站資源進行優(yōu)化惹盼,而且在開發(fā)...
    情懷水岸閱讀 823評論 0 5
  • 最近使用gulp自動化構建工具來開發(fā)網(wǎng)站庸汗,在此給大家分享一下使用gulp的一些使用教程。 一 gulp安裝 1蚯舱、安...
    穿越人海遇見你閱讀 13,177評論 2 17
  • gulp是一個用來在web開發(fā)中完成一些自動化任務的工具,它常被用作以下任務: 啟動一個web服務器掩蛤; 保存代碼時...
    debt閱讀 273評論 0 1
  • gulpjs是一個前端構建工具枉昏,與gruntjs相比,gulpjs無需寫一大堆繁雜的配置參數(shù)揍鸟,API也非常簡單兄裂,學...
    依依玖玥閱讀 3,152評論 7 55
  • AMD:一種基于模塊的異步加載JavaScript代碼的機制,它推薦開發(fā)人員將JavaScript代碼封裝進一個個...
    Bruce_zhuan閱讀 1,599評論 0 1