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

如何通过child_process.spawn正确调用package.json中的指定start脚本?

我来帮你搞定这个问题!首先得明确:你原来的package.json脚本是靠nodemon来实现热重启并调用babel-node的,但你的start.js错误地直接调用了babel-node,这是核心问题。另外参数的拆分和转义也没处理对,下面给你两种正确的实现方式:

方式一:完全对齐原package.json的逻辑(保留nodemon热重启)

const spawn = require('child_process').spawn;

// 严格对应原命令的参数结构,注意--exec后面跟着的是完整的执行命令
const args = [
  '--exec',
  'babel-node --only "./,../../../node_modules/@workspace/graphql/src" server.js'
];

// 设置stdio: 'inherit'让子进程共享父进程的输入输出,shell: true支持命令字符串解析
// 直接把cwd设为src,替代原命令里的cd操作,更简洁
const opts = { stdio: 'inherit', cwd: './src', shell: true };

const child = spawn('nodemon', args, opts);

方式二:如果不需要nodemon,直接启动babel-node

如果你只是想单纯用babel-node启动服务(没有热重启),那可以这样写:

const spawn = require('child_process').spawn;

// 参数拆分要准确,每个选项和对应值分开成数组元素
const args = [
  '--only',
  './,../../../node_modules/@workspace/graphql/src',
  'server.js'
];

// 这里shell可以设为false,因为参数已经正确拆分,更安全
const opts = { stdio: 'inherit', cwd: './src', shell: false };

const child = spawn('babel-node', args, opts);

为什么你的原代码失败?

  • 主进程选错了:原脚本的核心是nodemon(负责监听文件变化重启),你直接调用babel-node等于跳过了nodemon的功能,逻辑完全不对。
  • 参数处理错误:你把--only的路径用多余的引号转义了,在spawn的参数里,要么正确拆分数组元素,要么用shell: true时传递完整命令字符串,不需要额外转义引号。
  • cwd设置冲突:你把cwd设为src,同时又在参数里带了冗余路径,导致路径解析混乱,直接通过cwd选项指定工作目录更清晰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:36:37