首页 > 解决方案 > Express Electron 不能需要本地 Js 文件

问题描述

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

我在使用 express 和电子时遇到了一些问题。我运行时一切正常npm start(在is中启动脚本)。在使用. 它为 windows x-64 构建项目并在 dist 文件夹中创建文件。在我想运行可执行应用程序之前,一切看起来都很好。出现这个对话框:package.jsonelectron .electron-builder.exe

电子错误对话框

我做了很多搜索,但我无法找出问题所在。实际问题是,电子在构建后无法以某种方式需要本地 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 ,require("./whatever") 但没​​有什么不同。

标签: javascriptnode.jsexpresselectronelectron-builder

解决方案


Electron 可能没有随安装包一起提供你的文件。尝试将extraFiles字段添加到您的package.json

因此,在您的package.json和您的build字段内,添加以下内容:

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将默认路径作为应用程序的根目录。


推荐阅读