#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