gulp4.0入門和實戰
我最近遇到需要優化web的效能的任務,然後就搗鼓了一些對資原始檔優化壓縮的方案。由於之前的專案中有使用到gulp,所以在需要處理的web專案中也優先使用這個技術。
先聊聊gulp是什麼?
gulp被稱為基於流的自動化構建工具,也是用NodeJS編寫的額。使用NodeJs對檔案流的非同步處理,可以對資原始檔(js和css以及圖片)進行優化處理,包括檔案的合併和檔案內容的壓縮。最重要的是,這些工作都是自動化的,只要我們編寫好gulpfile.js檔案即可!
相較於webpack, gulp也更簡單,更基於程式導向的程式設計,適合需求簡單的打包壓縮工作。
最新版本的gulp是4.x,和之前的3.x的gulp有所不同,把cli分離出去了,所以需要單獨安裝gulp-cli。
在專案中使用gulp就簡單三步:
- 安裝gulp-cli
npm install gulp-cli -save
- 安裝gulp
npm install gulp -D --save
- 建立gulpfile.js
這第三步是和業務有關的,比如我想對一些css和js檔案進行優化,那麼需要引入gulp和需要的plugin,程式碼如下。
// 引入gulp物件和外掛
const {src, dest} = require('gulp');
const {series} = require('gulp');
const cssMin = require('gulp-minify-css');
const uglify=require('gulp-uglify');
const concat = require('gulp-concat');
然後封裝兩個方法,分別處理css檔案和js檔案。首先是針對css檔案的處理,如下:
function dealCss() {
return src([
'./myapp/static/css/mobile.css',
'./myapp/static/css/all.css',
'./myapp/static/css/tablet.css',
'./myapp/static/css/wag.css'
]).pipe(concat('base.min.css')) // 合併成指定檔案
.pipe(cssMin()) // 壓縮
.pipe(dest('./myapp/css')); // 設定輸出路徑
上面的程式碼就把mobile.css、all.css和tablet.css以及wag.css合併成一個檔案base.min.css,並做了壓縮優化(minize)。
在編寫一個js檔案的處理,如下:
function dealJs() {
return src([
'./myapp/js/image.js',
'./myapp/js/bar.js',
'./myapp/js/search.js',
'./myapp/js/tiny-images.js'
]).pipe(concat('imagepage.min.js'))
.pipe(uglify({ mangle : false }))
.pipe(dest('./myapp/pure/js/'));
}
最後就是把這兩個定義的方法(在gulp來看就是需要被回撥的任務)放置到任務佇列裡面,有兩種選擇,一種是使用並行的方式執行,一種是使用同步的方法執行,也就是一個任務執行完再按照順序執行下一個任務。
這裡我們不缺時間,就順序執行即可:
exports.default =series(dealCss, dealJs);
完整的程式碼如下所示:
// 引入gulp物件和外掛
const {src, dest} = require('gulp');
const {series} = require('gulp');
const cssMin = require('gulp-minify-css');
const uglify=require('gulp-uglify');
const concat = require('gulp-concat');
function dealCss() {
return src([
'./myapp/static/css/mobile.css',
'./myapp/static/css/all.css',
'./myapp/static/css/tablet.css',
'./myapp/static/css/wag.css'
]).pipe(concat('base.min.css')) // 合併成指定檔案
.pipe(cssMin()) // 壓縮
.pipe(dest('./myapp/css')); // 設定輸出路徑
function dealJs() {
return src([
'./myapp/js/image.js',
'./myapp/js/bar.js',
'./myapp/js/search.js',
'./myapp/js/tiny-images.js'
]).pipe(concat('imagepage.min.js'))
.pipe(uglify({ mangle : false }))
.pipe(dest('./myapp/pure/js/'));
}
exports.default = series(dealCss, dealJs);
執行gulp命令就可以自動完成上面兩個任務,gulp真的很高效!
還可以選擇並行的執行多個任務,只需要把最後一行程式碼改為:
exports.default = parallel(dealCss, dealJs);
parallel()可以讓多個任務被並行執行,一個任務發生錯誤,其他任務不受影響。而series必行安順序執行,所以一旦有報錯,後面的任務就不會被執行。通常如果有報錯,我們肯定需要解決它,所以在日常優化資源的場景下選擇series更為常用。