Skip to main content

Gulp

Gulp 是一个基于 Node.js 的流(stream)的自动化构建工具,其核心优势在于简洁的 API 和强大的流处理能力。Gulp 的源码解析涉及到对其内部机制、API 设计以及如何利用 Node.js 流的深入理解。 它利用 Node.js 流来快速构建项目。它的核心在于自动化繁琐或复杂的任务,如 CSS 编译、图片压缩、文件合并等。Gulp 配置通常在名为 gulpfile.js 的文件中进行,

npm
npm i -D gulp gulp-plumber gulp-rollup gulp-uglify through2 @rollup/plugin-replace
yarn
yarn add -D gulp gulp-plumber gulp-rollup gulp-uglify through2 @rollup/plugin-replace
pnpm
pnpm add -D gulp gulp-plumber gulp-rollup gulp-uglify through2 @rollup/plugin-replace
package.json
{
"scripts": {
"test": "gulp"
}
}

基本结构

gulpfile.js
const { task, src, series, dest } = require('gulp')
const rollup = require('gulp-rollup')
const through2 = require('through2')
const replace = require('@rollup/plugin-replace')
const plumber = require('gulp-plumber')
const uglify = require('gulp-uglify')

const cleanEntry = './dist/**/*.js'
const cleanLibrary = []

/**
* @description: 获取 dist目录里面所有的 JS
*/
function genertCleanLibrary() {
return src(cleanEntry)
.pipe(
through2.obj(function (file, encode, cb) {
this.push(file.path)
cb()
})
)
.on('data', function (data) {
cleanLibrary.push(data)
})
}

/**
* @description: 生成打包
*/
function Building() {
console.log(cleanLibrary)
return src(cleanEntry)
.pipe(
rollup({
input: cleanLibrary,
output: {
format: 'cjs'
},
onwarn: function (warning) {
if (warning.code === 'THIS_IS_UNDEFINED') {
return
}
console.error(
warning.message,
'gulpfile 中的 rollup 报错了 🍺🍺🍺'
)
},
plugins: [
replace({
preventAssignment: true,
'process.env.NODE_ENV': JSON.stringify('production')
})
]
})
)
.pipe(plumber())
.pipe(
uglify({
mangle: true, //类型:Boolean 默认:true 是否修改变量名
compress: true //类型:Boolean 默认:true 是否完全压缩
})
)
.pipe(dest('./dist'))
}

const buildHandle = series(genertCleanLibrary, Building)

task('default', buildHandle)

定义任务

  • 使用 gulp.task 定义任务,每个任务通常对应一系列的 Gulp 插件调用和操作。
  • 任务名:任务的唯一标识符。
  • 任务函数:定义任务要执行的操作。

Gulp API

  • gulp.src :指定要处理的文件的路径。
  • gulp.dest :指定处理后的文件输出路径。
  • gulp.watch:监听文件变化,并在变化时执行指定任务。
  • gulp.seriesgulp.parallel:用于组合任务。series 按顺序执行,parallel 并行执行。
Gulp

优点

  1. 易于使用:GulpAPI 简单直观,使得设置和配置任务变得容易。
  2. 高效性能:通过使用 Node.js 的流, Gulp 能够快速地执行任务,并且在处理文件时不需要写入磁盘。
  3. 丰富的插件生态:Gulp 社区提供了大量的插件,几乎可以完成任何自动化任务。
  4. 代码而非配置:Gulp 使用代码编写任务,这为复杂的任务提供了更高的灵活性和控制能力。
  5. 实时重载:与浏览器同步功能,使得开发体验更流畅。
  6. 串联任务:可以轻松地使用管道(pipe)将任务串联起来,形成复杂的工作流。

缺点

  1. 错误处理:在流中处理错误可能比传统的任务运行器更复杂,尤其是在串联多个操作时。
  2. 学习曲线:对于不熟悉 Node.js 的开发者来说,Gulp 可能有一定的学习曲线。
  3. 插件质量不一:虽然插件众多,但它们的质量和维护状态各不相同。
  4. Webpack 的比较:对于模块打包和处理依赖关系,Gulp 不如 Webpack 强大。
  5. 新项目采用率下降:随着 Webpack 等更专注于模块打包的工具的流行,Gulp 在新项目中的采用率有所下降。

总结

Gulp 以其简单、高效的工作方式在自动化构建领域占有一席之地。 它非常适合处理一系列复杂的前端开发任务,尤其是当这些任务涉及到大量的文件处理时。 然而,在模块打包和依赖管理方面,它可能不如一些专门的工具(如Webpack)强大。