在Gulp任务中执行ng serve时始终卡在69%的问题求助
解决Gulp任务执行
ng serve卡住的问题 我之前碰到过几乎一模一样的情况,结合你用的Gulp 3.9.1和Angular 6版本,这个卡顿问题大概率是子进程的流处理不规范加上Gulp 3.x对异步任务的特殊要求导致的。下面是具体的解决办法:
修正Gulp任务代码
Gulp 3.x的异步任务需要明确的完成信号,而且直接把子进程输出管道到process.stdout时,默认的流结束行为会干扰Angular CLI的持续输出(开发模式下ng serve是长运行进程,不会主动关闭stdout)。你可以改成这样:
import { exec } from 'child_process'; gulp.task('start:angular', (done) => { // 可加上--verbose参数查看详细加载日志,方便排查具体卡住的模块 const ngProcess = exec('ng serve --verbose'); // 管道输出,禁用自动结束process.stdout/stderr,避免阻塞持续输出 ngProcess.stdout.pipe(process.stdout, { end: false }); ngProcess.stderr.pipe(process.stderr, { end: false }); // 监听进程关闭事件,通知Gulp任务状态 ngProcess.on('close', (exitCode) => { if (exitCode === 0) { done(); // 任务正常结束 } else { done(new Error(`ng serve exited with code ${exitCode}`)); } }); // 捕获进程启动失败的错误,防止任务无响应挂起 ngProcess.on('error', (err) => { done(err); }); });
为什么这样能解决问题?
- Gulp 3.x的异步任务要求:你之前的写法没有提供任务完成的回调(
done),Gulp会一直等待任务结束信号,导致看起来像是卡住了。加上done回调后,Gulp能正确识别任务的运行状态。 - 流的end参数设置:默认情况下,当子进程的stdout流结束时,会关闭
process.stdout,但ng serve在开发模式下是持续运行的,不会主动关闭stdout,这会导致输出缓冲阻塞。{ end: false }可以避免这个问题,让流保持打开状态。 - 详细日志辅助排查:加上
--verbose参数后,你能看到具体卡在哪个模块加载步骤,方便进一步确认是否有模块依赖的问题(不过你手动执行正常,大概率还是流处理的问题)。
额外排查点
如果上面的方法还是不行,可以检查:
- 对比Gulp任务运行环境和手动执行的环境变量是否一致(比如
PATH、NODE_ENV),可以在任务开头加console.log(process.env)打印后对比。 - 尝试升级Gulp到3.x的最新小版本,可能修复了子进程处理的细节bug。
内容的提问来源于stack exchange,提问作者Francisco Farías
相关产品推荐
相关产品推荐

