1. 程式人生 > >完整的Gulp安裝及檔案配置

完整的Gulp安裝及檔案配置

 

什麼是Gulp?
    gulp.js是基於流的自動化構建工具。

前置知識需求:
node.js的一些基礎用法
npm的基礎用法,如init、install、run等
瞭解gulp.js的Api(內容很少,掌握五個Api就可以了)
安裝gulp的步驟流程:
    1、新建專案資料夾(例如D盤下新建hbPage資料夾),啟用cmd
    2、進入專案檔案,全域性安裝Gulp
    

npm install -g gulp


    3、建立package.json檔案,執行下面程式碼
    

npm init


    4、在目錄檔案下建立gulpfile.js檔案


外掛的安裝與gulpfile.js檔案的配置
下面的檔案配置就比較多了,我們來一一進行說明。(所有的配置項都是寫在gulpfile.js檔案中的)

關於gulp檔案配置,因為在打包部署到伺服器上線時,為了減少檔案大小我們要對檔案進行壓縮。所以這裡涉及到三個壓縮外掛(js、css、html)
    1、js檔案壓縮(gulp-gulify)
    

npm install --save-dev gulp-uglify


    2、css檔案壓縮(gulp-clean-css)
     

npm install --save-dev gulp-clean-css


    3、html檔案壓縮(gulp-minify-html)
     

npm install --save-dev gulp-minify-html


在編輯頁面樣式時,我們會用到 less 或者 sass 編譯。(我這裡使用的是less編譯,兩個編譯檔案根據個人喜好只需要使用其中一個即可)

    4、less 和 sass 編譯(gulp-minify-html)(二者選擇安裝其一即可)
   

npm install --save-dev gulp-less

 


另外還要用到圖片壓縮外掛。

     5、圖片壓縮(gulp-imagemin)
   

 npm install --save-dev gulp-imagemin


在編寫程式碼時為了實現網頁自動重新整理我們使用 gulp-connect 外掛,當前的流行的是前後端分離,所以為了跟後臺做對接,實現跨域代理,這裡也要使用一個跟 gulp-connect 配套使用的外掛 http-proxy-middleware 。

    6、網頁自動重新整理(gulp-connect)
   

npm install --save-dev gulp-connect


    7、跨域代理(http-proxy-middleware)
   

 npm install --save-dev http-proxy-middleware

到這裡基本上一般專案安裝這些外掛就可以了,當然還有一些其他的外掛我也會在下面整理到,如果你需要用到的話也可以自行安裝。

    8、重新命名(gulp-rename)
   

npm install --save-dev gulp-rename


    9、自動載入外掛(gulp-load-plugins)
       (然後我們要使用gulp-rename和gulp-ruby-sass這兩個外掛的時候,就可以使用plugins.rename和plugins.rubySass來代替了,也就是                    原始外掛名去掉gulp-字首,之後再轉換為駝峰命名。)
   

npm install --save-dev gulp-load-plugins


    10、檔案合併(gulp-concat) 
   

 npm install --save-dev gulp-concat

接下來開始講解gulpfile相關檔案的配置
本來只需要在gulpfile.js檔案中配置就行,但是實際過程中我們在開發環境中是不需要進行檔案的打包。在生產環境中是不需要進行網頁自動重新整理和跨域代理配置的。所以我們把開發環境和生產環境的配置區分開來,分別寫一個配置檔案。

講一下到目前為止專案的目錄結構是這樣的:

建立gulp的config檔案
我們在build資料夾中可以建立一個 gulpfile.config.js 檔案,主要用途為儲存專案的目錄配置,如原始檔存放的路徑,打包後文件存放的路徑等,可以進行靈活配置。同時將Config對應暴露出來供其他檔案引用。 

gulpfile.config.js

var SRC_DIR = './src/';     // 原始檔目錄
var DIST_DIR = './dist/';   // 檔案處理後存放的目錄,也是打包存放檔案的目錄
var DIST_FILES = DIST_DIR + '**'; // 目標路徑下的所有檔案

var Config = {
    src: SRC_DIR,
    dist: DIST_DIR,
    dist_files: DIST_FILES,
    html: {
        src: SRC_DIR + '**/*.html',
        dist: DIST_DIR
    },
    assets: {
        src: SRC_DIR + 'assets/**/*',     // assets目錄:./src/assets
        dist: DIST_DIR                    // assets檔案build後存放的目錄:./dist/assets
    },
    css: {
        src: SRC_DIR + 'css/**/*.css',    // CSS目錄:./src/css/
        src_min: SRC_DIR + 'css',          // CSS壓縮檔案目錄:./src/css/
        dist: DIST_DIR + 'css'            // CSS檔案build後存放的目錄:./dist/css
    },
    less: {
        src: SRC_DIR + 'less/**/*.less',  // less目錄:./src/less/
        dist: DIST_DIR + 'css'            // less檔案生成CSS後存放的目錄:./dist/css
    },
    js: {
        src: SRC_DIR + 'js/**/*.js',      // JS目錄:./src/js/
        src_min: SRC_DIR + 'js',      // JS目錄:./src/js/
        dist: DIST_DIR + 'js',            // JS檔案build後存放的目錄:./dist/js
        build_name: 'build.js'            // 合併後的js的檔名
    },
    img: {
        src: SRC_DIR + 'images/**/*',     // images目錄:./src/images/
        dist: DIST_DIR + 'images'         // images檔案build後存放的目錄:./dist/images
    }
};
module.exports = Config;


