You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gulp任务重复执行问题求助:执行次数随时间倍增

解决Gulp任务重复执行(次数倍增)的问题

我一眼就看出问题所在了——你这个任务执行次数不断翻倍的情况,是因为每次文件修改时,你都在重复创建新的Gulp监听器实例,导致监听器一层叠一层,每触发一次change事件就多一组监听,最终执行次数直接指数级增长。

问题根源分析

看你代码里的监听逻辑:

const watcherJS = watch([filesJs]);
watcherJS.on('change', function (path, stats) {
 console.log(`File ${path} was changed`);
 return gulp.watch(filesJs, gulp.series('uglify')); // 这里是核心问题!
});

你已经通过watcherJS = watch([filesJs])创建了一个监听器,但在它的change回调里又调用了gulp.watch,相当于每次文件修改都新增一个监听器。第一次修改后有2个监听器,第二次修改后每个监听器又各新增一个,变成4个,以此类推,次数自然就翻倍了。CSS部分的逻辑完全一样,也存在同样的问题。

修正后的代码方案

你只需要移除重复创建监听器的代码,只保留一个监听器实例即可,有两种简洁的写法:

写法一:在监听回调中直接执行任务

var gulp = require('gulp'),
    // Js相关依赖
    babel = require('gulp-babel'),
    uglify = require('gulp-uglify'),
    filesJs = './js/edit/*.js',
    outputJs = './js',
    // Sass相关依赖
    sass = require('gulp-sass'),
    filesCss = './css/**/*.+(scss|sass)',
    outputCss = './css';
const { watch } = require('gulp');

// Uglify任务
gulp.task('uglify', function () {
    return gulp.src(filesJs)
        .pipe(babel({presets: ['@babel/preset-env']}))
        .pipe(uglify())
        .pipe(gulp.dest(outputJs));
});

// JS文件监听:只创建一次监听器,变化时直接执行任务
watch(filesJs, function (path, stats) {
    console.log(`File ${path} was changed`);
    return gulp.series('uglify')();
});

// Sass编译任务
gulp.task('sass', function () {
    return gulp.src(filesCss)
        .pipe(sass({ outputStyle: 'compressed' }).on('error', sass.logError))
        .pipe(gulp.dest(outputCss));
});

// CSS文件监听:同样只保留一个监听器
watch(filesCss, function (path, stats) {
    console.log(`File ${path} was changed`);
    return gulp.series('sass')();
});

// 默认任务:并行执行初始化编译
gulp.task('default', gulp.parallel('uglify', 'sass'));

写法二:直接将任务绑定到监听器(更简洁)

如果不需要额外的日志输出,甚至可以更简单:

// 监听JS文件变化,自动执行uglify任务
watch(filesJs, gulp.series('uglify')).on('change', function(path) {
    console.log(`File ${path} was changed`);
});

// 监听CSS文件变化,自动执行sass任务
watch(filesCss, gulp.series('sass')).on('change', function(path) {
    console.log(`File ${path} was changed`);
});

修正效果

修改后重启Gulp,每次修改文件只会触发一次任务执行,再也不会出现执行次数倍增、耗时越来越长的问题了。

内容的提问来源于stack exchange,提问作者David Silva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 23:42:47