【问题标题】:In Electron app, after using webpack/electron-builder to package, require third-party module in worker_threads prompts MODULE_NOT_FOUND在 Electron 应用中,使用 webpack/electron-builder 打包后,在 worker_threads 提示 MODULE_NOT_FOUND 中需要第三方模块
【发布时间】:2021-04-10 23:49:46
【问题描述】:

环境:

  • 电子:v11.0.3
  • 节点:v14.15.1
  • 操作系统:win10 2020 x64

package.json - 构建

"build":{
  "productName": "myapp",
  "directories": {
    "output": "build"
  },
  "files": [
    "dist/electron/**/*"
  ]
}

Webpack.json

{
    entry: {
      main: path.join(__dirname, '../src/main/index.js')
    },
    externals: [
      ...Object.keys(dependencies || {})
    ],
    module: {
      rules: [
        {
          test: /\.js$/,
          use: 'babel-loader',
          exclude: /node_modules/
        },
        {
          test: /\.node$/,
          use: 'node-loader'
        }
      ]
    },
    node: {
      __dirname: process.env.NODE_ENV !== 'production',
      __filename: process.env.NODE_ENV !== 'production'
    },
    output: {
      filename: '[name].js',
      libraryTarget: 'commonjs2',
      path: path.join(__dirname, '../dist/electron')
    },
    plugins: [
      new webpack.ExternalsPlugin("commonjs", ["node-hid"])
    ],
    resolve: {
      extensions: ['.js', '.json', '.node']
    },
    target: 'electron-main'
  }

index.js

const { Worker } = require('worker_threads');
const worker = new Worker(`const HID = require("node-hid");console.log("hello");`, { eval:true });
worker.on('error', (err) => {
    console.log('worker error:',err);
});

以上代码在开发环境中运行时可以正常输出“hello”,但是打包后运行时会输出如下错误:

worker error:
{code: "MODULE_NOT_FOUND", requireStack: ["C:\Users\user\AppData\Local\Programs\myapp\[worker eval]"]}

要不要使用asarUnpack相关配置?

【问题讨论】:

  • 如果您可以将 webpack 和 electron-builder 配置添加到您的问题中,将会很有帮助
  • @Rhayene 谢谢你的建议,我已经添加了这些配置
  • 我玩了一下——worker_threads 本身在构建后运行良好。但是在没有安装 node-hid 作为依赖项的情况下运行您的示例时,我遇到了同样的错误。它在安装 node-hid 作为依赖项(不是开发依赖项)后构建后工作。虽然我在关闭窗口后收到了Segmentation fault - 这很奇怪。在继续搜索之前,您可能需要检查是否忘记安装 node-hid
  • 但是我没有使用 webpack 构建它 - 只是使用默认的 electron-builder 配置。如果您安装了node-hid,将您的工作代码隔离到一个新的电子应用程序并仅使用电子构建器构建它以检查它是否有效可能会有所帮助。如果是,webpack 可能会做一些你不希望它做的事情。

标签: node.js webpack electron electron-builder


【解决方案1】:

最后我用asarUnpack解决了这个问题:

index.js

const { Worker } = require('worker_threads');
const worker = new Worker(`
    const path = require("path");
    function dynamicallyRequire(moduleName) {
        let modulePath = getNodeModulesPath(moduleName);
        let module = require(modulePath);
        return module;
    }
    function getNodeModulesPath(moduleName) {
        return workerData.env === 'development' ? moduleName : path.join(process.cwd(), 'resources\\app.asar.unpacked\\node_modules\\' + moduleName);
    }
    const HID = dynamicallyRequire("node-hid");
    console.log("hello");
`, { eval:true, workerData: { env: process.env.NODE_ENV }});
worker.on('error', (err) => {
    console.log('worker error:',err);
});

package.json --> 构建 --> asarUnpack

"asarUnpack": [
  "./node_modules/node-hid/**/*",
  "./node_modules/node-addon-api/**/*",
  "./node_modules/bindings/**/*",
  "./node_modules/file-uri-to-path/**/*"
]

值得一提的是node-hid的依赖也需要包含,如bindingsnode-addon-apifile-uri-to-path

【讨论】:

    猜你喜欢
    • 2018-08-26
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    • 2017-07-27
    • 2020-06-29
    • 2017-04-30
    • 2021-04-27
    • 1970-01-01
    相关资源
    最近更新 更多