gulp 笔记
文档学习
有中文看中文 :-)
入门
先看 node等版本
node --version
v11.8.0
npm --version
6.12.0
npx --version
10.2.0
安装
npm install --global gulp-cli
npx mkdirp my-project && cd my-project
npm init && npm install --save-dev gulp
检查版本
gulp --version
CLI version: 2.2.0
Local version: 4.0.2
创建配置 touch gulpfile.js
写入
1 | function defaultTask(cb) { |
exports.default = defaultTask
执行 gulp
完成
任务
查看任务gulp --tasks
多个任务可以通过series()
和 parallel()
来合并, 其中series是按顺序串行,parallel是并行,
例子
1 | const { series } = require('gulp'); |
可以任意深度嵌套!
异步执行
可以返回 stream、promise、event emitter、child process 或 observable ,否则使用callback
stream
1 | const { src, dest } = require('gulp'); |
promise
1 | function promiseTask() { |
event emitter
1 | const { EventEmitter } = require('events'); |
child process
1 | const { exec } = require('child_process'); |
observable
1 | const { Observable } = require('rxjs'); |
callback
1 | function callbackError(cb) { |
gulp 不再支持同步任务(Synchronous tasks)了。因为同步任务常常会导致难以调试的细微错误,例如忘记从任务(task)中返回 stream。
流Stream
常见流使用:src,dest,pipe()
1 | const { src, dest } = require('gulp'); |
Glob 详解
glob 是由普通字符和/或通配字符组成的字符串,用于匹配文件路径。可以利用一个或多个 glob 在文件系统中定位文件。
至少一个匹配项目
分隔符永远是/
不分系统
\\
用于转译,如 \\*
表示普通的星号 不是通配符
避免使用path
, __dirname
,__filename
来创建glob
单个星号 不能匹配层级文件夹
两个星号 能匹配任意层级文件夹
取反
!
['script/**/*.js', '!scripts/vendor/', 'scripts/vendor/react.js']
['**/*.js', '!node_modules/']
插件 plugins
实质是流转换器 插件应当总是用来转换文件的。其他操作都应该使用(非插件的) Node 模块或库来实现。
条件插件 gulp-if
文件监控 watch
1 | const { watch, series } = require('gulp'); |
指定监控的事件’add’、’addDir’、’change’、’unlink’、’unlinkDir’、’ready’、’error’。此外,还有一个 ‘all’ 事件,它表示除 ‘ready’ 和 ‘error’ 之外的所有事件。
1 | const { watch } = require('gulp'); |
如需在第一次文件修改之前执行,也就是调用 watch() 之后立即执行,请将 ignoreInitial 参数设置为 false。
watch(...,{ignoreInitial:false},...)
延迟 { delay: 500 }
API
Vinyl
Vinyl 对象
(the virtual file objects)
文件元数据作为 Node 的 fs.Stats 实例提供。它是 Vinyl 实例的 stat 属性,并在内部用于确定 Vinyl 对象是否表示目录或符号链接(symbolic link)。当写入文件系统时,权限和时间值将从 Vinyl 对象的 stat 属性同步。
src()
dest()
symlink()
lastRun()
series()
parallel()
watch()
task()
registry()
tree()
Vinyl
Vinyl.isVinyl()
Vinyl.isCustomProp()