建立gulp的dev檔案
在build資料夾下建立gulpfile.dev.js檔案,該檔案放置的時開發環境下呼叫的任務,同時使用gulp-connect實現編寫程式的時候瀏覽器自動重新整理的功能。

gulpfile.dev.js

var gulp = require('gulp');
    autoprefixer = require('gulp-autoprefixer'); // 處理css中瀏覽器相容的字首
    less = require('gulp-less');                 //less編譯
    rename = require('gulp-rename');             //重新命名
    concat = require('gulp-concat');             //合併檔案
    imagemin = require('gulp-imagemin');         //圖片壓縮

    connect = require('gulp-connect');           //瀏覽器自動重新整理
    reload = connect.reload;                     //瀏覽器自動重新整理
    proxy = require('http-proxy-middleware');    //跨域代理

var Config = require('./gulpfile.config.js');
//======= gulp dev 開發環境下 ===============
function dev() {
    /**
     * HTML處理
     */
    gulp.task('html:dev', function () {
        return gulp.src(Config.html.src).pipe(gulp.dest(Config.html.dist)).pipe(reload());
    });
    /**
     * assets資料夾下的所有檔案處理
     */
    gulp.task('assets:dev', function () {
        return gulp.src(Config.assets.src).pipe(gulp.dest(Config.assets.dist)).pipe(reload());
    });
    /**
     * CSS樣式處理
     */
    gulp.task('css:dev', function () {
        return gulp.src(Config.css.src).pipe(gulp.dest(Config.css.dist)).pipe(reload());
    });
    /**
     * less樣式處理
     */
    gulp.task('less:dev', function () {
        return gulp.src(Config.less.src).pipe(less()).pipe(rename({
            suffix: '.min'
        })).pipe(gulp.dest(Config.css.src_min)).pipe(reload());
    });
    /**
     * js處理
     */
    gulp.task('js:dev', function () {
        return gulp.src(Config.js.src).pipe(gulp.dest(Config.js.dist)).pipe(reload());
    });
    /**
     * 圖片處理
     */
    gulp.task('images:dev', function () {
        return gulp.src(Config.img.src).pipe(imagemin({
            optimizationLevel: 3
            , progressive: true
            , interlaced: true
        })).pipe(gulp.dest(Config.img.dist)).pipe(reload());
    });

    gulp.task('dev', ['html:dev', 'css:dev', 'less:dev', 'js:dev', 'assets:dev', 'images:dev'], function () {
        connect.server({
            root: ['./'],
            port:8090,
            livereload:true,
            middleware: function(connect, opt) {
                return [
                    proxy('/hb-controller',  {
                        target: 'http://192.168.1.7:8080',
                        changeOrigin:true
                    }),
                    /*proxy('/hb',  {
                        target: 'http://192.168.0.102:8080/hb-controller',
                        changeOrigin:true
                    }),*/
                    proxy('/otherServer', {
                        target: 'http://IP:Port',
                        changeOrigin:true
                    })
                ]
            }
        });
        // Watch .html files
        gulp.watch(Config.html.src, ['html:dev']);
        // Watch .css files
        gulp.watch(Config.css.src, ['css:dev']);
        // Watch .less files
        gulp.watch(Config.less.src, ['less:dev']);
        // Watch assets files
        gulp.watch(Config.assets.src, ['assets:dev']);
        // Watch .js files
        gulp.watch(Config.js.src, ['js:dev']);
        // Watch image files
        gulp.watch(Config.img.src, ['images:dev']);
    });
}
//======= gulp dev 開發環境下 ===============
module.exports = dev;

在該檔案中建立瞭如html:dev、css:dev、less:dev等幾個任務(具體任務實現了什麼功能,聰明的你應該看得出來~),這幾個任務被放置在dev函式中,並且將dev函式暴露出去。 
其中一個主要的gulp任務 dev(同時也是生產環境下沒有的gulp任務),開啟了一個gulp-connect伺服器,同時監聽各個資原始檔的變化,當檔案發生變化後通知瀏覽器進行重新重新整理。 還有一個就是開啟了跨域代理服務,方便跟後臺做對接。

上面的 connect.server 中 middleware 配置的是代理資訊,不懂得可以去查查跨域代理是怎樣配置的。

