npm命令并行执行失效:watch脚本仅运行server问题排查
解决npm watch脚本仅运行server的问题
你的项目根目录package.json脚本配置如下:
"scripts": { "server": "npm run watch --prefix server", "client": "npm start --prefix client", "watch": "npm run server & npm run client" }
执行npm run watch时只有server服务启动,但直接把npm run server & npm run client粘到终端里却能正常同时跑两个服务,问题出在npm脚本的shell解析逻辑上。
两种解决办法
方法1:用专门的并行工具(推荐)
用concurrently包来管理并行脚本,这是前端项目里常用的方案:
- 先装依赖:
npm install concurrently --save-dev
- 修改watch脚本:
"watch": "concurrently \"npm run server\" \"npm run client\""
方法2:适配npm的shell执行规则
不想加新依赖的话,可以调整脚本写法:
- 如果你用的是bash/zsh类终端:
"watch": "(npm run server &) && npm run client"
- 如果是Windows的cmd终端:
"watch": "start npm run server && start npm run client"
问题原因
npm运行脚本时用的默认shell和你直接打开的终端shell行为不一样。&在终端里是把命令丢后台运行,但npm脚本环境里无法正确识别这个逻辑,会等着server脚本跑完才执行client——但server是watch模式(一直处于运行状态),所以永远不会走到启动client的步骤。而直接在终端执行时,你的shell能正确解析&,把server放后台后立刻启动client。
内容的提问来源于stack exchange,提问作者TrojanMouse
相关产品推荐
相关产品推荐

