如何通过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
相关产品推荐
相关产品推荐

