Express Electron 不能需要本地 Js 文件

Posted

技术标签:

【中文标题】Express Electron 不能需要本地 Js 文件【英文标题】:Express Electron Cannot Require Local Js Files 【发布时间】:2021-10-17 08:11:39 【问题描述】:

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

我在使用 express 和 electron 时遇到了一些问题。当我运行npm start 时一切正常(package.json 中的start 脚本是electron .)。使用electron-builder 构建电子后出现问题。它为 windows x-64 构建项目并在 dist 文件夹中创建 .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("./whatever") 这样的相对路径的 require 并没有什么不同。

【问题讨论】:

【参考方案1】:

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 的默认路径是您应用的根目录。

【讨论】:

以上是关于Express Electron 不能需要本地 Js 文件的主要内容,如果未能解决你的问题,请参考以下文章

electron使用electron-forge打包后报错cannot find module ‘XXX’

捆绑 Quasar/Express/Electron 应用程序进行生产 - Express-server 无法启动

用 Electron 打开一个 Express 应用程序(Nodejs)

自动重新加载对 React 所做的更改,使用 Electron 的 Express Webpack

在 Electron 中单击时 ReactJs 无法调用 express API

如何在电子应用程序中打包快递服务器?