安装

  1. yarn add gulp

使用

基本使用

在项目根目录添加 gulpfile.js ,这是 gulp 项目的入口文件。gulp只支持异步任务,需要一个回调函数标记任务完成。

  1. exports.foo = done => {
  2. console.info('foo task working~')
  3. done() //标识任务完成
  4. }
  1. default 任务调用无需任务名。
  1. // 调用命令 yarn gulp
  2. exports.default = done => {
  3. console.log('default task~')
  4. done()
  5. }
  1. gulp 4.0以前的版本,注册任务需要用 gulp 提供的 task 方法。
  1. const gulp = require('gulp');
  2. gulp.task('bar', done => {
  3. console.info('bar');
  4. done()
  5. })

组合任务

series 运行串行任务,parallel 运行并行任务。

  1. const { series, parallel } = require('gulp')
  2. const task1 = done => {
  3. setTimeout(() => {
  4. console.log('task1 working ~ ')
  5. done()
  6. }, 1000)
  7. }
  8. const task2 = done => {
  9. setTimeout(() => {
  10. console.log('task2 working ~ ')
  11. done()
  12. }, 1000)
  13. }
  14. const task3 = done => {
  15. setTimeout(() => {
  16. console.log('task3 working ~ ')
  17. done()
  18. }, 1000)
  19. }
  20. exports.foo = series(task1, task2, task3)
  21. exports.bar = parallel(task1, task2, task3)


异步任务

回调方式实现

  1. exports.callback = done => {
  2. console.log('callback task~')
  3. done()
  4. }
  5. exports.callback_error = done => {
  6. console.log('callback task~') // 不会输出,回调函数是错误优先的
  7. done(new Error('task failed~')) // 错误优先输出
  8. }

ES6 Promise 实现

  1. exports.promise = () => {
  2. console.log('promise task~')
  3. return Promise.resolve()
  4. }
  5. exports.reject = () => {
  6. console.log('reject task~') // 不会输出,Promise是错误优先的
  7. return Promise.reject(new Error('task failed~')) // 优先输出
  8. }

ES7 async await 实现

  1. const timeout = time => {
  2. return new Promise(resolve => {
  3. setTimeout(resolve, time)
  4. })
  5. }
  6. exports.async = async () => {
  7. await timeout(1000)
  8. console.log('async task~')
  9. }

stream 实现

  1. const fs = require('fs')
  2. exports.stream = () => {
  3. const readStream = fs.createReadStream('package.json')
  4. const writeStream = fs.createWriteStream('temp.txt')
  5. readStream.pipe(writeStream)
  6. return readStream // 触发stream的end事件
  7. }
  8. // End事件的实现
  9. exports.stream1 = done => {
  10. const readStream = fs.createReadStream('package.json')
  11. const writeStream = fs.createWriteStream('temp.txt')
  12. readStream.pipe(writeStream)
  13. readStream.on('end', () => {
  14. done()
  15. })
  16. }

构建过程核心工作原理

image.png

  1. const fs = require('fs')
  2. const { Transform } = require('stream')
  3. exports.default = () => {
  4. // 文件读取流
  5. const readStream = fs.createReadStream('normalize.css')
  6. // 文件写入流
  7. const writeStream = fs.createWriteStream('normalize.min.css')
  8. // 文件转换流
  9. const transformStream = new Transform({
  10. // 核心转换过程
  11. transform: (chunk, encoding, callback) => {
  12. // chunk => 读取文件流的内容 (Buffer)
  13. const input = chunk.toString()
  14. const output = input.replace(/\s+/g, '').replace(/\/\*.+?\*\//g, '')
  15. callback(null, output)
  16. }
  17. })
  18. return readStream
  19. .pipe(transformStream) // 转换
  20. .pipe(writeStream) // 写入
  21. }

文件操作API

  1. const { src, dest } = require('gulp') // 获取文件流和写入文件到文件夹的插件
  2. const cleanCss = require('gulp-clean-css') // 压缩css插件
  3. const rename = require('gulp-rename') // 重命名文件插件
  4. exports.default = () => {
  5. return src('src/*.css')
  6. .pipe(cleanCss())
  7. .pipe(rename({ extname: '.min.css' }))
  8. .pipe(dest('dist'))
  9. }