Gulp

yuhuo2022-11-26开发库工具库
参考链接

引入

安装

npm install --global gulp-cli
npm install -D gulp
npm install -D get-gulp-args

构建任务

在项目的根目录下创建 gulpfile.js 文件,或者创建 gulpfile.js 目录并在该目录中包含 index.js 文件。

// gulpfile.js
const { series, parallel } = require('gulp');
const args = require('get-gulp-args')();

// 获取参数
console.log(args[0]);

exports.default = function (cb) {
    console.log("默认任务");
    // 如果任务不返回任何内容,则必须执行 cb() 来指示任务已完成
    cb();
};
exports.normal = function (cb) {
    console.log("普通任务");
    
    cb();
};

function eat(cb) {
    console.log("吃饭");
    cb();
}
function work(cb) {
    console.log("工作");
    cb();
}
function rest(cb) {
    console.log("休息");
    cb();
}
// 顺序执行的组合任务
exports.series = series(eat, work, rest);
// 并发执行的组合任务
exports.parallel = parallel(eat, work, rest);
// 组合任务可以任意嵌套
exports.build = series(eat, parallel(work, series(eat, rest)));

执行任务

# 执行默认任务
gulp
# 执行多个任务,并传参
gulp normal series --参数1 --参数2

文件流

流操作

const gulp = require("gulp");

exports.default = function () {
    return (
        gulp
         	// 创建流
            .src("topic/gulp/src/*.js")
            // 输出流
            .pipe(gulp.dest("topic/gulp/dist/"))
    );
};

使用插件

# gulp-babel插件
npm install -D gulp-babel @babel/core @babel/preset-env
# gulp-uglify插件
npm install -D gulp-uglify uglify-js
# rename插件
npm install -D gulp-rename
# 插件加载器
npm install -D gulp-load-plugins
const gulp = require("gulp");
const babel = require('gulp-babel');
const uglify = require('gulp-uglify');
// const rename = require('gulp-rename');
const $ = require("gulp-load-plugins")();

exports.default = function () {
    return (
        gulp
         	// 创建流
            .src("topic/gulp/src/*.js")
            // babel编译
            .pipe(babel({ presets: ["@babel/preset-env"] }))
            // 添加流
            .pipe(gulp.src("topic/gulp/vendor/*.js"))
            // 输出流
            .pipe(gulp.dest("topic/gulp/dist/"))
            // uglify-js编译
            .pipe(uglify())
            // 重命名(通过插件加载器,可以简化插件引入)
            .pipe($.rename({ extname: ".min.js" }))
            // 输出流
            .pipe(gulp.dest("topic/gulp/dist/"))
    );
};

条件插件

# gulp-uglify插件
npm install -D gulp-uglify uglify-js
# gulp-if插件
npm install -D gulp-if
const { src, dest } = require("gulp");
const gulpif = require("gulp-if");
const uglify = require("gulp-uglify");

function isJavaScript(file) {
    // 判断文件的扩展名是否是 '.js'
    return file.extname === ".js";
}

exports.default = function () {
    // 在同一个管道(pipeline)上处理 JavaScript 和 CSS 文件
    return (
        src(["src/*.js", "src/*.css"])
            // 只对 JavaScript 文件应用 gulp-uglify 插件
            .pipe(gulpif(isJavaScript, uglify()))
            .pipe(dest("output/"))
    );
};

文件监控

const gulp = require("gulp");

function css(cb) {
    cb();
}
function javascript(cb) {
    cb();
}
// 关联单个任务
gulp.watch("src/*.css", css);
// 关联任务组合
gulp.watch("src/*.js", gulp.series(css, javascript));

gulp.watch("src/*.js", { 
    // 监控事件:add,addDir,change,unlink,unlinkDir,ready,error,all(除ready和error外的所有事件,默认)
    events: "all",
    // 是否忽略初始执行:true(默认),false
    ignoreInitial: true,
    // 是否使用队列:true(默认),false
    // 当文件监控程序关联的任务正在运行时又有文件被修改了,那么所关联任务的这次新的执行将被放到执行队列中等待,直到上一次关联任务执行完之后才能运行
    queue: true,
    // 文件更改后的延迟执行时间,默认200(单位毫秒)
    delay: 200,
}, function (cb) {
    cb();
});

Scss监控示例

安装插件

# sass插件(node版本>=14)
npm install -D gulp-sass sass node-sass
# postcss插件
npm install -D gulp-postcss postcss autoprefixer postcss-px-to-viewport
# 压缩css插件
npm install -D gulp-cssmin

编译任务

const gulp = require("gulp");
const sass = require("gulp-sass")(require("sass"));
const postcss = require("gulp-postcss");
const autoprefixer = require("autoprefixer");
const pxtoviewport = require("postcss-px-to-viewport");
const cssmin = require("gulp-cssmin");

exports.watchScss = function () {
    // 监听的路径
    const _path = "topic/gulp/src/scss/**/*.scss";
    gulp.watch(_path, () => {
        return gulp
        	// 编译路径及排除路径
            .src([_path, "!topic/gulp/src/scss/home/home.scss"])
        	// scss转css
            .pipe(sass().on("error", sass.logError))
        	// postcss处理
        	.pipe(postcss([autoprefixer, pxtoviewport({ viewportWidth: 750 })]))
        	// css压缩
        	.pipe(cssmin())
        	// 输出流
            .pipe(gulp.dest("topic/gulp/src/style/"));
    });
};

源文件

@mixin bg($name) {
    background: url("./images/" + $name) no-repeat center / 100%;
}
.page {
    .content {
        width: 75px;
        transform: translate(10px);
        @include bg("content.png");
    }
}

生成文件

.page .content {
  width: 10vw;
  -webkit-transform: translate(1.33333vw);
      -ms-transform: translate(1.33333vw);
          transform: translate(1.33333vw);
  background: url("./images/content.png") no-repeat center/100%;
}

Glob 详解

glob 是用于匹配文件路径的字符串。gulp.scr() 接受单个 glob 或 glob 数组作为参数,且必须至少匹配到一个匹配项,否则将报错。

  • 分隔符 /:无论操作系统,统一使用 /
  • 单星号 *:匹配任意数量(包含0)任意字符的单级目录
  • 双星号 **:匹配任意数量(包含0)任意字符的多级目录
  • 取反 !:必须跟在非取反后面,删除已匹配中符合的部分
// glob数组
gulp.src(["topic/a.css", "topic/b.css"]);

// 单星号,匹配 topic/pc_page.js, topic/page.js
gulp.src("topic/*page.js");

// 双星号,匹配 topic/page.js, topic/pc/page.js, topic/pc/js/page.js
gulp.src("topic/**/page.js");

// 取反
gulp.src(['script/**/*.js', '!scripts/vendor/']);
Last Updated 2024/3/14 09:51:53