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

如何在Node.js中从一个JS文件调用运行另一个JS文件?

解决Node.js中执行长期运行脚本导致主进程卡住的问题

问题原因

你使用shell.exec时默认是同步执行模式,当OS1.js是持续运行的控制台游戏(比如包含无限循环或等待用户输入的逻辑)时,主进程会一直等待子进程结束,导致终端卡住无响应。

解决方案

方案1:使用ShellJS的异步执行模式

给shell.exec添加async: true配置,让命令在后台执行,不会阻塞主进程:

const shell = require('shelljs');

if (Bootup === "StartOS1") {
  shell.exec('node OS1.js', { async: true }, (exitCode, stdout, stderr) => {
    if (exitCode !== 0) {
      console.error(`执行出错:${stderr}`);
    }
  });
}

方案2:使用Node.js原生child_process模块(推荐)

原生模块更灵活,适合处理Node.js子进程,推荐用fork(专门用于Node.js进程,支持进程间通信)或spawn:

使用fork(适合需要IPC的场景)

const { fork } = require('child_process');

if (Bootup === "StartOS1") {
  const osProcess = fork('./OS1.js');

  // 可选:监听子进程的错误和退出事件
  osProcess.on('error', (err) => {
    console.error('启动子进程失败:', err);
  });

  osProcess.on('exit', (code) => {
    console.log(`子进程已退出,退出码:${code}`);
  });
}

使用spawn(适合需要继承终端交互的场景)

如果你的游戏需要独占控制台接收用户输入,配置stdio: 'inherit'让子进程复用主进程的终端:

const { spawn } = require('child_process');

if (Bootup === "StartOS1") {
  const osProcess = spawn('node', ['OS1.js'], {
    stdio: 'inherit',
    shell: true
  });

  osProcess.on('error', (err) => {
    console.error('启动失败:', err);
  });
}

注意事项

  • 同步执行仅适合运行短时间内会结束的命令,游戏这类长期运行的进程必须用异步方式。
  • 如果子进程需要和主进程通信,fork是最佳选择,它内置了IPC通道,可以方便地发送/接收消息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 02:17:03