gulp基礎使用

原文地址

安裝

  1. 安裝淘寶npm鏡像:

    sudo npm install -g cnpm --registry=https://registry.npm.taobao.org

    之后可將npm修改為cnpm

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

    sudo npm install gulp -g

    • sudo是以管理員身份執行命令,一般會要求輸入電腦密碼
    • npm是安裝node模塊的工具,執行install命令
    • -g表示在全局環境安裝,以便任何項目都能使用它
    • 最后,gulp是將要安裝的node模塊的名字
    屏幕快照 2016-07-22 08.44.11.png
  3. 驗證是否正確安裝

    輸入gulp -v驗證gulp正確安裝。

  4. 到項目目錄下安裝一遍

    命令行輸入cd 當前項目路徑,到達當前項目目錄后,

    執行npm install gulp --save-dev

    使用—-save-dev來更新package.json文件,更新devDependencies值,以表明項目需要依賴gulp。

    屏幕快照 2016-07-22 08.49.04.png

安裝gulp插件

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

插件名稱 插件說明
gulp-htmlmin 壓縮html
gulp-ruby-sass sass的編譯
gulp-autoprefixer 添加CSS前綴
gulp-clean-css 壓縮css
gulp-concat 合并文件
gulp-uglify 壓縮js
gulp-imagemin 壓縮圖片
gulp-ng-annotate 添加angular依賴注入
gulp-strip-debug 去掉控制器log等語句
gulp-ngmin 壓縮angularJs
gulp-rename 重命名文件
gulp-livereload 自動刷新頁面
gulp-cache 圖片緩存
gulp-notify 更改提醒
del 清除文件

安裝以上所有插件需要運行如下命令:

npm install gulp-htmlmin gulp-ruby-sass gulp-autoprefixer gulp-clean-css  gulp-concat gulp-uglify gulp-imagemin gulp-ng-annotate gulp-strip-debug gulp-ngmin gulp-rename gulp-livereload  gulp-cache gulp-notify  del  --save-dev
屏幕快照 2016-07-22 11.16.46.png

加載插件

接著在項目目錄下創建一個gulpfile.js文件,用于配置加載插件:

引入插件:

var gulp = require('gulp'),
    htmlmin = require('gulp-htmlmin'),
    sass = require('gulp-ruby-sass'),
    autoprefixer = require('gulp-autoprefixer'),
    minifycss = require('gulp-clean-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'),
    ngAnnotate = require('gulp-ng-annotate'),
    stripDebug = require('gulp-strip-debug'),
    ngmin = require('gulp-ngmin');

建立任務

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

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

gulp.task('styles', function() {
    return gulp.src('src/www/main.scss')
        .pipe(sass({ style: 'expanded' }))//將sass文件編譯為css
        .pipe(autoprefixer('last 2 version', 'safari 5', 'ie 8', 'ie 9', 'opera 12.1', 'ios 6', 'android 4'))//添加css前綴
        .pipe(gulp.dest('dist/assets/css'))//保存到指定文件夾
        .pipe(rename({ suffix: '.min' }))//重命名文件,添加.min
        .pipe(minifycss())//壓縮css
        .pipe(gulp.dest('dist/assets/css'))
        .pipe(notify({ message: 'Styles task complete' }));//提示
});

解釋一下:

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

gulp.task這個API用來創建任務,在命令行下可以輸入gulp styles來執行上面的任務。

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

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

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

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

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

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

為了更好的了解Gulp API,強烈建議看一下Gulp API文檔,其實Gulp API就這么幾個。

樣例

以下是我自己創建的任務,僅供參考:

  • 壓縮html

      gulp.task('htmlmin', function() { //壓縮html
          return gulp.src('src/www/index.html')
              .pipe(htmlmin({
                  removeComments: true, //清除HTML注釋
                  collapseWhitespace: true, //壓縮HTML
                  minifyJS: true, //壓縮頁面JS
                  minifyCSS: true //壓縮頁面CSS        }))
              .pipe(gulp.dest('dist/www/'))
              .pipe(notify({ message: 'htmlmin task complete' }));
      });
    
  • 壓縮js

      gulp.task('minCom', function() { //壓縮comm.js
          return gulp.src('src/www/app/comm.js')
              .pipe(rename({ suffix: '.min' }))//重命名
              .pipe(uglify())//壓縮js
              .pipe(gulp.dest('dist/www/js'))
              .pipe(notify({ message: 'minCom task complete' }));
      });
    
  • 壓縮圖片

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

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

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

修改成:

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

現在,只有新建或者修改過的圖片才會被壓縮了。

  • 清理數據

在任務執行前,最好先清除之前生成的文件:

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

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

  • 壓縮angularJs

合并壓縮angularJs,保證依賴

gulp.task('Angularjs', function() { //合并壓縮angular.js
    return gulp.src([
            'src/www/app/main.js',
            'src/www/app/map/init.js',
        ])
        .pipe(ngAnnotate())
        .pipe(ngmin({ dynamic: false }))
        .pipe(stripDebug())
        .pipe(uglify({ outSourceMap: false }))
        .pipe(concat('all.min.js'))
        .pipe(gulp.dest('dist/www/js'));
});

設置默認任務(default)

我們在命令行下輸入gulp執行的就是默認任務,現在我們為默認任務指定執行上面寫好的三個任務:

gulp.task('default', ['clean'], function() {
    gulp.start( 'htmlmin', 'styles', 'minCom', 'img');
});

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

監聽文件

為了監聽文件的是否修改以便執行相應的任務,我們需要創建一個新的任務,然后利用gulp.watch API實現:

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']);
});

我們將不同類型的文件分開處理,執行對應的數組里的任務。現在我們可以在命令行輸入gulp watch執行監聽任務,當.sass、.js和圖片修改時將執行對應的任務。

  • 自動刷新頁面

Gulp也可以實現當文件修改時自動刷新頁面,我們要修改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插件。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容