gulp學習

前提安裝node環境
使用npm安裝gulp命令行工具
安裝之前,如果已經安裝了,爲了學習,可以卸載

npm rm --global gulp

執行如下命令進行安裝

npm install --global gulp-cli

創建一個項目,來練習使用gulp

npm init

安裝gulp,作爲項目開發時的依賴

npm install --save-dev gulp

創建gulpfile.js 文件
文件內容如下:

function defaultTask(){
    console.log("hello huangbaokang")
}

exports.default = defaultTask

執行gulp命令,如下:
在這裏插入圖片描述

以上就算gulp入門了,學好這個工具,重在掌握各個api接口,然後結合各大工具調試,如代碼壓縮,代碼修改監控,掌握其自動化構建的原理。

Gulpfile 詳解

gulpfile 是項目目錄下名爲 gulpfile.js (或者首字母大寫 Gulpfile.js,就像 Makefile 一樣命名)的文件,在運行 gulp 命令時會被自動加載。在這個文件中,你經常會看到類似 src()、dest()、series() 或 parallel() 函數之類的 gulp API,除此之外,純 JavaScript 代碼或 Node 模塊也會被使用。任何導出(export)的函數都將註冊到 gulp 的任務(task)系統中。

Gulpfile 轉譯

你可以使用需要轉譯的編程語言來書寫 gulpfile 文件,例如 TypeScript 或 Babel,通過修改 gulpfile.js 文件的擴展名來表明所用的編程語言並安裝對應的轉譯模塊。

對於 TypeScript,重命名爲 gulpfile.ts 並安裝 ts-node 模塊。
對於 Babel,重命名爲 gulpfile.babel.js 並安裝 @babel/register 模塊。
針對此功能的高級知識和已支持的擴展名的完整列表,請參考 gulpfile 轉譯 文檔。

創建任務
每個 gulp 任務(task)都是一個異步的 JavaScript 函數,此函數是一個可以接收 callback 作爲參數的函數,或者是一個返回 stream、promise、event emitter、child process 或 observable類型值的函數

任務分公開任務和私有任務,公開任務可以通過gulp命令直接調用,私有任務不能直接調用,可以從gulpfile中導出即可。

const {series} = require('gulp')
function defaultTask(){
    console.log("hello huangbaokang")
}

function privateTask(cb){
    console.log("private task")
    cb()
}

function publicTask(cb){
    console.log("public  task")
    cb()
}

exports.publicTask = publicTask;
exports.default = series(privateTask,publicTask)

執行結果可以看出,publicTask可以直接調用(因爲exports了),而privateTask沒有被exports,所以不能直接調用,但是可以用於內部組合中

在這裏插入圖片描述

以上series是組合中的一種,這種按順序執行,如果希望以最大併發來運行任務,可以使用parallel()

const { parallel } = require('gulp');

function javascript(cb) {
  // body omitted
  cb();
}

function css(cb) {
  // body omitted
  cb();
}

exports.build = parallel(javascript, css);

異步執行

任務完成通知
當從任務(task)中返回 stream、promise、event emitter、child process 或 observable 時,成功或錯誤值將通知 gulp 是否繼續執行或結束。如果任務(task)出錯,gulp 將立即結束執行並顯示該錯誤。

當使用 series() 組合多個任務(task)時,任何一個任務(task)的錯誤將導致整個任務組合結束,並且不會進一步執行其他任務。當使用 parallel() 組合多個任務(task)時,一個任務的錯誤將結束整個任務組合的結束,但是其他並行的任務(task)可能會執行完,也可能沒有執行完。

返回stream

const { src,dest } = require("gulp")

function streamTask(){
    // 把當前目錄下的所有js文件寫入到output目錄,沒有這個目錄,將自動創建
    return src("*.js").pipe(dest('output'));
}

exports.default = streamTask;

在這裏插入圖片描述

返回promise

function promiseTask(){
    return Promise.resolve("hello huangbaokang");
}

exports.default = promiseTask;

返回event emitter

const {EventEmitter} = require("events")
function eventEmitterTask(){
    const emitter = new EventEmitter();
    setTimeout(()=> emitter.emit("finish"),2500);
    return emitter;
}

exports.default = eventEmitterTask;

返回子進程(child process)

const {exec} = require('child_process')

function childProcessTask(){
    return exec('date');
}

exports.default = childProcessTask;

返回callback
如果任務(task)不返回任何內容,則必須使用 callback 來指示任務已完成。

function callbackTask(cb) {
  // `cb()` should be called by some async work
  cb();
}

exports.default = callbackTask;

如需通過 callback 把任務(task)中的錯誤告知 gulp,請將 Error 作爲 callback 的唯一參數。

function callbackError(cb) {
  // `cb()` should be called by some async work
  cb(new Error('kaboom'));
}

exports.default = callbackError;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章