gulp自动化和增强工作流程的工具包

流式构建系统


什么是 gulp?

  • 自动化 - gulp 是一个工具包,可帮助您自动化开发工作流程中繁琐或耗时的任务。
  • 平台无关 - gulp 已内置于所有主流 IDE 中,人们正在将 gulp 与 PHP、.NET、Node.js、Java 和其他平台结合使用。
  • 强大的生态系统 - 使用 npm 模块完成任何操作 + 超过 3000 个精选插件用于流式文件转换。
  • 简单 - gulp 仅提供极简的 API,易于学习和使用。

安装

安装 gulp 命令行工具

language 复制代码
npm install --global gulp-cli

创建项目目录并导航至其中

language 复制代码
npx mkdirp my-project
cd my-project

在项目目录中创建 package.json 文件

language 复制代码
npm init

这将引导您设置项目名称、版本、描述等。

在 devDependencies 中安装 gulp 包

language 复制代码
npm install --save-dev gulp

验证您的 gulp 版本

language 复制代码
gulp --version

确保输出与以下屏幕截图一致,否则您可能需要重新执行本指南中的步骤。

创建 gulpfile

使用文本编辑器,在项目根目录下创建一个名为 gulpfile.js 的文件,内容如下:

language 复制代码
function defaultTask(cb) {
// 在此处放置默认任务的代码
cb();
}

exports.default = defaultTask

测试

在项目目录中运行 gulp 命令:

language 复制代码
gulp

要运行多个任务,可以使用 gulp

结果

默认任务将运行,但不执行任何操作。

示例 gulpfile.js

此文件将帮助您了解 gulp 的功能。

js 复制代码
var gulp = require('gulp');
var less = require('gulp-less');
var babel = require('gulp-babel');
var concat = require('gulp-concat');
var uglify = require('gulp-uglify');
var rename = require('gulp-rename');
var cleanCSS = require('gulp-clean-css');
var del = require('del');

var paths = {
  styles: {
    src: 'src/styles/**/*.less',
    dest: 'assets/styles/'
  },
  scripts: {
    src: 'src/scripts/**/*.js',
    dest: 'assets/scripts/'
  }
};

/* Not all tasks need to use streams, a gulpfile is just another node program
 * and you can use all packages available on npm, but it must return either a
 * Promise, a Stream or take a callback and call it
 */
function clean() {
  // You can use multiple globbing patterns as you would with `gulp.src`,
  // for example if you are using del 2.0 or above, return its promise
  return del([ 'assets' ]);
}

/*
 * Define our tasks using plain functions
 */
function styles() {
  return gulp.src(paths.styles.src)
    .pipe(less())
    .pipe(cleanCSS())
    // pass in options to the stream
    .pipe(rename({
      basename: 'main',
      suffix: '.min'
    }))
    .pipe(gulp.dest(paths.styles.dest));
}

function scripts() {
  return gulp.src(paths.scripts.src, { sourcemaps: true })
    .pipe(babel())
    .pipe(uglify())
    .pipe(concat('main.min.js'))
    .pipe(gulp.dest(paths.scripts.dest));
}

function watch() {
  gulp.watch(paths.scripts.src, scripts);
  gulp.watch(paths.styles.src, styles);
}

/*
 * Specify if tasks run in series or parallel using `gulp.series` and `gulp.parallel`
 */
var build = gulp.series(clean, gulp.parallel(styles, scripts));

/*
 * You can use CommonJS `exports` module notation to declare tasks
 */
exports.clean = clean;
exports.styles = styles;
exports.scripts = scripts;
exports.watch = watch;
exports.build = build;
/*
 * Define default task that can be called by just running `gulp` from cli
 */
exports.default = build;

在 gulpfile 中使用最新的 JavaScript 版本

Gulp 提供了一个包装器,它将被加载到你的 ESM 代码中,因此你可以将 gulpfile 命名为 gulpfile.mjs,或者在 package.json 文件中指定 "type": "module"

以下是使用 ESNext 编写的与上述示例相同的代码。

js 复制代码
import { src, dest, watch } from 'gulp';
import less from 'gulp-less';
import babel from 'gulp-babel';
import concat from 'gulp-concat';
import uglify from 'gulp-uglify';
import rename from 'gulp-rename';
import cleanCSS from 'gulp-clean-css';
import del from 'del';

const paths = {
  styles: {
    src: 'src/styles/**/*.less',
    dest: 'assets/styles/'
  },
  scripts: {
    src: 'src/scripts/**/*.js',
    dest: 'assets/scripts/'
  }
};

/*
 * For small tasks you can export arrow functions
 */
export const clean = () => del([ 'assets' ]);

/*
 * You can also declare named functions and export them as tasks
 */
export function styles() {
  return src(paths.styles.src)
    .pipe(less())
    .pipe(cleanCSS())
    // pass in options to the stream
    .pipe(rename({
      basename: 'main',
      suffix: '.min'
    }))
    .pipe(dest(paths.styles.dest));
}

export function scripts() {
  return src(paths.scripts.src, { sourcemaps: true })
    .pipe(babel())
    .pipe(uglify())
    .pipe(concat('main.min.js'))
    .pipe(dest(paths.scripts.dest));
}

 /*
  * You could even use `export as` to rename exported tasks
  */
function watchFiles() {
  watch(paths.scripts.src, scripts);
  watch(paths.styles.src, styles);
}
export { watchFiles as watch };

const build = gulp.series(clean, gulp.parallel(styles, scripts));
/*
 * Export a default task
 */
export default build;

增量构建

您可以使用 gulp.src 函数的 since 选项和 gulp.lastRun 过滤掉任务运行期间未更改的文件:

js 复制代码
const paths = {
  ...
  images: {
    src: 'src/images/**/*.{jpg,jpeg,png}',
    dest: 'build/img/'
  }
}

function images() {
  return gulp.src(paths.images.src, {since: gulp.lastRun(images)})
    .pipe(imagemin())
    .pipe(gulp.dest(paths.images.dest));
}

function watch() {
  gulp.watch(paths.images.src, images);
}

任务运行时间保存在内存中,当 gulp 退出时会丢失。只有
watch 任务中,在 images 任务第二次运行的时候,才会保存运行时间。

关于项目

gulp 是一款工具包,可帮助您自动化开发工作流程中繁琐或耗时的任务。利用 gulp 和 JavaScript 的灵活性来自动化缓慢、重复的工作流程,并将其组合成高效的构建管道。
MIT
Javascript
33,050
4203
1017
2013-07-04
2025-06-02

增长趋势 - stars