【发布时间】:2019-11-27 19:02:46
【问题描述】:
我的 gulp 文件的简化版本如下所示:
stylusFiles=[...];
gulp.task("stylus", function(done){
global.stopOnError = true;
stylusFiles.forEach((file) => {
executeStylus(file.name, file.src, Date.now());
});
done();
});
javascFiles = [firstjs, secondjs];
gulp.task("firstcompile", function (done) {
createBundle(firstjs);
done();
});
gulp.task("secondcompile", function (done) {
createBundle(secondjs);
done();
});
gulp.task("compile", function(done) {
setVersion();
global.stopOnError = true;
stylusFiles.forEach((file) => {
executeStylus(file.name, file.src, Date.now());
});
createBundles(javascFiles);
done();
});
gulp.task("seqcompile",
gulp.parallel("stylus",
gulp.series("firstcompile","secondcompile"),
function(done) {
setVersion();
global.stopOnError = true;
done();
}
));
手写笔编译以并发方式工作(输出顺序!= 代码中手写笔文件的顺序)。如果我在任何单个 JS 文件上运行 gulp,它就可以工作。我尝试强制顺序执行的原因是 gulp compile 在完整的 JS 文件集上要么因“堆内存不足”错误而崩溃(即使在 16 GB 工作站上使用 --max_old_stack_size=12000 ) 或在较大的 JS 文件(原始大小 10 h)。但是,在示例中的编写方式 gulp seqcompile 仍然不是顺序的,因为输出顺序!=代码中 JS 文件的顺序,并且在我的远程实例上,gulp 仍然无限期运行(在至少我现在在 16 GB 工作站上取得了成功)。
- 如何强制顺序执行?
- 如果能写出
gulp.series(javascFiles)之类的东西就好了。 - 我不确定 setVersion 是否只在 在 stylus 和 js 编译之前运行一次。
【问题讨论】:
-
尝试用
for...of替换forEach调用,看看是否得到顺序执行。 -
我会尽快尝试!
-
作为测试,我用手写笔文件进行了尝试:
for (const file of stylusFiles) {...};,但是手写笔构建的完成顺序仍然与它们在数组 stylusFiles 中指定的顺序不同,所以执行仍然是并发的。 -
由于没有人能够向我提出解决方案,我想我将不得不在不久的将来放弃 gulp 以使用 webpack 或其他一些解决方案。
标签: javascript functional-programming gulp frontend gulp-uglify