You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:57:02