Gulp:基于流的构建系统
安装
1 | # 安装gulp命令行工具 |
使用
在根目录下,创建gulpfile.js
基本使用
通过导出函数成员的方式定义任务。
gulp中的任务是异步任务,需要使用回调函数标记执行结束
gulpfile.js
是gulp的执行文件,在gulpfile.js
中添加构建指令。
1 | //导出默认任务 |
执行gulp
,会自动运行gulpfile.js
中的default
任务
运行gulp test
会执行test
任务
注意:对于异步执行函数,任务完成标记需要在回调函数中执行
1 | exports.task = (done)=>{ |
组合任务
通过
series
和parallel
实现组合任务
series
组合任务串行执行,用于组合一些有依赖关系,需要顺序执行的任务
parallel
组合任务并行执行,用于组合一些没有依赖关系,可以同时执行的任务
1 | const {series, parallel} = require('gulp') |
执行gulp seriesTask
,任务串行执行
执行gulp parallelTask
,任务并行执行
错误处理
因为gulp任务回调函数式错误优先,所有处理任务执行错误,仅需在done回调函数中传入错误信息即可。
1 | const {series, parallel} = require('gulp') |
执行callback_error
,报错
执行组合函数,遇到错误任务时,会停止执行后续任务
流的方式使用gulp
使用文件流实现文件复制
1 | const fs = require('fs') |
gulp构建过程核心工作原理
读取文件,加工文件,写入另外一个位置
例子,实现css的压缩
使用fs模块读取和写入文件流。
使用steram
的Transform
实现文件内部的修改
1 | const fs = require('fs') |
normalize.css
1 | /* 这是body注释 */ |
执行gulp
转换后的 normalize.min.css
1 | body{background-color:#cccccc;} |
文件操作API
使用gulp的src
模块实现文件流读取,dest
实现文件流写入
1 | const { src, dest } = require('gulp') |
常用插件
gulp-clean-css
压缩css文件1
2
3
4
5
6
7
8const { src, dest } = require('gulp')
const cleanCss = require('gulp-clean-css')
exports.default = ()=>{
return src('src/normalize.css')
.pipe(cleanCss()) // 先进行转换
.pipe(dest('dist'))
}gulp-rename
重命名文件1
2
3
4
5
6
7
8
9
10const { src, dest } = require('gulp')
const cleanCss = require('gulp-clean-css')
const rename = require('gulp-rename')
exports.default = ()=>{
return src('src/normalize.css')
.pipe(cleanCss()) // 先进行转换
.pipe(rename({extname:".min.css",}))
.pipe(dest('dist'))
}gulp-sass
用于构建
scss文件为
css`文件gulp-sass会默认认为
_
开头的scss文件为依赖样式,不会导出css文件1
2
3
4
5
6
7const { src, dest } = require('gulp')
const sass = require('gulp-sass')
exports.default = ()=>{
return src('src/assets/scss/*.scss',{base:'src'})
.pipe(sass()) // 进行转换
.pipe(dest('dist'))
}gulp-babel
用于构建脚本文件,实现es6的向下转换使用
gulp-babel
不会自动安装babel/core核心模块,还需要手动安装@babel/core
以及@babel/preset-env
。@babel/preset-env
会默认将ES6的所有新特性进行转换1
2
3
4
5
6
7
8
9const { src, dest } = require('gulp')
const babel = require('gulp-babel')
//实现脚本文件编译
exports.default = () =>{
return src('src/assets/scripts/*.js', { base: "src/" })
.pipe(babel({presets:['@babel/preset-env']}))//指定转换preset
.pipe(dest('dist'))
}gulp-imagemin
用于图片压缩gulp-imagemin
是图片无损压缩,只是删除了图片的一些附属信息。1
2
3
4
5
6
7const { src, dest } = require('gulp')
const imagemin = require('gulp-imagemin')
exports.default = ()=>{
return src('src/assets/images/*', { base: "src/" })
.pipe(imagemin())//压缩图片
.pipe(dest('dist'))
}
gulp-load-plugins
用于管理plugin,能够自动加载所有的plugin1
yarn add gulp-load-plugins --dev
1
2
3
4
5
6
7
8
9const loadPlugins = require('gulp-load-plugins')
const plugins = loadPlugins()
//通过`plugin.`的方式调用模块
const { src, dest, parallel,series} = require('gulp')
exports.default = ()=>{
return src('src/assets/images/*', { base: "src/" })
.pipe(plugins.imagemin())//通过`plugin.imagemin`的方式调用图片压缩模块
.pipe(dest('dist'))
}
其他模块
del
模块可以实现文件夹清空1
yarn add del --dev
1
2
3
4
5
6
7
8
9const del = require('del')
const clean = ()=>{
return del(['dist'])
}
module.exports={
clean
}browser-sync
服务器,模块提供开发服务器,实现热更新