自動化構(gòu)建-Gulp

相比Grunt簡單高效,基于流的構(gòu)建系統(tǒng), Gulp官網(wǎng)

基本使用

npm install --global gulp-cli
cd my-project
npm init
npm install --save-dev gulp
// 根目錄下創(chuàng)建一個名為 gulpfile.js 的文件
// gulpfile.js  入口文件
// // 導(dǎo)出的函數(shù)都會作為 gulp 任務(wù)
exports.foo = done => {  // gulp foo => foo task working~
    console.log('foo task working~')
    done() // 標(biāo)識任務(wù)執(zhí)行完成
  }
// done()表明gulp都是異步的

// default 是默認(rèn)任務(wù)
// 在運(yùn)行是可以省略任務(wù)名參數(shù)
exports.default = done => { // gulp => default task working~
    console.log('default task working~')
    done()
 }
// 4.0版本前用法是task,不太一樣

組合任務(wù)

并行,串行任務(wù)

const { series, parallel } = require('gulp')

const task1 = done => {
  setTimeout(() => {
    console.log('task1 working~')
    done()
  }, 1000)
}

const task2 = done => {
  setTimeout(() => {
    console.log('task2 working~')
    done()
  }, 1000)  
}

const task3 = done => {
  setTimeout(() => {
    console.log('task3 working~')
    done()
  }, 1000)  
}

// 讓多個任務(wù)按照順序依次執(zhí)行
exports.foo = series(task1, task2, task3)

// 讓多個任務(wù)同時執(zhí)行
exports.bar = parallel(task1, task2, task3)
// 編譯css和js就是互不干擾的,可并行

異步任務(wù)

const fs = require('fs')
// 第一種=================================
exports.callback = done => {
  console.log('callback task')
  done()
}

exports.callback_error = done => {
  console.log('callback task')
  done(new Error('task failed')) // 拋出錯誤后,后續(xù)不會再工作
}
// 第二種=================================
exports.promise = () => {
  console.log('promise task')
  return Promise.resolve()
}

exports.promise_error = () => {
  console.log('promise task')
  return Promise.reject(new Error('task failed'))
}
// 第三種=================================
const timeout = time => {
  return new Promise(resolve => {
    setTimeout(resolve, time)
  })
}

exports.async = async () => {
  await timeout(1000)
  console.log('async task')
}
// 第四種====常用=============================
exports.stream = () => {
  const read = fs.createReadStream('yarn.lock')
  const write = fs.createWriteStream('a.txt')
  read.pipe(write)
  return read
}

// exports.stream = done => {
//   const read = fs.createReadStream('yarn.lock')
//   const write = fs.createWriteStream('a.txt')
//   read.pipe(write)
//   read.on('end', () => {
//     done()
//   })
// }

構(gòu)建過程核心工作原理

其實過程就是:讀取文件=>轉(zhuǎn)換=>寫入
比如我們實現(xiàn)一個壓縮css的過程

const fs = require('fs')
const { Transform } = require('stream')

exports.default = () => {
  // 文件讀取流
  const readStream = fs.createReadStream('normalize.css')

  // 文件寫入流
  const writeStream = fs.createWriteStream('normalize.min.css')

  // 文件轉(zhuǎn)換流
  const transformStream = new Transform({
    // 核心轉(zhuǎn)換過程
    transform: (chunk, encoding, callback) => {
      const input = chunk.toString()
      const output = input.replace(/\s+/g, '').replace(/\/\*.+?\*\//g, '')
      callback(null, output)
    }
  })

  return readStream
    .pipe(transformStream) // 轉(zhuǎn)換
    .pipe(writeStream) // 寫入
}

可以看出過程就是,讀取流-轉(zhuǎn)換流-寫入流

gulp文件操作API

使用gulp提供的API,還是壓縮css的過程

const { src, dest } = require('gulp')
// src是gulp提供的讀取流,dest是gulp提供的寫入流
const cleanCSS = require('gulp-clean-css')
// gulp插件,壓縮css代碼
const rename = require('gulp-rename')
// gulp插件,重命名

exports.default = () => {
  return src('src/*.css') // gulp提供的API更強(qiáng)大,有通配符的功能
    .pipe(cleanCSS())
    .pipe(rename({ extname: '.min.css' }))
    .pipe(dest('dist'))
}

案例

包含樣式編譯,腳本編譯,頁面模版編譯,圖片文字轉(zhuǎn)換,壓縮,本地開發(fā)服務(wù)器,監(jiān)視變化以及構(gòu)建優(yōu)化,useref文件引用處理
demo地址

FIS
一款高度集成的前端構(gòu)建工具,把常見的任務(wù)都集成在內(nèi)部,開發(fā)者就可以通過簡單的配置,完成構(gòu)建工作

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容