升级到Gulp 4后async-done报time参数需为Array类型错误如何解决
报错根因
该错误由Gulp 4的异步任务识别逻辑冲突导致:你给返回Stream流的任务函数额外添加了async关键字,Gulp内置的async-done依赖会同时尝试捕获两种异步结束信号(Promise信号 + Stream结束信号),内部计时参数处理异常,最终抛出time参数类型错误。
解决方法
方案1:移除多余的async关键字(推荐)
Gulp 4原生支持直接返回Stream的任务格式,不需要额外加async标识,修改后代码如下:
function images() { return gulp .src('assets/img/**/*') .pipe(newer('assets/build/img')) .pipe(imagemin()) .pipe(gulp.dest('assets/build/img')) .pipe(notify({ message: 'Images task complete' })); } // 两种注册任务方式二选一即可 // 方式1:用字符串名注册,支持gulp images命令调用 gulp.task('images', images); // 方式2:直接导出,符合Gulp 4官方规范 // exports.images = images;
方案2:保留async语法的适配方案
如果你的任务中确实需要用到await等async专属语法,不要同时返回Stream,改用node内置的stream pipeline工具封装异步流程:
const { promisify } = require('util'); const streamPipeline = promisify(require('stream').pipeline); async function images() { await streamPipeline( gulp.src('assets/img/**/*'), newer('assets/build/img'), imagemin(), gulp.dest('assets/build/img') ); notify({ message: 'Images task complete' }); } exports.images = images;
额外排查项
如果修改后仍出现同类报错,确认以下两点配置:
- 所有任务函数不要同时混用两种及以上异步标识(不要同时出现返回Stream + 加async + 调用callback的写法)
- 全局
gulp-cli版本升级到v2.3.0及以上,和本地安装的Gulp 4版本匹配
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

