安装
yarn add gulp
使用
基本使用
在项目根目录添加 gulpfile.js ,这是 gulp 项目的入口文件。gulp只支持异步任务,需要一个回调函数标记任务完成。
exports.foo = done => {console.info('foo task working~')done() //标识任务完成}
default 任务调用无需任务名。
// 调用命令 yarn gulpexports.default = done => {console.log('default task~')done()}
在 gulp 4.0以前的版本,注册任务需要用 gulp 提供的 task 方法。
const gulp = require('gulp');gulp.task('bar', done => {console.info('bar');done()})
组合任务
series 运行串行任务,parallel 运行并行任务。
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)}exports.foo = series(task1, task2, task3)exports.bar = parallel(task1, task2, task3)
异步任务
回调方式实现
exports.callback = done => {console.log('callback task~')done()}exports.callback_error = done => {console.log('callback task~') // 不会输出,回调函数是错误优先的done(new Error('task failed~')) // 错误优先输出}
ES6 Promise 实现
exports.promise = () => {console.log('promise task~')return Promise.resolve()}exports.reject = () => {console.log('reject task~') // 不会输出,Promise是错误优先的return Promise.reject(new Error('task failed~')) // 优先输出}
ES7 async await 实现
const timeout = time => {return new Promise(resolve => {setTimeout(resolve, time)})}exports.async = async () => {await timeout(1000)console.log('async task~')}
stream 实现
const fs = require('fs')exports.stream = () => {const readStream = fs.createReadStream('package.json')const writeStream = fs.createWriteStream('temp.txt')readStream.pipe(writeStream)return readStream // 触发stream的end事件}// End事件的实现exports.stream1 = done => {const readStream = fs.createReadStream('package.json')const writeStream = fs.createWriteStream('temp.txt')readStream.pipe(writeStream)readStream.on('end', () => {done()})}
构建过程核心工作原理

const fs = require('fs')const { Transform } = require('stream')exports.default = () => {// 文件读取流const readStream = fs.createReadStream('normalize.css')// 文件写入流const writeStream = fs.createWriteStream('normalize.min.css')// 文件转换流const transformStream = new Transform({// 核心转换过程transform: (chunk, encoding, callback) => {// chunk => 读取文件流的内容 (Buffer)const input = chunk.toString()const output = input.replace(/\s+/g, '').replace(/\/\*.+?\*\//g, '')callback(null, output)}})return readStream.pipe(transformStream) // 转换.pipe(writeStream) // 写入}
文件操作API
const { src, dest } = require('gulp') // 获取文件流和写入文件到文件夹的插件const cleanCss = require('gulp-clean-css') // 压缩css插件const rename = require('gulp-rename') // 重命名文件插件exports.default = () => {return src('src/*.css').pipe(cleanCss()).pipe(rename({ extname: '.min.css' })).pipe(dest('dist'))}
