javascript - 使用 Electron 伪造打包应用程序时出现问题 "Can' t 解决 './→' “

标签 javascript node.js webpack electron electron-forge

我无法使用 electron-forge 打包我的 Electron 应用程序.
看起来罪魁祸首是 native 模块,例如'sqlite3'。
运行命令时npm run package ,我收到以下错误:Module not found: Error: Can't resolve './→' in 'C:\Users\pauco\mybeast\node_modules\node-pre-gyp\lib'我试过:

  • npm rebuild
  • node_modules\.bin\electron-rebuild

  • 完整跟踪:
    × Compiling Main Process Code
    
    An unhandled error has occurred inside Forge:
    Compilation errors in the main process: Hash: dac46d131e24e591c251
    Version: webpack 4.44.0
    Time: 2526ms
    Built at: 2020-07-27 18:35:10
                                                              Asset      Size  Chunks         Chunk Names
                                                           index.js   350 KiB       0         main
                                                       index.js.map  1.28 MiB       0  [dev]  main
    native_modules//lib/binding/napi-v3-win32-x64/node_sqlite3.node  1.36 MiB
     native_modules/lib\binding\napi-v3-win32-x64\node_sqlite3.node  1.36 MiB
    Entrypoint main = index.js index.js.map
      [3] external "path" 42 bytes {0} [built]
      [4] external "fs" 42 bytes {0} [built]
      [8] external "electron" 42 bytes {0} [built]
     [26] ./src/backend/backend.ts 6.12 KiB {0} [built]
     [27] external "child_process" 42 bytes {0} [built]
     [45] ./src/backend/GameManager/services/GameManagerService.ts 7.59 KiB {0} [built]
     [46] ./node_modules/axios/index.js 40 bytes {0} [built]
     [56] ./node_modules/debug/src/index.js 263 bytes {0} [built]
     [87] ./src/backend/GameManager/GameManager.ts 864 bytes {0} [built]
     [88] ./src/backend/GameManager/services/GameDiscovererService.ts 7.68 KiB {0} [built]
    [125] ./src/backend/Storage.ts 5.4 KiB {0} [built]
    [126] ./node_modules/sqlite3/lib/sqlite3.js 6.16 KiB {0} [built]
    [200] ./src/backend/utils.ts 737 bytes {0} [built]
    [201] ./node_modules/electron-squirrel-startup/index.js 1 KiB {0} [built]
    [202] ./node_modules/rxjs/_esm5/index.js + 101 modules 156 KiB {0} [built]
          | ./node_modules/rxjs/_esm5/index.js 3.33 KiB [built]
          | ./node_modules/rxjs/_esm5/internal/config.js 859 bytes [built]
          | ./node_modules/rxjs/_esm5/internal/util/UnsubscriptionError.js 707 bytes [built]
          | ./node_modules/rxjs/_esm5/internal/Subscription.js 4.92 KiB [built]
          | ./node_modules/rxjs/_esm5/internal/Subscriber.js 8.44 KiB [built]
          | ./node_modules/rxjs/_esm5/internal/symbol/observable.js 218 bytes [built]
          | ./node_modules/rxjs/_esm5/internal/util/identity.js 127 bytes [built]
          | ./node_modules/rxjs/_esm5/internal/util/pipe.js 565 bytes [built]
          | ./node_modules/rxjs/_esm5/internal/Observable.js 3.95 KiB [built]
          | ./node_modules/rxjs/_esm5/internal/util/ObjectUnsubscribedError.js 552 bytes [built]
          | ./node_modules/rxjs/_esm5/internal/Subject.js 5.25 KiB [built]
          | ./node_modules/rxjs/_esm5/internal/observable/ConnectableObservable.js 5.38 KiB [built]
          | ./node_modules/rxjs/_esm5/internal/operators/groupBy.js 6.59 KiB [built]
          | ./node_modules/rxjs/_esm5/internal/BehaviorSubject.js 1.46 KiB [built]
          | ./node_modules/rxjs/_esm5/internal/Scheduler.js 602 bytes [built]
          |     + 87 hidden modules
        + 188 hidden modules
    
    WARNING in ./node_modules/better-queue/lib/queue.js
    Module not found: Error: Can't resolve 'better-queue-→' in 'C:\Users\pauco\mybeast\node_modules\better-queue\lib'
     @ ./node_modules/better-queue/lib/queue.js
     @ ./node_modules/apicalypse/dist/index.js
     @ ./src/backend/GameManager/services/GameDiscovererService.ts
     @ ./src/backend/GameManager/GameManager.ts
     @ ./src/backend/backend.ts
    
    ERROR in ./node_modules/node-pre-gyp/lib/node-pre-gyp.js
    Module not found: Error: Can't resolve './→' in 'C:\Users\pauco\mybeast\node_modules\node-pre-gyp\lib'
     @ ./node_modules/node-pre-gyp/lib/node-pre-gyp.js 52:13-32 184:38-57
     @ ./node_modules/sqlite3/lib/sqlite3-binding.js
     @ ./node_modules/sqlite3/lib/sqlite3.js
     @ ./src/backend/Storage.ts
     @ ./src/backend/backend.ts
    Error: Compilation errors in the main process: Hash: dac46d131e24e591c251
    Version: webpack 4.44.0
    Time: 2526ms
    Built at: 2020-07-27 18:35:10
                                                              Asset      Size  Chunks         Chunk Names
                                                           index.js   350 KiB       0         main
                                                       index.js.map  1.28 MiB       0  [dev]  main
    native_modules//lib/binding/napi-v3-win32-x64/node_sqlite3.node  1.36 MiB
     native_modules/lib\binding\napi-v3-win32-x64\node_sqlite3.node  1.36 MiB
    Entrypoint main = index.js index.js.map
      [3] external "path" 42 bytes {0} [built]
      [4] external "fs" 42 bytes {0} [built]
      [8] external "electron" 42 bytes {0} [built]
     [26] ./src/backend/backend.ts 6.12 KiB {0} [built]
     [27] external "child_process" 42 bytes {0} [built]
     [45] ./src/backend/GameManager/services/GameManagerService.ts 7.59 KiB {0} [built]
     [46] ./node_modules/axios/index.js 40 bytes {0} [built]
     [56] ./node_modules/debug/src/index.js 263 bytes {0} [built]
     [87] ./src/backend/GameManager/GameManager.ts 864 bytes {0} [built]
     [88] ./src/backend/GameManager/services/GameDiscovererService.ts 7.68 KiB {0} [built]
    [125] ./src/backend/Storage.ts 5.4 KiB {0} [built]
    [126] ./node_modules/sqlite3/lib/sqlite3.js 6.16 KiB {0} [built]
    [200] ./src/backend/utils.ts 737 bytes {0} [built]
    [201] ./node_modules/electron-squirrel-startup/index.js 1 KiB {0} [built]
    [202] ./node_modules/rxjs/_esm5/index.js + 101 modules 156 KiB {0} [built]
          | ./node_modules/rxjs/_esm5/index.js 3.33 KiB [built]
          | ./node_modules/rxjs/_esm5/internal/config.js 859 bytes [built]
          | ./node_modules/rxjs/_esm5/internal/util/UnsubscriptionError.js 707 bytes [built]
          | ./node_modules/rxjs/_esm5/internal/Subscription.js 4.92 KiB [built]
          | ./node_modules/rxjs/_esm5/internal/Subscriber.js 8.44 KiB [built]
          | ./node_modules/rxjs/_esm5/internal/symbol/observable.js 218 bytes [built]
          | ./node_modules/rxjs/_esm5/internal/util/identity.js 127 bytes [built]
          | ./node_modules/rxjs/_esm5/internal/util/pipe.js 565 bytes [built]
          | ./node_modules/rxjs/_esm5/internal/Observable.js 3.95 KiB [built]
          | ./node_modules/rxjs/_esm5/internal/util/ObjectUnsubscribedError.js 552 bytes [built]
          | ./node_modules/rxjs/_esm5/internal/Subject.js 5.25 KiB [built]
          | ./node_modules/rxjs/_esm5/internal/observable/ConnectableObservable.js 5.38 KiB [built]
          | ./node_modules/rxjs/_esm5/internal/operators/groupBy.js 6.59 KiB [built]
          | ./node_modules/rxjs/_esm5/internal/BehaviorSubject.js 1.46 KiB [built]
          | ./node_modules/rxjs/_esm5/internal/Scheduler.js 602 bytes [built]
          |     + 87 hidden modules
        + 188 hidden modules
    
    WARNING in ./node_modules/better-queue/lib/queue.js
    Module not found: Error: Can't resolve 'better-queue-→' in 'C:\Users\pauco\mybeast\node_modules\better-queue\lib'
     @ ./node_modules/better-queue/lib/queue.js
     @ ./node_modules/apicalypse/dist/index.js
     @ ./src/backend/GameManager/services/GameDiscovererService.ts
     @ ./src/backend/GameManager/GameManager.ts
     @ ./src/backend/backend.ts
    
    ERROR in ./node_modules/node-pre-gyp/lib/node-pre-gyp.js
    Module not found: Error: Can't resolve './→' in 'C:\Users\pauco\mybeast\node_modules\node-pre-gyp\lib'
     @ ./node_modules/node-pre-gyp/lib/node-pre-gyp.js 52:13-32 184:38-57
     @ ./node_modules/sqlite3/lib/sqlite3-binding.js
     @ ./node_modules/sqlite3/lib/sqlite3.js
     @ ./src/backend/Storage.ts
     @ ./src/backend/backend.ts
        at cb (C:\Users\pauco\mybeast\node_modules\@electron-forge\plugin-webpack\src\WebpackPlugin.ts:250:31)
        at finalCallback (C:\Users\pauco\mybeast\node_modules\webpack\lib\Compiler.js:257:39)
        at C:\Users\pauco\mybeast\node_modules\webpack\lib\Compiler.js:273:13
        at AsyncSeriesHook.eval [as callAsync] (eval at create (C:\Users\pauco\mybeast\node_modules\tapable\lib\HookCodeFactory.js:33:10), <anonymous>:4:1)
        at AsyncSeriesHook.lazyCompileHook (C:\Users\pauco\mybeast\node_modules\tapable\lib\Hook.js:154:20)
        at onCompiled (C:\Users\pauco\mybeast\node_modules\webpack\lib\Compiler.js:271:21)
        at C:\Users\pauco\mybeast\node_modules\webpack\lib\Compiler.js:681:15
        at AsyncSeriesHook.eval [as callAsync] (eval at create (C:\Users\pauco\mybeast\node_modules\tapable\lib\HookCodeFactory.js:33:10), <anonymous>:4:1)
        at AsyncSeriesHook.lazyCompileHook (C:\Users\pauco\mybeast\node_modules\tapable\lib\Hook.js:154:20)
        at C:\Users\pauco\mybeast\node_modules\webpack\lib\Compiler.js:678:31
        at AsyncSeriesHook.eval [as callAsync] (eval at create (C:\Users\pauco\mybeast\node_modules\tapable\lib\HookCodeFactory.js:33:10), <anonymous>:4:1)
        at AsyncSeriesHook.lazyCompileHook (C:\Users\pauco\mybeast\node_modules\tapable\lib\Hook.js:154:20)
        at C:\Users\pauco\mybeast\node_modules\webpack\lib\Compilation.js:1423:35
        at AsyncSeriesHook.eval [as callAsync] (eval at create (C:\Users\pauco\mybeast\node_modules\tapable\lib\HookCodeFactory.js:33:10), <anonymous>:4:1)
        at AsyncSeriesHook.lazyCompileHook (C:\Users\pauco\mybeast\node_modules\tapable\lib\Hook.js:154:20)
        at C:\Users\pauco\mybeast\node_modules\webpack\lib\Compilation.js:1414:32
    
    包.json
    {
      "name": "mybeast",
      "productName": "mybeast",
      "version": "1.0.0",
      "description": "",
      "main": ".webpack/main",
      "scripts": {
        "start": "electron-forge start",
        "package": "electron-forge package",
        "make": "electron-forge make",
        "publish": "electron-forge publish",
        "lint": "eslint --ext .ts ."
      },
      "author": "",
      "license": "ISC",
      "config": {
        "forge": {
          "packagerConfig": {},
          "makers": [
            {
              "name": "@electron-forge/maker-squirrel",
              "config": {
                "name": "mybeast"
              }
            }
          ],
          "plugins": [
            [
              "@electron-forge/plugin-webpack",
              {
                "mainConfig": "./webpack.backend.config.js",
                "renderer": {
                  "config": "./webpack.renderer.config.js",
                  "entryPoints": [
                    {
                      "html": "./src/frontend/index.html",
                      "js": "./src/frontend/frontend.ts",
                      "name": "frontend"
                    },
                    {
                      "html": "./src/player/index.html",
                      "js": "./src/player/Player.ts",
                      "name": "player"
                    }
                  ]
                }
              }
            ]
          ]
        }
      },
      "devDependencies": {
        "@types/request": "^2.48.5",
        "@types/sqlite3": "^3.1.6",
        "@electron-forge/cli": "^6.0.0-beta.52",
        "@electron-forge/maker-deb": "^6.0.0-beta.52",
        "@electron-forge/maker-rpm": "^6.0.0-beta.52",
        "@electron-forge/maker-squirrel": "^6.0.0-beta.52",
        "@electron-forge/maker-zip": "^6.0.0-beta.52",
        "@electron-forge/plugin-webpack": "^6.0.0-beta.52",
        "@marshallofsound/webpack-asset-relocator-loader": "^0.5.0",
        "@typescript-eslint/eslint-plugin": "^2.34.0",
        "@typescript-eslint/parser": "^2.34.0",
        "css-loader": "^3.6.0",
        "electron": "9.1.1",
        "electron-rebuild": "^1.11.0",
        "eslint": "^6.8.0",
        "eslint-plugin-import": "^2.22.0",
        "fork-ts-checker-webpack-plugin": "^3.1.1",
        "html-loader": "^1.1.0",
        "node-loader": "^0.6.0",
        "style-loader": "^0.23.1",
        "ts-loader": "^6.2.2",
        "typescript": "^3.9.7",
        "sass": "^1.26.10",
        "sass-loader": "^9.0.2",
        "source-map-support": "^0.5.19"
      },
      "dependencies": {
        "electron-squirrel-startup": "^1.0.0",
        "apicalypse": "^0.1.6",
        "axios": "^0.19.2",
        "sqlite3": "^5.0.0",
        "ws": "^7.3.1"
      }
    }
    
    webpack.backend.config.js
    module.exports = {
        entry: './src/backend/backend.ts',
        resolve: {
            extensions: ['.js', '.ts', '.jsx', '.tsx', '.css', '.json', '.scss']
        },
        module: {
            rules: [
                {
                    test: /\.node$/,
                    use: 'node-loader',
                },
                {
                    test: /\.(m?js|node)$/,
                    parser: {amd: false},
                    use: {
                        loader: '@marshallofsound/webpack-asset-relocator-loader',
                        options: {
                            outputAssetBase: 'native_modules',
                        },
                    },
                },
                {
                    test: /\.tsx?$/,
                    exclude: /(node_modules|\.webpack)/,
                    use: {
                        loader: 'ts-loader',
                        options: {
                            transpileOnly: true
                        }
                    }
                },
            ]
        }
    }
    
    webpack.renderer.config.js
    const VueLoaderPlugin = require('vue-loader/lib/plugin')
    
    module.exports = {
        resolve: {
            alias: {
                'vue$': 'vue/dist/vue.esm.js'
            },
            mainFields: ['main', 'browser'],
            extensions: ['.js', '.ts', '.jsx', '.tsx', '.css', '.json']
        },
        module: {
            rules: [
                {
                    test: /\.vue$/,
                    loader: 'vue-loader'
                },
                {
                    test: /\.s[ac]ss$/,
                    use: [
                        'style-loader',
                        'css-loader',
                        'sass-loader'
                    ]
                },
                {
                    test: /\.html$/,
                    loader: 'html-loader',
                    options: {
                        minimize: true
                    }
                },
                {
                    test: /\.node$/,
                    use: 'node-loader',
                },
                {
                    test: /\.(m?js|node)$/,
                    parser: {amd: false},
                    use: {
                        loader: '@marshallofsound/webpack-asset-relocator-loader',
                        options: {
                            outputAssetBase: 'native_modules',
                        },
                    },
                },
                {
                    test: /\.tsx?$/,
                    include: /src/,
                    use: 'ts-loader',
                },
            ]
        },
        plugins: [
            new VueLoaderPlugin(),
        ],
    }
    

    最佳答案

    您可以使用插件解压缩要解析的 native 模块
    你可以在这里关注:
    https://www.electronforge.io/config/plugins/auto-unpack-natives

    This plugin will automatically add all native modules in your node_modules folder to the asar.unpack config option in your packagerConfig. If you have any native modules as all you should probably use this to reduce loading times and disk consumption on your users' machines.


    Usage:

    You must add this plugin to your plugins array in your forge config The complete config options are available at AutoUnpackNativesConfig.

    关于javascript - 使用 Electron 伪造打包应用程序时出现问题 "Can' t 解决 './→' “,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63119757/

    相关文章:

    javascript - 使用 jqplot 条形图上不需要的线

    javascript - 使用 Handlebars 模板编译 JSON 内容的函数无法正常工作(语法错误?)

    json - 使用 NodeJS 将 XML 转换为 JSON

    Webpack - 需要基于构建配置的文件

    javascript - window.open 在 Firefox 中不工作

    javascript - 如何覆盖 CSS 配色方案设置

    javascript - 所有 $watch 执行后的 AngularJS Controller 事件

    node.js - npm install 没有引入 devDependencies

    angular - 你如何在 Angular2 CLI 项目中设置 Stylus?

    ruby-on-rails - 我应该关注 yarn 警告吗