前端自動化構建工具gulp記錄

1、安裝

1)安裝nodejsjavascript

經過nodejs的npm安裝gulp,插件也能夠經過npm安裝。windows系統是個.msi工具,只要一直下一步便可,軟件會自動在寫入環境變量中,這樣就能在cmd命令窗口中直接使用node或npm指令。css

我上面的cmd,已經被git封裝過了,字體都變成彩色的了。安裝了這個工具後,還能夠經過Git Bash打Linux的命令。git是版本控制的工具,這裏也很少說了。html

 

2)npm前端

npm(node package manager)nodejs的包管理器,用於node插件管理(包括安裝、卸載、管理依賴等)java

gulp赫然出如今npm的首頁中。node

命令提示符執行:webpack

npm install <name> [-g] [--save-dev]

1. <name>:node插件名稱。例:npm install gulp-less --save-devgit

2. -g:全局安裝。將會安裝在C:\Users\Administrator\AppData\Roaming\npm,而且寫入系統環境變量;github

非全局安裝:將會安裝在當前定位目錄;web

全局安裝能夠經過命令行在任何地方調用它,本地安裝將安裝在定位目錄的node_modules文件夾下,經過require()調用;

3. --save:將保存配置信息至package.json(package.json是nodejs項目配置文件);

4. -dev:保存至package.json的devDependencies節點,不指定-dev將保存至dependencies節點

配置文件package.json是爲了方便下載相關的包,只須要在有這個文件的文件夾下面執行「npm install」(若是安裝了cnpm就用「cnpm install」),則會根據package.json下載全部須要的包。【注:我用demo中的package文件在另一臺電腦上面直接安裝,打「gulp watch」的時候出現了不少錯誤】

 

3)cnpm

由於npm安裝插件是從國外服務器下載,受網絡影響大,可能出現異常。

在國內推薦使用淘寶NPM鏡像。「這是一個完整 npmjs.org 鏡像,你能夠用此代替官方版本(只讀),同步頻率目前爲 10分鐘 一次以保證儘可能與官方服務同步」

安裝指令以下:

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

注意安裝的時候會出現錯誤提示,你能夠關閉命令窗口再打開,打入「cnpm -v」能夠查看版本號。cnpm跟npm用法徹底一致。

 

4)全局安裝gulp

cnpm install gulp -g

若是在某個工程文件夾中提示錯誤,那就手動再安裝下「gulp」:

 

5)新建package.json文件

在命令窗口輸入指令「cnpm init」。若是在Git Bash打這個指令,會報「No gulpfile found」的錯誤。

 

6)新建gulpfile.js文件

gulpfile.js是gulp項目的配置文件,裏面是task的配置。簡易代碼以下:

var gulp = require('gulp');

gulp.task('default', function() {
  // 將你的默認的任務代碼放在這
});

 

7)刪除node_modules文件夾

當安裝了各類插件後,在你相應的目錄下面會出現node_modules文件夾,裏面又嵌套了很深的文件夾目錄,若是你用右鍵刪除的方式,會變得很慢,而且還會提示錯誤「沒法刪除」。

這裏有個方法,用npm裏面一個專門用於刪除的模塊插件「rimraf」。

cnpm install -g rimraf

只須要打簡單的指令就可刪除:

1 cd xxx[include node_modules folder] //用cd指令將文件目錄設置到包含nod_modules的位置
2 
3 rimraf node_modules

 

2、插件與功能

1)全局配置config

能夠將須要在gulpfile中引用的參數,放到這裏,包括一些路徑,功能的開關等。例如:

module.exports = {
    name : '.....',
    devPath : '.....',    //項目根路徑,根路徑下能夠包含多個項目
    prodPath : '....', //生產路徑根路徑
    sassPath : '.....', //SASS包含文件路徑
    rmHtmlWhitespace : false,//html中是否去除空格
    webpackEntry : {
        index : 'index.js'//js合併
    },
    server : {
        port : 8088
    }
};

