Express Electron 不能要求本地 Js 文件

Express Electron Cannot Require Local Js Files

在标记为重复之前,我已经搜索了很多,但找不到我需要的答案。

我在使用 express 和 electron 时遇到一些问题。当我 运行 npm startpackage.json 中的 start 脚本是 electron . 时,一切正常。使用 electron-builder 构建电子后出现问题。它为 windows x-64 构建项目并在 dist 文件夹中生成 .exe 文件。一切看起来都很好,直到我想要 运行 可执行应用程序。出现这个对话框:

我做了很多搜索,但找不到问题所在。实际问题是 electron 在构建后无法以某种方式需要本地 js 文件。我在构建过程中尝试了 asar true 和 false。

这是我的项目树:

 app
 ├── node_modules
 │   └── ...
 ├── Controllers
 │   ├── baseController.js
 │   └── homeController.js
 ├── Database
 │   ├── journals.json
 │   └── users.json
 ├── Models
 │   ├── Journal.js
 │   ├── User.js
 │   └── index.js
 ├── Repository
 │   ├── motor
 │   |   ├── generator.js
 │   |   └── index.js
 │   ├── core
 │   |   └── index.js
 │   ├── init.js
 │   └── index.js
 ├── Views
 │   └── index.html
 ├── www
 │   └── assets
 │       └── images
 │           └── ...
 ├── app.js
 ├── package.json
 ├── package-lock.json
 ├── startup.js
 └── server.js

这是我的 app.js:

const path = require('path');
const server = require(path.join(__dirname, 'server'));
const port = 7970;
const electron = require('electron');
const url = require('url');
const { app, BrowserWindow, Menu } = electron;
let index;

// App Ready
app.allowRendererProcessReuse = false;
app.on('ready', function () {
    index = new BrowserWindow({
        webPreferences: {
            nodeIntegration: true,
            nodeIntegrationInWorker: true,
            nodeIntegrationInSubFrames: true,
            contextIsolation: false,
            enableRemoteModule: true
        },
        frame: true,
        minimizable: false,
        maximizable: false,
        fullscreen: false,
        resizable: false,
        movable: true
    });
    index.loadURL(url.format({
        pathname: path.join("localhost:" + port),
        protocol: 'http:',
        slashes: true
    }));
    Menu.setApplicationMenu(null);
});

这里是 startup.js 错误实际上在堆栈跟踪中开始的地方:

const path = require('path');
var express = require('express');
var router = express.Router();
var controllers = require(path.join(__dirname, '/Controllers/baseController'));

router.get('/', controllers.home.index)

module.exports = router;

我已经尝试过像 require("./whatever") 这样的相对路径要求 并没有什么不同。

Electron 可能没有将您的文件与安装包一起发送。尝试将 extraFiles 字段添加到您的 package.json

因此,在您的 package.jsonbuild 字段中,添加:

build:{
    "appId":"your.product.id",
     ...
    "extraFiles":[
        {
            "from":"Controllers",
            "to":"resources/app/Controllers",
            "filter":["**/*"]
        },
        {
            "from":"Database",
            "to":"resources/app/Database",
            "filter":["**/*"]
        },
        {
            "from":"Models",
            "to":"resources/app/Models",
            "filter":["**/*"]
        },
        {
            "from":"Repository",
            "to":"resources/app/Repository",
            "filter":["**/*"]
        },
        {
            "from":"Views",
            "to":"resources/app/Views",
            "filter":["**/*"]
        },
        {/** You can add more if you need*/}
    ]
}

Electron 默认情况下在构建时忽略所有 devDependencies 和“新”文件。 extraFiles 字段可防止 electron-builder 忽略应用程序执行所必需的文件。它实际上将位于 from 字段中的文件传送到 to 字段中的路径。 filter 用于在必要时使用扩展名或内部目录保留一些文件。

extraFiles 将默认路径作为应用程序的根目录。