如何在npm脚本中执行包含启动服务器的两条命令?
解决npm scripts中第一条持续运行命令阻塞第二条的问题
这个问题很常见——因为nodemon是持续运行的长进程,默认情况下npm scripts会串行执行命令:只有当前面的进程完全退出后,才会执行下一条。你用&的方式在某些系统(比如Windows)可能不生效,即使在类Unix系统能运行,也可能存在输出混乱、进程管理的问题。下面给你几个靠谱的解决方案:
方案1:用跨平台并发工具(最推荐)
concurrently是专门解决npm scripts并发执行问题的工具,完美支持Windows、macOS和Linux,还能给不同命令的输出加上不同颜色区分,非常好用。
步骤如下:
- 先安装依赖:
npm install --save-dev concurrently
- 修改
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插件:
- 安装插件:
npm install --save-dev gulp-nodemon
- 修改
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的所有任务逻辑,比如编译、监听文件等 }));
- 最后修改
package.json的scripts:
"scripts": { "dev": "gulp dev" }
这样只需要运行npm run dev,gulp会先启动服务器,再执行后续的dev任务,你也可以用gulp.parallel让它们同时启动,根据需求调整即可。
内容的提问来源于stack exchange,提问作者ChenLee
相关产品推荐
相关产品推荐

