在编译和缩小后使child_process.fork()在电子中工作

时间:2018-11-02 15:37:45

标签: javascript node.js webpack electron electron-builder

所以基本上我正在构建一个电子应用程序。我遇到了一个有趣的问题,我已经尝试解决了几个小时。应用程序的一部分需要是一个与源目录相关的 fork 进程(child_process.fork())。

赞:

- app
  - main-process
    - core
      - manager
       - index.js 
       - fork.js
       - some-module.js
  - main.js

webpack将源代码编译为一个文件/捆绑包(main.js文件),并在 app.asar 中将electron-builder编译为一个文件。

我遇到的问题是如何在相对目录中使用child_process.fork(),该相对目录在编译和缩小应用程序时要求分叉进程中的模块。那些需要编译的模块现在位于main.js文件中,该文件已精化,因此在fork.js中丢失了引用,从而找不到“ some-module”。

// app/main-process/core/manager/index.js
const child_process = require('child_process');


let child = child_process.fork('./fork.js');
child.send('start');



// app/main-process/core/manager/fork.js
const someModule = require('./some-module');
someModule(()=>{
  ...
})

编译后,webpack会自动将这些需求路径解析为捆绑包中的引用,但是由于child_process.fork()需要一个文件,因此这是行不通的。

webpack配置相当严格。它不是一个复杂的应用程序。这是一个多webpack的配置,但我只是显示了主进程的配置。

const backend = {
  entry:path.resolve(__dirname, '../app/main.js'),
  devtool:false,
  target:'node',
  output: {
    filename: 'main-compiled.js',
    sourceMapFilename: 'main-compiled.js.map',
  },
  node:{
    fs:'empty',
    http:'empty',
    crypto:'empty',
    electorn:'empty',
    __dirname:true,
    __filename:true,
  },
  module:{
    loaders:[
      {
        test:/\.json$/,
        use:[
          {loader:'json-loader'},
        ]
      }
    ]
  },
  plugins:[
    new webpack.optimize.UglifyJsPlugin({
      sourceMap:true,
      parallel: true,
      compress:{
        warnings:false,
        drop_console:true
      }
    })
  ],
  externals:[
    nodeExternals(),
  ]
};

我已经弄清楚了,使用webpack可以将这个fork.js文件排除在捆绑包之外,而对于Electro-builder,可以通过在配置中使用 files 数组来保留目录构造函数

1 个答案:

答案 0 :(得分:0)

我知道了。我使思考过程变得过于复杂。可以通过使用集群主/工作者模式并仅使用main.js文件来协调以“子”(fork)生成时通过命令参数执行什么逻辑的行为。