建立gulp的prod檔案
在build資料夾下建立gulpfile.prod.js檔案,用於放置生產環境下執行的任務。其中在生產環境下,我們並不需要使用到什麼瀏覽器自動重新整理的功能,只要進行如壓縮CSS、JS檔案等操作即可。 

gulpfile.prod.js

var gulp = require('gulp');
    minifyHtml = require("gulp-minify-html");    // html壓縮
    autoprefixer = require('gulp-autoprefixer'); // 處理css中瀏覽器相容的字首  
    rename = require('gulp-rename');            //重新命名
    cleanCss = require("gulp-clean-css");          // css的層級壓縮合並
    less = require('gulp-less');                //less編譯
    uglify = require('gulp-uglify');            //js壓縮
    concat = require('gulp-concat');            //合併檔案
    imagemin = require('gulp-imagemin');        //圖片壓縮

var Config = require('./gulpfile.config.js');
//======= gulp build 打包資源 ===============
function prod() {
    /**
     * HTML處理
     */
    gulp.task('html', function () {
        return gulp.src(Config.html.src).pipe(minifyHtml()).pipe(gulp.dest(Config.html.dist));
    });
    /**
     * assets資料夾下的所有檔案處理
     */
    gulp.task('assets', function () {
        return gulp.src(Config.assets.src).pipe(gulp.dest(Config.assets.dist));
    });
    /**
     * CSS樣式處理
     */
    gulp.task('css', function () {
        return gulp.src(Config.css.src).pipe(autoprefixer('last 2 version')).pipe(cleanCss()).pipe(gulp.dest(Config.css.dist));
    });
    /**
     * less樣式處理
     */
    gulp.task('less', function () {
        return gulp.src(Config.less.src).pipe(autoprefixer('last 2 version')).pipe(less()).pipe(gulp.dest(Config.css.dist)).pipe(rename({
            suffix: '.min'
        })).pipe(cleanCss()).pipe(gulp.dest(Config.css.dist));
    });
    /**
     * js處理
     */
    gulp.task('js', function () {
        return gulp.src(Config.js.src).pipe(gulp.dest(Config.js.dist)).pipe(rename({
            suffix: '.min'
        })).pipe(uglify()).pipe(gulp.dest(Config.js.dist));
    });
    /**
     * 合併所有js檔案並做壓縮處理
     */
    gulp.task('js-concat', function () {
        return gulp.src(Config.js.src).pipe(concat(Config.js.build_name)).pipe(gulp.dest(Config.js.dist)).pipe(uglify()).pipe(gulp.dest(Config.js.dist));
    });
    /**
     * 圖片處理
     */
    gulp.task('images', function () {
        return gulp.src(Config.img.src).pipe(imagemin({
            optimizationLevel: 3
            , progressive: true
            , interlaced: true
        })).pipe(gulp.dest(Config.img.dist));
    });
    gulp.task('build', ['html', 'css', 'less', 'js', 'assets', 'images']);
}
module.exports = prod;

同樣在gulpfile.prod.js檔案中將所有的任務放置在了prod函式中,同時暴露該函式供外部呼叫。 


呼叫dev和prod方法
在真正的gulp配置檔案gulpfile.js中,引入gulpfile.dev.js和gulpfile.prod.js檔案,並呼叫dev和prod方法,這樣對應環境下的各個任務即被創建出來了。

gulpfile.js

var prod = require('./build/gulpfile.prod.js');
var dev = require('./build/gulpfile.dev.js');
prod();
dev();

執行gulp
這個時候,我們可以使用gulp dev命令進行開發模式,此時會監聽專案src中檔案的變化,執行對應的任務,與此同時會通知瀏覽器進行重新整理,及時響應。 而使用gulp build命令則可以針對生產環境的要求打包資原始檔,用於生產。

定義指令碼scripts
編寫 package.json 檔案中公的 scripts 。


"scripts": {
  "test": "echo \"Error: no test specified\" && exit 1",
  "start": "gulp dev",
  "dev": "gulp dev",
  "clean": "rimraf dist",
  "build": "rimraf dist && gulp build"
},


其中,主要的有: 
1. 定義了start指令碼,用於執行gulp dev命令; 
2. 定義了dev指令碼,同樣用於執行gulp dev命令; 
3. 定義了clean指令碼,用於執行rimraf dist命令(刪除dist目錄下的所有檔案); 
4. 定義了build指令碼,用於執行rimraf dist命令,還有gulp build命令,實際上就是先刪除dist目錄下的所有檔案,然後再打包生成各資原始檔。 
  需要rimraf,我們必須先進行全域性安裝:

npm install rimraf -g


  這樣我們在實際使用過程中: 
1. 使用npm start命令將對應執行gulp dev命令; 
2. 使用npm run dev命令將對應執行gulp dev命令; 
3. 使用npm run clean命令將刪除所有生成後的檔案; 
4. 使用npm run build命令可以先刪除生成後的檔案,再重新打包生成。