В приложении Electron, после использования webpack / electron-builder для упаковки, требуется сторонний модуль в подсказках worker_threads MODULE_NOT_FOUND

#node.js #webpack #electron #electron-builder

#node.js #webpack #электрон #electron-builder

Вопрос:

ENV:

  • Electron: 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);
});
 

Приведенный выше код может нормально выводить «привет» при запуске в среде разработки, но когда я запускаю его после упаковки, он выдает следующую ошибку:

 worker error:
{code: "MODULE_NOT_FOUND", requireStack: ["C:UsersuserAppDataLocalProgramsmyapp[worker eval]"]}
 

Должен ли я использовать asarUnpack соответствующую конфигурацию?

Комментарии:

1. было бы полезно, если бы вы могли добавить свою конфигурацию webpack и electron-builder к вашему вопросу

2. @Rhayene Спасибо за ваш совет, я добавил эти конфигурации

3. Я немного поиграл — worker_threads сам работал нормально после сборки. Но я столкнулся с той же ошибкой при запуске вашего образца без установки node-hid в качестве зависимости. Он работал после сборки после установки node-hid как зависимость (не зависимость от разработчика). Хотя я получил Segmentation fault после закрытия окна — что странно. Возможно, вы захотите проверить, не забыли ли вы установить node-hid , прежде чем продолжить поиск.

4. однако я не создавал его с помощью webpack — только с конфигурацией electron-builder по умолчанию. если вы установили node-hid , может быть полезно изолировать ваш рабочий код от нового приложения electron и создать его только с помощью electron-builder, чтобы проверить, работает ли он тогда. Если да, webpack может делать то, что вы не хотите, чтобы он делал.

Ответ №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 —> build —> asarUnpack

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

Стоит упомянуть, что также необходимо включить зависимости node-hid, такие как bindings , node-addon-api , file-uri-to-path