注意下這裏使用了module.exports,這是nodejs的語法。在gulpfile中將會用require引用config。

//加載項目配置
var config = require('./config');

 

2)監控gulp.watch

這個是gulp自帶的,就是當你的文件改動了後,就作相應的task。還有一個插件gulp-watch

監控sass中的文件變化,一有變化就作sass的編譯。「**」與「*」這種語法能夠參考《Gulp:任務自動管理工具

gulp.task('watch', function() {
    livereload.listen();
    gulp.watch('**.html', ['html']);
      gulp.watch('./sass/*.scss', ['sass']);
      gulp.watch('./css/*.css', ['css']);
      gulp.watch('./js/*.js', ['js']);
});

監控了四個地方的修改,js、html、css和sass,而且有作了自動刷新livereload。這個是經過「gulp-livereload」來實現的。

firefox貨chrome要分別安裝插件纔可運行。chrom插件以下:

安裝完後會在瀏覽器中出現個小按鈕,,注意是黑色的時候纔是在執行中。還有就是要在相應的task中加相應的代碼:

.pipe(livereload())

 

3)sass編譯與css壓縮

經過sass編寫css,能更模塊化,多人協做比較方便。安裝gulp-sass

plumber()」是引用了「gulp-plumber」,任務錯誤中斷自動重傳。在使用一段時間後發現,執行了「plumber()」後監控是還繼續的,可是sass就不會自動編譯了。

後面把「plumber()」去掉,添加紅色部分,這樣就不會出現不編譯的狀況了。

gulp.task('sass', function() {
    gulp.src('./sass/*.scss')
            .pipe(plumber())
            .pipe(sass().on('error', sass.logError))
            .pipe(gulp.dest('./css'))
            .pipe(livereload());
});

gulp-cssnano,壓縮CSS代碼。

gulp.task('css', ['sass'], function() {
    //先刪除dist中的css,有時候會不更新
    gulp.src('./dist/css/*.css')
        .pipe(rimraf({force: true}));
        
    gulp.src('./css/*.css')
        .pipe(cssnano())
        .pipe(gulp.dest('./dist/css'))
        .pipe(livereload());
});

 

4)js壓縮與模塊化合並

使用gulp-uglify作js的壓縮。gulpRimraf()用來刪除文件夾,引用自gulp-rimraf

gulp.task('js', function() {
    //先刪除dist中的css,有時候會不更新
    gulp.src('./dist/js/*.js')
        .pipe(rimraf({force: true}));
        
    gulp.src('./js/*.js')
        .pipe(plumber())
        .pipe(jshint())
        .pipe(jshint.reporter('default'))
        .pipe(uglify())
        .pipe(gulp.dest('./dist/js'))
        .pipe(livereload());
});

上面的jshint是用來分析代碼的,例如分號沒寫。經過打指令「gulp-jshint

模塊化合並使用webpack-stream點擊查看文檔。github上面還有篇說明教程

gulp.task('webpack', function(){
    var entry = {};
    for(var name in config.webpackEntry){
        entry[name] = './js/' + config.webpackEntry[name];
    }
    //排除bundle文件
    return gulp.src('./js/*[^bundle].js')
        .pipe(plumber())
        .pipe(webpack({
            entry: entry,
            output: {
                filename: '[name].bundle.js',
            }
        }))
        .pipe(gulp.dest('./js'));
});

 

5)image圖片無損壓縮

經過gulp-image壓縮的圖片,有時候能牙70%以上,很是給力。

gulp.task('image', function(){
    gulp.src('./img/*.+(jpg|png|gif|svg)')
         .pipe(imagemin())
       .pipe(gulp.dest('./dist/img'));
});

 

6)html壓縮

通過gulp-htmlmin壓縮過的html能夠縮小不少,能夠看到都擠到了一塊兒,有不少參數能夠選擇,好比去除空格等。

還能夠經過gulp-replace來給靜態資源文件加個版本號。

