自动化构建工具Gulp入门

212 阅读3分钟

以下是校对并修正后的内容:

简介

Gulp 是一款前端开源的自动化构建工具。与当前流行的 Vite、Webpack、Esbuild 等工具相比,Gulp 在某些构建领域仍有其独特的优点。下面我们一起学习一下 Gulp 的相关知识。

工作原理

Gulp 的工作原理主要是任务和流,这分别对应了 Gulp API 中的两个核心组件 task 和 pipe。Gulp 通过将每一个编译流程定义成任务,并利用 pipe 的概念进行文件流的输入、输出、转换以及其他操作。

任务(task)

简单使用

在 Gulp 中,整个构建流程由一个个任务组成。任务的本质是用 JavaScript 代码实现的函数,函数中可以包含对文件的各种操作,从简单的文件复制、新建到压缩、编译和优化。简单的使用如下:

const gulp = require('gulp');

const CopyFileTask = () => {
    console.log('copy -------- file');
    return gulp.src('./*.js').pipe(gulp.dest('./dist'));
}

exports.CopyFileTask = CopyFileTask;
# 命令行输入 gulp CopyFileTask 即可运行此公开任务
gulp CopyFileTask 
  • pipe 是 Gulp 的核心机制,用于连接不同的文件处理环节。从技术层面来说,pipe 方法允许将一个文件流的输出连接到另一个文件流的输入。从源代码层面来说,它定义在 vinyl-fs 模块(Gulp 内部用于处理文件流的模块)中。vinyl-fs 模块提供了处理文件流的功能,pipe 方法用于将这些文件流连接起来,以实现复杂的文件处理流程。

    • vinyl:vinyl 是一种在 Gulp 和其他一些构建工具中用于表示文件的虚拟文件格式。它抽象了文件系统中的实际文件,将文件的各种属性(如路径、文件名、内容等)封装成一个对象,这样在构建工具的管道(pipe)操作中可以方便地对文件进行处理。
  • gulp.src(globs[, options])是 Gulp 的基础 API 之一,用于读取符合所提供的匹配模式(glob)或者匹配模式数组(array of globs)的文件。

  • gulp.dest(path[, options])用于输出处理后的文件,一般与 pipe 结合使用。

组合任务

Gulp 新版本中提供了两个新的 API,即series()parallel()。在执行任务中主要有两种场景,一是多个任务间相互依赖需要串行执行,二是多个任务并行执行。在 Gulp 中,通过组合使用seriesparallel能完全满足这两个场景。下面介绍这两个 API 的使用。

  • seriesgulp.series用于将多个任务按顺序组合成一个新的任务。它会确保组合中的任务一个接一个地执行,前一个任务完成后才会开始下一个任务。当任务间有依赖关系时,使用series很有必要。例如以下任务:

const gulp = require('gulp');
const ts = require('gulp-typescript');

// ts 文件编译
const CompileTypescript = () => {
    return gulp.src('./src/*.ts').pipe(ts()).pipe(gulp.dest('./tmp/js'));
}

// js 文件压缩
const minifyJsFile = () => {
    return gulp.src('./tmp/js/*.js');
}

exports.default = gulp.series(CompileTypescript, minifyJsFile);
  • parallelparallel用于同时执行多个任务。它接收一个或多个任务函数作为参数,这些任务会在同一时间开始执行,彼此之间没有先后顺序的依赖。这种方式可以充分利用系统资源,加快构建速度,适用于那些相互独立的任务,比如同时编译压缩 js 文件和 css 文件。

const MinifyJs = function () {
    return gulp.src('./src/*.js').pipe(uglify()).pipe(gulp.dest('./dist'));
};

const MinifyCss = function () {
    return gulp.src('./src/*.css').pipe(cssmin()).pipe(gulp.dest('./dist'));
}

exports.default = gulp.parallel(MinifyCss, MinifyJs);

总结

Gulp 的核心功能是对文件进行编译等操作。如果只是日常使用,我们只需要掌握其核心的两个 API 即可。另外,Gulp 对于不同类型的文件处理都有合适的插件,不需要我们重新写代码来实现。本文主要介绍了 Gulp 的基本用法,后续可了解其它一些高级用法。