Gulp自动化构建工具
它很好的解决了Grunt构建速度慢的问题,因为它是基于内存去实现的,对文件的处理是在内存中完成的,同时还默认同时执行多个任务效率大大提高,而且使用方式相对于Grunt更加直观易懂,目前生态插件也完善
一:Gulp的基本使用
- yarn init初始化一个package.json文件
- yarn add gulp --dev 作为开发依赖安装
- 在根目录当中创建gulpfile.js文件
- 运行:yarn gulp 任务
- 因为gulp现在是异步任务了,所以每次任务完成都需要标记任务完成,否则会报错
exports.foo = done => {
console.log('hello gulp');
done()
}
exports.default = done => {
console.log('default gulp');
done()
}
const gulp = require('gulp')
gulp.task('bar', done => {
console.log('bar');
done()
})
二:Gulp的组合任务
- 将任务操作组合成更大的操作,依次执行---series()
- 将任务组合成同时同时执行的较大操作----parallel()
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);
}
const { series, parallel } = require('gulp')
exports.foo = series(task1, task2, task3)
exports.bar = parallel(task1, task2, task3)
三:Gulp的异步任务
- 第一种:回调
- 第二种:promise
- 第三种:async await
- 第四中:返回stream----这是最常用到的
exports.callback = done => {
console.log('callback');
done()
}
exports.callback_error = done => {
console.log('callback_error');
done(new Error('callback_error'))
}
exports.promise = () => {
console.log('promise');
return Promise.resolve()
}
exports.promise_error = () => {
console.log('promise_error');
return Promise.reject(new Error('promise_error'))
}
const timeout = time => {
return new Promise(resolve => {
setTimeout(resolve,time)
})
}
exports.async = async () => {
await timeout(1000)
console.log('async await');
}
const fs = require('fs')
exports.stream = () => {
const readStream = fs.createReadStream('package,json')
const writeStrram = fs.createWriteStream('temp.txt')
readStream.pipe(writeStrram)
return readStream
}
exports.stream1 = done => {
const readStream = fs.createReadStream('package,json')
const writeStrram = fs.createWriteStream('temp.txt')
readStream.pipe(writeStrram)
readStream.on('end', () => {
done()
})
}
四:Gulp构建过程核心工作原理
- 读取流 --> 转换流 --> 写入流
const fs = require('fs')
const { Transform } = require('stream')
exports.default = () => {
const read = fs.createReadStream('normalize.css')
const write = fs.createWriteStream('normalize.min.css')
const transfrom = new Transform({
transform: (chunk, encoding, callback) => {
const input = chunk.toString()
const output = input.replace(/\s+/g, '').replace(/\*.+?\*\//g, '')
callback(null,output)
}
})
read.pipe(transfrom)
.pipe(write)
return read
}
五:Gulp文件操作API+插件的使用
- Gulp提供了读取流和写入流,相对于node底层的读取流和写入流更强大,更容易使用,转换流基本使用独立的插件使用
- 读取流:scr()
- 转换流:插件:gulp-clean-css
- 写入流:dest()
const { dest, src } = require('gulp')
const cleanCss = require('gulp-clean-css')
exports.default = () => {
return src('*.css').pipe(cleanCss()).pipe(dest('dist'))
}