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
相关产品推荐
相关产品推荐

