【问题标题】:Can Electron JS execute a child process with a different node_modules context?Electron JS 可以使用不同的 node_modules 上下文执行子进程吗?
【发布时间】:2023-01-25 01:50:20
【问题描述】:

我正在使用 Electron JS 打包节点应用程序,但现在我需要创建一个无头的服务器应用程序,它将与 Electron JS 应用程序并行运行。

我希望 Electron 启动一个节点子进程。

问题是这个服务器应用程序应该有自己的 node_modules 文件夹。

有没有办法使用 Electron JS 将节点应用程序作为子进程执行(利用用户已经拥有 Node 环境的事实,例如 Electron JS)但在不同的上下文中?例如。有自己的 node_modules。基本上它应该是一个与父进程无关的子进程(唯一的关系是它也是一个节点进程)。

【问题讨论】:

    标签: node.js electron electron-packager


    【解决方案1】:

    为什么不?如果您为 electron.exe 提供另一个入口点或者您为包装命名它,您应该能够做到这一点。

    例如,在打包之前,您可以在用于 electron 的主 js 文件中添加代码,该代码根据接收不同的进程参数动态需要模块。

    【讨论】:

    • 我没有考虑在同一个可执行文件中使用不同的参数。那行得通。唯一的问题是我的 Electron 设置使用 webpack 来捆绑所有 Javascript 文件,但有些东西不能很好地与 webpack 一起使用(例如 socket.io 服务器版本)。我应该以某种方式在可执行文件中包含子进程的 node_modules,但不确定该怎么做。
    • 你可以排除一些模块被 webpack 捆绑,你可以在一个单独的文件夹中提供它们。
    【解决方案2】:

    是的,由于 how node resolves require(),child_process 可以使用它自己的 node_modules。

    This answer 描述了如何在构建时通过运行 cp package.json headless-server/package.json && cp package-lock.json headless-server/package-lock.json && cd headless-server/ && npm install --only production 为您的无头服务器安装 node_modules

    然后确保您将电子应用程序与 headless-server 文件夹一起发送,并在您的电子应用程序中执行以下命令:

    const localServerChildProcess = child_process.fork(
        path.join(__dirname, 'headless-server/ENTRYPOINT.js'),
        [],
        { silent: false }
    );
    localServerChildProcess.on('message', (d) => console.log('message', d));
    localServerChildProcess.on('error', (e) => console.error('child process error', e));
    

    旁注:{ silent: false } 允许 child_process 的日志打印到与电子应用程序日志相同的位置。

    【讨论】:

      猜你喜欢
      • 2021-11-26
      • 1970-01-01
      • 2018-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-05
      • 2021-09-17
      • 2019-10-19
      相关资源
      最近更新 更多