基本用法
dest()
函数通常与 src()
函数结合使用,以形成一个完整的文件处理管道。以下是一个简单的例子:
const {
src, dest } = require('gulp');
function copyFiles() {
return src('src/**/*.js') // 读取 src 目录及其子目录下的所有 .js 文件
.pipe(dest('dist/')); // 将读取的文件写入到 dist 目录下
}
exports.copyFiles = copyFiles;
在这个例子中,src('src/**/*.js')
读取了 src
目录及其子目录下所有扩展名为 .js
的文件,并通过管道(pipe)将这些文件传递到 dest('dist/')
,后者会将文件写入到 dist
目录下。
参数
directory
dest()
函数的第一个参数是 directory
,它是一个字符串或函数,用于指定输出目录的路径。如果提供的是函数,该函数将被调用并传入每个 Vinyl 对象,且必须返回一个字符串作为目录路径。
options
dest()
函数还接受一个可选的配置对象 options
,用于定制其行为。以下是一些常用的选项:
- cwd:指定用于与相对路径结合形成绝对路径的目录。默认值为
process.cwd()
。 - mode:创建文件时使用的模式(权限)。如果未设置且 Vinyl 对象的
stat.mode
缺失,则使用进程的默认模式。 - dirMode:创建目录时使用的模式(权限)。如果未设置,则使用进程的默认模式。
- overwrite:当为
true
时,将覆盖具有相同路径的现有文件。默认值为true
。 - append:当为
true
时,将内容添加到文件的末尾,而不是替换现有内容。默认值为false
。 - sourcemaps:启用源映射支持。可以是布尔值或字符串,用于生成内联或外部源映射。默认值为
false
。 - relativeSymlinks:当为
false
时,创建的任何符号链接将是绝对的。默认值为false
。 - useJunctions:仅在 Windows 上相关,当为
true
时,创建目录符号链接作为连接点。默认值为true
。
返回值
dest()
返回一个流(stream),这个流可以在管道的中间或末尾使用,以在文件系统上创建文件。每当一个 Vinyl 对象通过这个流时,它会将内容和其他详细信息写入到指定的目录。
错误处理
在使用 dest()
时,需要注意几个可能的错误情况:
- 如果
directory
是一个空字符串,会抛出一个错误,提示无效的输出目录。 - 如果
directory
不是字符串或函数,也会抛出一个错误。 - 如果
directory
是一个函数,但返回了一个空字符串或undefined
,则会发出一个错误事件,提示无效的输出文件夹。
示例
以下是一个更复杂的示例,展示了如何使用 dest()
的选项来定制文件写入行为:
const {
src, dest } = require('gulp');
const uglify = require('gulp-uglify');
function minifyJS() {
return src('src/**/*.js', {
sourcemaps: true })
.pipe(uglify()) // 使用 Uglify 压缩 JavaScript
.pipe(dest('dist/', {
sourcemaps: true, overwrite: true })); // 将压缩后的文件写入到 dist 目录,并生成内联源映射,覆盖现有文件
}
exports.minifyJS = minifyJS;
在这个示例中,我们使用了 sourcemaps
选项来启用源映射支持,并将 overwrite
选项设置为 true
以覆盖具有相同路径的现有文件。然后,我们使用 Uglify 压缩 JavaScript 文件,并将压缩后的文件写入到 dist
目录,同时生成内联源映射。
通过深入理解 dest()
函数及其选项,你可以更灵活地控制 Gulp 任务中的文件写入行为,从而提高构建效率和可维护性。无论是简单的文件复制,还是复杂的文件处理和转换,dest()
都是你不可或缺的得力助手。