gulp.task('html', function() {
    gulp.src('*.html')
        .pipe(replace('__VERSION', Date.now().toString(16)))
        .pipe(htmlmin({collapseWhitespace: true}))
        .pipe(gulp.dest('./dist'))
        .pipe(livereload());
});

 

7)fontmin字體壓縮

網上有不少webfont,例如國外的Font Awesome,國內的iconfont。都能作出漂亮的自定義字體。

與西文字體不一樣,因爲字符集過大,中文字體沒法享受 webfont 帶來的便利。爲了讓中文字體也乘上這道風,咱們須要對其進行min。使用指令「gulp-fontmin」。

gulp.task('font', function() {
    gulp.src('font/*.+(eot|svg|ttf|woff)')
      .pipe(fontmin({
          text: '人曬'
      }))
      .pipe(gulp.dest('dist/font'));
});

配置的兩個字「人曬」與沒配置的「國」,明顯有區別。

 

8)CSS自動加瀏覽器前綴

gulp-autoprefixer」能夠自動加「-webkit」、「-moz」等的前綴,本身能夠少寫不少兼容代碼。能夠在上面的sass的編譯中添加一個引用。

有多個參數,點擊查看說明。「last 2 versions」是瀏覽器的過濾設置,還有多個值,能夠查看這裏。插件並不只僅是加個前綴,還能編譯出舊的語法。例如flex的不一樣寫法。

後面又查到一個插件「autoprefixer」,用戶量很是,這是一個PostCSS插件,須要引入「gulp-postcss」。更多的PostCSS插件能夠查看這裏

gulp.task('sass', function() {
    gulp.src('./sass/*.scss')
            .pipe(plumber())
            .pipe(sass().on('error', sass.logError))
            .pipe(autoprefix({     browsers: ['last 2 versions', 'Firefox < 20'],
            cascade: false    }))
            .pipe(gulp.dest('./css'))
            .pipe(livereload());
});

輸出:

 

9)將px自動轉換爲rem

使用了一個PostCSS插件,「postcss-px2rem」。

若是不想編譯成rem單位,就在屬性後面寫「/*px*/」或「/*no*/」,這兩個值也有點不一樣,具體參考這裏

var postcss = require('gulp-postcss');
var px2rem = require('postcss-px2rem');

gulp.task('sass', function () {
    var processors = [px2rem({remUnit: 75})];
    return gulp.src('./sass/*.scss')
        .pipe(gulpSass().on('error', gulpSass.logError))
        .pipe(postcss(processors))
        .pipe(gulp.dest('./css/')).pipe(livereload());
});

 

 

10)啓動一個本地調試服務器

經過gulp-connect,能夠作個server。若是你用notpad++這種開發頁面,那這個指令會頗有用。

gulp.task('server', function(){
    var option = {
        root : config.devPath,
        port : config.server.port
    };
    if(config.server.root){
        option.root = config.server.root;
    }
    connect.server(option);
});

上面的localhost能夠改爲本機的IP地址,手機與電腦在同一個網段的話,就能夠直接用手機調試了。

 

11)node_modules目錄

node_modules目錄中的內容很是大,若是在每一個工程下面都安裝,會形成很大的浪費。能夠將其放在各個工程的公共父級中,而在各個目錄下面使用本身的gulpfile.js,config.js等配置文件。

例如工程都在public文件夾中,我就將node_modules放在public的平級。

 

demo下載地址:

http://download.csdn.net/download/loneleaf1/9416080

 

參考資料:

http://www.ydcss.com/archives/18   gulp詳細入門教程

http://www.runoob.com/nodejs/nodejs-npm.html   NPM 使用介紹

http://javascript.ruanyifeng.com/tool/gulp.html    Gulp:任務自動管理工具

http://www.ghostchina.com/module-exports-and-exports-in-node-js/  Node.js 系列之 —— module.exports 與 exports

http://segmentfault.com/a/1190000002658165?utm_source=tuicool   JGulp: 利用Gulp 配置的前端項目自動化工做流

http://www.w3ctech.com/topic/935    Fontmin 快速指南

相關文章
相關標籤/搜索