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

如何在npm脚本中执行包含启动服务器的两条命令?

解决npm scripts中第一条持续运行命令阻塞第二条的问题

这个问题很常见——因为nodemon是持续运行的长进程,默认情况下npm scripts会串行执行命令:只有当前面的进程完全退出后,才会执行下一条。你用&的方式在某些系统(比如Windows)可能不生效,即使在类Unix系统能运行,也可能存在输出混乱、进程管理的问题。下面给你几个靠谱的解决方案:

方案1:用跨平台并发工具(最推荐)

concurrently是专门解决npm scripts并发执行问题的工具,完美支持Windows、macOS和Linux,还能给不同命令的输出加上不同颜色区分,非常好用。

步骤如下:

  1. 先安装依赖:
npm install --save-dev concurrently
  1. 修改package.json里的scripts:
"scripts": {
  "dev": "concurrently \"nodemon ./bin/www\" \"gulp dev\""
}

这样两条命令就会同时启动,互不阻塞,而且输出会清晰区分开。

方案2:分系统处理(无需额外依赖)

如果你不想安装新工具,可以根据操作系统分别配置:

  • 类Unix系统(macOS/Linux):用&让nodemon后台运行,这样后续命令能正常执行:
"scripts": {
  "dev": "nodemon ./bin/www & gulp dev"
}
  • Windows系统:用start命令启动nodemon的独立窗口,避免阻塞:
"scripts": {
  "dev": "start nodemon ./bin/www && gulp dev"
}

缺点是Windows下会弹出额外的命令行窗口,而且跨平台需要维护两套脚本,不够优雅。

方案3:将nodemon集成到gulp任务中

既然你已经在用gulp,也可以把启动服务器的逻辑直接写到gulp任务里,用gulp-nodemon插件:

  1. 安装插件:
npm install --save-dev gulp-nodemon
  1. 修改gulpfile.js:
const gulp = require('gulp');
const nodemon = require('gulp-nodemon');

// 定义启动服务器的任务
gulp.task('start-server', (cb) => {
  let serverStarted = false;
  return nodemon({ script: './bin/www' })
    .on('start', () => {
      // 确保只回调一次,避免gulp任务重复执行
      if (!serverStarted) {
        cb();
        serverStarted = true;
      }
    });
});

// 把原有的dev任务和启动服务器任务结合执行
gulp.task('dev', gulp.series('start-server', () => {
  // 这里放你原来gulp dev的所有任务逻辑,比如编译、监听文件等
}));
  1. 最后修改package.json的scripts:
"scripts": {
  "dev": "gulp dev"
}

这样只需要运行npm run dev,gulp会先启动服务器,再执行后续的dev任务,你也可以用gulp.parallel让它们同时启动,根据需求调整即可。

内容的提问来源于stack exchange,提问作者ChenLee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:59:34