- 高效,易用
- 编写gulpfile.js
基本使用
//gulp入口文件//4.0以后导出函数成员//标记任务已完成exports.foo = (done) => {console.log("foo task")done() //标识任务完成}exports.default = (done) => {console.log('defaule task')done()}
组合任务 ```javascript //组合任务 //并行任务和串行任务 const { series, parallel } = require(“gulp”) const task1 = (done) => { console.log(“task1 working~”) done() } 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) //并行,同时执行
- 异步任务```javascript//异步任务// 1.回调函数,调用done,错误优先,多个任务执行,后续任务不会工作exports.callback = (done) => {console.log("callback task~")done()}exports.callback_error = (done) => {console.log("callback task~")done(new Error("task failed")) //执行失败}//2.promiseexports.promise = () => {console.log("promise task")return Promise.resolve()}exports.promise_error = () => {console.log("promise task")return Promise.reject()}//3.async awaitconst timeout = (time) => {return new Promise((resolve) => {setTimeout(resolve, time)})}exports.async = async () => {await timeout(1000)console.log("async task")}//4.stream方式最常见,构建系统大多数在处理文件const fs = require("fs")exports.stream = () => {const readStream = fs.createReadStream("package.json")const writeStream = fs.createWriteStream("temp.txt")readStream.pipe(writeStream) //复制文件到return readStream //结束的时机是readStream end的时候 有end事件}//原理// exports.stream = (done) => {// const readStream = fs.createReadStream("package.json")// const writeStream = fs.createWriteStream("temp.txt")// readStream.pipe(writeStream) //复制文件到// // return readStream //结束的时机是readStream end的时候 有end事件// //原理是监听end时机// readStream.on("end", () => {// done()// })// }
- 构建过程核心工作原理 后文使用gulp提供的方法
- 大多数将文件读取 -》转换-》另一个位置 ```javascript const fs = require(“fs”) const { Transform } = require(“stream”)
exports.default = () => { // 定义读取文件流,写入文件流 const readStream = fs.createReadStream(“./nomailze.css”) const writeStream = fs.createWriteStream(“nomailze.min.css”) //转换文件,此处是压缩 const transform = new Transform({ //转换过程 transform: (chunk, encoding, callback) => { //核心转换过程 //chunk文件流读取到的文件内容(Buffer) const input = chunk.toString() const output = input.replace(/\s+/g, “”).replace(/\/*.+?*\//g, “”) callback(null, output) //错误优先 }, }) //读取到的文件流导入写入文件流 readStream.pipe(transform).pipe(writeStream) return readStream }
- Gulp文件操作API- 以及常规过程见下代码块```javascript// Gulp文件操作API + 插件使用//通过src方法创建读取流,在通过gulp插件加工,然后dest方法创建写入流//强大与可以使用通配符const { src, dest } = require("gulp")const cleanCss = require("gulp-clean-css")const rename = require("gulp-rename")exports.default = () => {return src("src/*.css").pipe(cleanCss()).pipe(rename({ extname: ".min.css" })) //重命名扩展名.pipe(dest("dist"))}
- Gulp构建案例
- Gulp自动载入插件
- gulp-load-plugins
- 热更新开发服务器
- borwser-sync 模块
- 支持代码修改过后自动热更新到浏览器当中
- borwser-sync 模块
- useref会对文件进行整合
- 文件压缩
- 分别压缩HTML,CSS,JavaScript
- css,js由useref生成。
- 构建流程整理
```javascript const { src, dest, parallel, series, watch } = require(“gulp”) const del = require(“del”) const browserSync = require(“browser-sync”) const loadPlugins = require(“gulp-load-plugins”) const { use } = require(“browser-sync”) const plugins = loadPlugins() const bs = browserSync.create() //创建服务器 const data = { menus: [
], pkg: require(“./package.json”), date: new Date(), } //自定义clean任务 const clean = () => { return del([“dist”, “temp”]) } //编译样式 const style = () => { //样式编译 return src(“src/assets/styles/*.scss”, { base: “src” }) //base指定原始目录{name: "Home",icon: "aperture",link: "index.html",},{name: "Features",link: "features.html",},{name: "About",link: "about.html",},{name: "Contact",link: "#",children: [{name: "Twitter",link: "https://twitter.com/w_zce",},{name: "About",link: "https://weibo.com/zceme",},{name: "divider",},{name: "About",link: "https://github.com/zce",},],},
} //编译脚本 const script = () => { return src(“src/assets/scripts/*.js”, { base: “src” }).pipe(plugins.sass({ outputStyle: "expanded" })).pipe(dest("temp")).pipe(bs.reload({ stream: true }))
} //编译页面 const page = () => { //src任意子目录下的html return src(“src/*.html”, { base: “src” }).pipe(plugins.babel({ presets: ["@babel/preset-env"] })) //转换es6新特性.pipe(dest("temp")).pipe(bs.reload({ stream: true }))
} //图片和字体文件转换 const image = () => { return src(“src/assets/images/“, { base: “src” }).pipe(plugins.imagemin()).pipe(dest(“dist”)) } const font = () => { return src(“src/assets/fonts/“, { base: “src” }).pipe(plugins.imagemin()).pipe(dest(“dist”)) } //处理public const extra = () => { return src(“public/*”, { base: “public” }).pipe(dest(“dist”)) } //整合js css 压缩 const useref = () => { return src(“temp/.html”, { base: “temp” }).pipe(plugins.swig({ data, defaults: { cache: false } })) // 防止模板缓存导致页面不能及时更新.pipe(dest("temp")).pipe(bs.reload({ stream: true }))
} //启动服务器 const serve = () => { //修改文件。执行相应任务 修改dist watch(“src/assets/styles/.scss”, style) watch(“src/assets/scripts/.js”, script) watch(“src/.html”, page) // watch(“src/assets/images/“, image) // watch(“src/assets/fonts/“, font) // watch(“public/“, extra) watch([“src/assets/images/“, “src/assets/fonts/*”, “public/“], bs.reload) bs.init({.pipe(plugins.useref({ searchPath: ["temp", "."] })).pipe(plugins.if(/\.js$/, plugins.uglify())) //分别处理不同文件.pipe(plugins.if(/\.css$/, plugins.cleanCss())) //分别处理不同文件.pipe(plugins.if(/\.html$/, plugins.htmlmin({ collapseWhitespace: true, minifyCSS: true, minifyJS: true }))) //分别处理不同文件.pipe(dest("dist"))
}) } //组合任务 const compile = parallel(style, script, page) const build = series(clean, parallel(series(compile, useref), extra, image, font)) //自动清除dist下的文件 const develop = series(compile, serve) module.exports = { clean, build, develop, }notify: false, //关闭提示port: 2080, //修改端口号// open: false,// files: "dist/**", //被监听的路径通配符server: {baseDir: ["temp", "src", "public"], //指定根目录,数组依次查找routes: {//优先于baseDir"/node_modules": "node_modules",},},
```
