处理文件
Gulp 提供了 src()
和 dest()
方法,用于与计算机上的文件进行交互。
src()
接收一个 glob 参数,用于从文件系统读取文件,并产生一个 Node 流。它会定位所有匹配的文件,并将它们读入内存,使其能够通过流传递。
正如在创建任务中提到的,通过 src()
产生的流应当从任务中返回,以表示异步完成。
const { src, dest } = require('gulp');
exports.default = function() {
return src('src/*.js')
.pipe(dest('output/'));
}
流的主要 API 是 .pipe()
方法,用于链接转换流或可写流。
const { src, dest } = require('gulp');
const babel = require('gulp-babel');
exports.default = function() {
return src('src/*.js')
.pipe(babel())
.pipe(dest('output/'));
}
dest()
接收一个输出目录字符串,同样产生一个 Node 流,通常用作终止流。当它接收到通过管道传递的文件时,它会将内容和其他详细信息写入给定目录的文件系统。symlink()
方法也可用,其操作类似于 dest()
,但创建的是链接而不是文件(详情请参阅 symlink()
)。
大多数情况下,插件将被放置在 src()
和 dest()
之间,使用 .pipe()
方法,用于转换流中的文件。
向流中添加文件
src()
也可以放在管道中间,根据给定的 glob 向流中添加文件。额外的文件只对流中后续的转换可用。如果 glob 有重叠,文件将被再次添加。
这对于在添加普通 JavaScript 文件到管道并进行混淆处理之前,先转译一些文件非常有用。
const { src, dest } = require('gulp');
const babel = require('gulp-babel');
const uglify = require('gulp-uglify');
exports.default = function() {
return src('src/*.js')
.pipe(babel())
.pipe(src('vendor/*.js'))
.pipe(uglify())
.pipe(dest('output/'));
}
分阶段输出
dest()
可以在管道中间使用,将中间状态写入文件系统。当接收到文件时,当前状态会被写入文件系统,路径会更新以表示输出文件的新位置,然后该文件继续沿着管道传递。
此功能可用于使用同一管道创建未压缩和压缩的文件。
const { src, dest } = require('gulp');
const babel = require('gulp-babel');
const uglify = require('gulp-uglify');
const rename = require('gulp-rename');
exports.default = function() {
return src('src/*.js')
.pipe(babel())
.pipe(src('vendor/*.js'))
.pipe(dest('output/'))
.pipe(uglify())
.pipe(rename({ extname: '.min.js' }))
.pipe(dest('output/'));
}
模式:流动、缓冲和空
src()
可以在三种模式下运行:缓冲模式、流动模式和空模式。这些模式通过 src()
的 buffer
和 read
选项进行配置。
- 缓冲模式是默认模式,它将文件内容加载到内存中。插件通常在缓冲模式下运行,许多插件不支持流动模式。
- 流动模式主要用于处理无法一次性加载到内存中的大文件,如大型图像或视频。内容以小块从文件系统中流式传输,而不是一次性全部加载。如果需要使用流动模式,请寻找支持它的插件或编写自己的插件。
- 空模式不包含内容,仅当只需要处理文件元数据时才有用。