Gulp 4使用@rollup/stream且tsconfig target为es6时任务无法正常结束
方案1:保留target: "es5"配置,解决__spreadArray导出报错
该方案无需调整现有构建流程逻辑,从报错根因直接修复,优先级更高:
- 报错原因:你更新的内部TS库使用TS 4.2+版本编译,新增了
__spreadArray辅助函数,该函数仅在tslib@2.1.0及以上版本提供,你当前项目依赖的低版本tslib没有对应导出。 - 修复步骤:
- 执行命令安装高版本tslib:
npm install tslib@^2.6.0 --save- 在
tsconfig.json的compilerOptions中新增配置,开启辅助函数自动导入:
"importHelpers": true- 将
tsconfig.json的target改回es5,重新执行构建即可,既不会出现__spreadArray报错,也不会触发rollup任务挂起问题。
方案2:target: es6场景下rollup任务挂起的修复
如果需要继续使用es6作为编译目标,可通过以下方式解决进程挂起问题:
- 问题根因:你当前使用的
@rollup/stream@1.1.0存在已知兼容bug,构建完成后不会主动销毁内部rollup实例,导致进程持有句柄无法退出,该问题在2.0及以上版本已修复。 - 修复步骤:
- 升级
@rollup/stream到稳定版本:
npm install @rollup/stream@^3.0.1 --save-dev- 若升级后仍有问题,可在rollup配置中新增
cache: false关闭内部缓存,同时手动监听流结束事件强制清理资源,修改rollupTask如下:
function rollupTask (cb) { const stream = rollup({ input: "./src/main.ts", cache: false, external: [ "lodash", ], output: { format: "cjs", sourcemap: true }, plugins: [ typescript(), ], }) .pipe(source("common.bundle.js")) .pipe(buffer()) .pipe(gulpif(production, terser())) .pipe(gulp.dest('./dist')); stream.on('end', () => { cb(); setTimeout(() => process.exit(0), 100); // 极端情况下兜底退出 }); stream.on('error', cb); return stream; }; - 升级
内容的提问来源于stack exchange,提问作者matt123miller
相关产品推荐
相关产品推荐

