gpt4 book ai didi

node.js - 在 Electron 应用中,使用 webpack/electron-builder 打包后,在 worker_threads 提示 MODULE_NOT_FOUND 中需要第三方模块

转载 作者:行者123 更新时间:2023-12-03 12:38:02 25 4
gpt4 key购买 nike

ENV:


  • Electron :v11.0.3
  • Node :v14.15.1
  • 操作系统:win10 2020 x64

  • package.json - build

    "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相关配置?

    最佳答案

    最后我使用 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

    关于node.js - 在 Electron 应用中,使用 webpack/electron-builder 打包后,在 worker_threads 提示 MODULE_NOT_FOUND 中需要第三方模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65575329/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com