gulp4用法
gulp4用法
安装
删除旧版本
npm rm --global gulp
检查node,npm,npx
node --version
npm --version
npx --version
安装gulp-cli
npm install --global gulp-cli
创建项目
npx mkdirp my-project
cd my-project
初始化项目
npm init
在开发环境中安装gulp包
npm install --save-dev gulp
检查gulp版本
gulp --version
在项目目录下创建gulpfile.js文件,此文件是项目主文件,类似于makefile,运行gulp命令时,默认从此文件运行
运行
gulp 或 gulp + 任务名称
运行结果
[17:36:26] Using gulpfile D:\project\gulpProject\gulpfile.js
[17:36:26] Starting 'default'...
[17:36:26] Finished 'default' after 3.51 ms
创建任务
series()按顺序运行其内的任务
parallel()异步运行
const { series } = require('gulp');
//此文件中定义一个函数就是于定义一个任务
//clean函数没有被exported,所以是私有任务,不能直接在外部运行,但仍然可以通过series()或parallel()调用组合,从而运行
function clean(cb) {
// body omitted
cb();
}
//build函数被exported,所以是公开的方法,可以通过 gulp build运行此任务,也可被series()和或parallel()调用
function build(cb) {
// body omitted
cb();
}
exports.build = build;
exports.default = series(clean, build);
任务任务组合嵌套
const { series, parallel } = require('gulp');
function clean(cb) {
// body omitted
cb();
}
function cssTranspile(cb) {
// body omitted
cb();
}
function cssMinify(cb) {
// body omitted
cb();
}
function jsTranspile(cb) {
// body omitted
cb();
}
function jsBundle(cb) {
// body omitted
cb();
}
function jsMinify(cb) {
// body omitted
cb();
}
function publish(cb) {
// body omitted
cb();
}
exports.build = series(
clean,
parallel(
cssTranspile,
series(jsTranspile, jsBundle)
),
parallel(cssMinify, jsMinify),
publish
);
src()导入文件内容
语法 src(globs, [options])
globs 文件路径,string或array,可用*模糊匹配
option 可选参数 since,base,cwd,等,since可为指定时间以后的文件创建Vinyl 对象
return 得到文件的是stream内容,可以通过pipe管道链式操作
const { src, dest } = require('gulp');
function copy() {
return src('input/*.js')
.pipe(dest('output/'));
}
exports.copy = copy;
dest() 将数据写文件
将文件stream写入指定文件,并仍返回stream
lastRun() 指定任务最后执行的时间
当与src()结合使用时,通过跳过自上次成功完成任务以来未更改的文件,使增量构建能够加快执行时间。
const { src, dest, lastRun, watch } = require('gulp');
const imagemin = require('gulp-imagemin');
function images() {
return src('src/images/**/*.jpg', { since: lastRun(images) })
.pipe(imagemin())
.pipe(dest('build/img/'));
}
function watch() {
watch('src/images/**/*.jpg', images);
}
exports.watch = watch;
symlink() 创建文件超连接
const { src, symlink } = require('gulp');
function link() {
return src('input/*.js')
.pipe(symlink('output/'));
}
exports.link = link;
series() 顺序运行的任务
语法 series(…tasks)
参数 tasks 函数名或匿名函数
const { series } = require('gulp');
function javascript(cb) {
// body omitted
cb();
}
function css(cb) {
// body omitted
cb();
}
exports.build = series(javascript, css);
parallel() 异步运行的任务
语法 parallel(…tasks)
参数 tasks 函数名或匿名函数
const { parallel } = require('gulp');
function javascript(cb) {
// body omitted
cb();
}
function css(cb) {
// body omitted
cb();
}
exports.build = parallel(javascript, css);
watch() 监视文件系统变动
语法 watch(globs, [options], [task])
parameter | type | note |
---|---|---|
globs (required) | string array | 要监视的文件系统 |
options | object | 详见 |
task | function string | 由series()或parallel组成的任务或匿名函数 |
示例
- 普通监视
const { watch } = require('gulp');
watch(['input/*.js', '!input/something.js'], function(cb) {
// body omitted
cb();
});
- 更细化的监视
const { watch } = require('gulp');
const watcher = watch(['input/*.js']);
watcher.on('change', function(path, stats) {
console.log(`File ${path} was changed`);
});
watcher.on('add', function(path, stats) {
console.log(`File ${path} was added`);
});
watcher.on('unlink', function(path, stats) {
console.log(`File ${path} was removed`);
});
watcher.close();
- 组合事件处理
const { watch, series } = require('gulp');
function clean(cb) {
// body omitted
cb();
}
function javascript(cb) {
// body omitted
cb();
}
function css(cb) {
// body omitted
cb();
}
// You can use a single task
watch('src/*.css', css);
// Or a composed task
watch('src/*.js', series(clean, javascript));
watch()的events参数
默认情况下,当文件发生created,changed,deleted等操作watcher都会执行对应的任务。
如果需要使用不同的事件,可以使用events选项。events的可用事件有:‘add’, ‘addDir’, ‘change’, ‘unlink’, ‘unlinkDir’, ‘ready’, ‘error’,‘all’。“all”表示除了“ready”和“error”之外的所有事件。
//监视全部事件
const { watch } = require('gulp');
// All events will be watched
watch('src/*.js', { events: 'all' }, function(cb) {
// body omitted
cb();
});
初始化执行
调用watch()时,任务不会执行,而是等待第一个文件更改。要在第一个文件更改之前执行任务,请将ignoreInitial选项设置为false
const { watch } = require('gulp');
// The task will be executed upon startup
watch('src/*.js', { ignoreInitial: false }, function(cb) {
// body omitted
cb();
});
队列执行
每个watch()保证其当前运行的任务不会再次并发执行。当监视程序任务正在运行时进行文件更改时,另一个执行程序将排队等待任务完成后运行。一次只能排队运行一次。
若要禁用排队,请将队列选项设置为false。
const { watch } = require('gulp');
// The task will be run (concurrently) for every change made
watch('src/*.js', { queue: false }, function(cb) {
// body omitted
cb();
});
延迟执行
在文件更改时,监视程序任务要等到延迟了200ms才会运行。这是为了避免在许多文件同时被更改时过早地启动任务——比如查找和替换。
若要调整延迟时间,请将延迟选项设置为正整数。
const { watch } = require('gulp');
// The task won't be run until 500ms have elapsed since the first change
watch('src/*.js', { delay: 500 }, function(cb) {
// body omitted
cb();
});
可选依赖
Gulp有一个可选的依赖项fsevents,它是一个特定于mac的文件监视程序。
如果您看到fsevents的安装警告—“npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents”,这不是问题。如果跳过fsevents安装,将使用回退监视程序,gulpfile中发生的任何错误都与此警告无关。
task() 不推荐的创建任务方式
提醒:这个API不再是推荐的模式——请使用export的方式创建任务。
在任务系统中定义任务。然后可以从命令行和series()、parallel()和lastRun() api访问该任务。
const { task } = require('gulp');
function build(cb) {
// body omitted
cb();
}
task(build);
const { task } = require('gulp');
task('build', function(cb) {
// body omitted
cb();
});