gulp自動化構(gòu)建工具學(xué)習(xí)

原文地址:https://yawuling.com/201706251602.html

Gulp.js 是一個自動化構(gòu)建工具,開發(fā)者可以使用它在項(xiàng)目開發(fā)過程中自動執(zhí)行常見任務(wù)大刊。在這里介紹了gulp的入門跑杭,插件和gulpfile.js配置文件肛宋。

入門
  1. 全局安裝gulp

     $ npm install -g gulp
    
  2. 新建一個文件夾作為項(xiàng)目塌计,進(jìn)入該文件夾,初始化

     $ mkdir example
     $ npm init
    
  3. 安裝開發(fā)依賴(devDependences

     $ npm install --save-dev gulp
    
  4. 在項(xiàng)目根目錄新建 gulpfile.js 文件

     $ touch gulpfile.js
    
  5. 編輯gulpfile.js文件

    var gulp = require('gulp');
    
    gulp.task('default', function () {
        //默認(rèn)任務(wù)代碼
    });
    
  6. 命令行運(yùn)行g(shù)ulp蜈项,即可運(yùn)行默認(rèn)任務(wù)
    $ gulp


api介紹

這里只列出api常用用法给僵,了解更多請查閱官網(wǎng)http://www.gulpjs.com.cn/docs/api/

  1. gulp.src(globs[, options])

    輸出符合匹配的文件并返回一個stream滓玖,可pipe到其他插件

    • golbs(類型:StringArray)

      String: 'src/js/*.js'
      Array: ['src/js/*.js', 'src/css/*.css']

  2. gulp.dest(path[, options])

    pipe進(jìn)來的數(shù)據(jù)轉(zhuǎn)存為指定文件夾下的文件,若指定文件夾不存在叹阔,則自動創(chuàng)建該文件夾

    • path(類型:StringFunction)

      String: 'dist/js'
      Function: 在函數(shù)中返回相應(yīng)路徑

  3. gulp.task(name[, deps], fn)

    定義一個任務(wù)

    gulp.task('something', functio () {
        doSomething();
    });
    
    • name(類型:String)

      任務(wù)的名字挠轴,可在命令行中通過name運(yùn)行任務(wù),$ gulp name

    • deps(類型:Array)

      一個包含任務(wù)列表的數(shù)組耳幢,這些任務(wù)會在當(dāng)前任務(wù)運(yùn)行之前完成

    • fn(類型:Function)

      該任務(wù)要執(zhí)行的內(nèi)容

  4. gulp.watch(glob[, opts], tasks) 或 gulp.watch(globs[, opts, cb])

    文件監(jiān)視岸晦,當(dāng)指定匹配文件發(fā)生變化時,執(zhí)行tasks或函數(shù)cb

    • glob(類型:StringArray)

    • tasks(類型:StringArray)

      文件變動后執(zhí)行之前定義好的任務(wù)

    • cb(類型: Function)

      傳入一個記錄文件變動的event對象,event.type記錄變動類型:added, changed, deleted启上;event.path記錄變動文件的路徑


gulp插件介紹
  1. gulp-less/gulp-sass

    預(yù)編譯less/sass文件為css文件

    安裝:$ npm install --save-dev gulp-less

  2. gulp-autoprefixer

    設(shè)置瀏覽器版本邢隧,css文件自動添加瀏覽器前綴

    安裝:$ npm install --save-dev gulp-autoprefixer

  3. gulp-minify-css

    壓縮css文件

    安裝:$ npm install --save-dev gulp-minify-css

  4. gulp-rename

    重命名要輸出的文件,如將.css重命名為.min.css

    安裝:$ npm install --save-dev gulp-rename

  5. vinyl-buffer

    將vinyl對象內(nèi)容中的stream轉(zhuǎn)換為buffer

    安裝:$ npm install --save-dev vinyl-buffer

  6. vinyl-source-stream

    將Browserify的bundle()的輸出轉(zhuǎn)換為Gulp可用的vinyl流

    安裝:$ npm install --save-dev vinyl-source-stream

  7. gulp-sourcemaps

    編寫內(nèi)聯(lián)sourcemaps

    安裝:$ npm install --save-dev gulp-sourcemaps

  8. browserify

    可以讓你使用類似于 node 的 require() 的方式來組織瀏覽器端的 Javascript 代碼冈在,在這里用來管理依賴

    安裝:$ npm install --save-dev browserify

  9. babelify

    將ES6轉(zhuǎn)換成ES5

    安裝:$ npm install --save-dev babelify

  10. gulp-uglify

    壓縮 JavaScript 文件

    安裝:$ npm install --save-dev gulp-uglify

  11. gulp-imagemin

    壓縮 png倒慧,jpeg,gif和svg圖片資源

    安裝:$ npm install --save-dev gulp-imagemin

  12. gulp-cache

    圖片緩存,只有圖片替換了才壓縮

    安裝:$ npm install --save-dev gulp-cache

  13. gulp-clean

    移除文件或文件夾

    安裝:$ npm install --save-dev gulp-clean

  14. gulp-util

    包含gulp的一些實(shí)用功能心剥,在這里用來打印編譯錯誤

    安裝:$ npm install --save-dev gulp-util

  15. gulp-notify

    當(dāng)文件變更時提醒

    安裝:$ npm install gulp-notify

  16. gulp-connect

    gulp中用來運(yùn)行服務(wù)器的插件拇泛,內(nèi)含LiveReload,自動刷新瀏覽器

    安裝:$ npm install --save-dev gulp-connect


gulpfile.js文件配置
  • 內(nèi)含 ES6 轉(zhuǎn) ES5
var gulp = require('gulp'),
    less = require('gulp-less'),
    autoprefixer = require('gulp-autoprefixer'),
    minifycss = require('gulp-minify-css'),
    uglify = require('gulp-uglify'),
    imagemin = require('gulp-imagemin'),
    rename = require('gulp-rename'),
    clean = require('gulp-clean'),
    cache = require('gulp-cache'),
    notify = require('gulp-notify'),
    browserify = require('browserify'),
    babelify = require('babelify'),
    buffer = require('vinyl-buffer'),
    source = require('vinyl-source-stream'),
    sourcemaps = require('gulp-sourcemaps'),
    gutil = require('gulp-util'),
    connect = require('gulp-connect');

/*
 * styles任務(wù)系宜,將'src/less'目錄下的less文件轉(zhuǎn)換成css文件,
 * 并加上瀏覽器前綴发魄,存放于'dist/css'目錄下盹牧,之后重命名加上.min,壓縮励幼,
 * 保存為.min.css文件汰寓,之后刷新瀏覽器,并提醒style任務(wù)完成
 */
gulp.task('styles', function() {
    return gulp.src('src/less/*.less')
        .pipe(less())
        .pipe(autoprefixer('last 2 version', 'safari 5', 'ie 8', 'ie 9', 'opera 12.1', 'ios 6', 'android 4'))
        .on('error', gutil.log)
        .pipe(gulp.dest('dist/css'))
        .pipe(rename({suffix: '.min'}))
        .pipe(sourcemaps.init())
        .pipe(minifycss())
        .pipe(sourcemaps.write('./'))
        .pipe(gulp.dest('dist/css'))
        .pipe(connect.reload())
        .pipe(notify({message: 'style task complete'});
});

/*
 * scripts任務(wù)苹粟,通過browserify設(shè)置入口文件有滑,然后用babelify將
 * es6轉(zhuǎn)換成es5,保存在'dist/js'目錄下嵌削,之后壓縮js文件毛好,重命名
 * 保存為.min.js文件
 */
gulp.task('scripts', function() {
    var b = browserify({
        entries: 'src/js/cart.js',
        debug: true
    });

    return b.transform(babelify.configure({
            presets: ["es2015"]
        }))
        .bundle()
        .on('error', gutil.log)
        .pipe(source('cart.js'))
        .pipe(gulp.dest('dist/js'))
        .pipe(buffer())
        .pipe(sourcemaps.init({loadMaps: true}))
        .pipe(uglify())
        .on('error', gutil.log)
        .pipe(sourcemaps.write('./'))
        .pipe(rename({ suffix: '.min'}))
        .pipe(gulp.dest('dist/js'))
        .pipe(connect.reload());
});

/*
 * images任務(wù),讀取'src/img'目錄下的圖片苛秕,壓縮并保存到'dist/img'目錄下
 */
gulp.task('images', function() {
    return gulp.src('src/img/*')
        .pipe(cache(imagemin([
            imagemin.gifsicle({interlaced: true}),
            imagemin.jpegtran({progressive: true}),
            imagemin.optipng({optimizationLevel: 5}),
            imagemin.svgo({plugins: [{removeViewBox: true}]})])))
        .on('error', gutil.log)
        .pipe(gulp.dest('dist/img'))
        .pipe(connect.reload());
});

/*
 * html任務(wù)肌访,讀取'src'目錄下的html文件,并保存到'dist'目錄下
 */
gulp.task('html', function() {
    return gulp.src('src/shangcheng/*.html')
        .pipe(gulp.dest('dist/'))
        .pipe(connect.reload());
});

/*
 * connect任務(wù)艇劫,運(yùn)行服務(wù)器并自動刷新瀏覽器
 */
gulp.task('connect', function() {
    connect.server({
        livereload: true
    });
});

/*
 * clean任務(wù)吼驶,將dist目錄下的css文件,js文件店煞,圖片文件和html文件清除
 */
gulp.task('clean', function() {
    return gulp.src(['dist/css', 'dist/js', 'dist/img', 'dist/*.html'], {read: false})
        .pipe(clean());
});

/*
 * 默認(rèn)任務(wù)蟹演,在開始執(zhí)行styles任務(wù),scripts任務(wù)浅缸,images任務(wù)轨帜,html任務(wù)之前先執(zhí)行clean任務(wù)
 */
gulp.task('default', ['clean'], function() {
    gulp.start('styles', 'scripts', 'images', 'html');
});

/*
 * 監(jiān)視任務(wù),監(jiān)聽less文件衩椒,js文件蚌父,圖片文件和html文件的變更
 */
gulp.task('watch', function() {

    //監(jiān)聽所有.less
    gulp.watch('src/less/*.less', ['styles']);

    //監(jiān)聽所有.js文件
    gulp.watch('src/js/*.js', ['scripts']);

    //監(jiān)聽所有圖片文件
    gulp.watch('src/img/*', ['images']);

    //監(jiān)聽html文件
    gulp.watch('src/*.html', ['html']);
});

/*
 * server任務(wù)哮兰,執(zhí)行connect任務(wù)和watch任務(wù)
 */
gulp.task('server', ['connect', 'watch']);
  • 不含 ES6 的 js 文件任務(wù)
gulp.task('scripts', function() {
    return gulp.src('src/js/*.js')
        .pipe(gulp.dest('dist/js'))
        .pipe(rename({ suffix: '.min' }))
        .pipe(sourcemaps.init({loadMaps: true}))
        .pipe(uglify())
        .pipe(sourcemaps.write('./'))
        .on('error', gutil.log)
        .pipe(gulp.dest('dist/js'))
        .pipe(connect.reload());
});
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市苟弛,隨后出現(xiàn)的幾起案子喝滞,更是在濱河造成了極大的恐慌,老刑警劉巖膏秫,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件右遭,死亡現(xiàn)場離奇詭異,居然都是意外死亡缤削,警方通過查閱死者的電腦和手機(jī)窘哈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來亭敢,“玉大人滚婉,你說我怎么就攤上這事∷У叮” “怎么了让腹?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長扣溺。 經(jīng)常有香客問我骇窍,道長,這世上最難降的妖魔是什么锥余? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任腹纳,我火速辦了婚禮,結(jié)果婚禮上驱犹,老公的妹妹穿的比我還像新娘只估。我一直安慰自己,他們只是感情好着绷,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著锌云,像睡著了一般荠医。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上桑涎,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天彬向,我揣著相機(jī)與錄音,去河邊找鬼攻冷。 笑死娃胆,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的等曼。 我是一名探鬼主播里烦,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼凿蒜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了胁黑?” 一聲冷哼從身側(cè)響起废封,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎丧蘸,沒想到半個月后漂洋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡力喷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年刽漂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弟孟。...
    茶點(diǎn)故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡贝咙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出披蕉,到底是詐尸還是另有隱情颈畸,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布没讲,位于F島的核電站眯娱,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏爬凑。R本人自食惡果不足惜徙缴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嘁信。 院中可真熱鬧于样,春花似錦、人聲如沸潘靖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽卦溢。三九已至糊余,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間单寂,已是汗流浹背贬芥。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宣决,地道東北人蘸劈。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像尊沸,于是被迫代替她去往敵國和親威沫。 傳聞我的和親對象是個殘疾皇子贤惯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評論 2 345

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