带有 browserWindow 和 preload.js 的电子生成器。无法加载预加载脚本

     2023-03-22     175

关键词:

【中文标题】带有 browserWindow 和 preload.js 的电子生成器。无法加载预加载脚本【英文标题】:electron-builder with browserWindow and preload.js. Unable to load preload script 【发布时间】:2020-07-03 23:13:21 【问题描述】:

我的 main.js 中的 electron-builder 和 browserWindows 预加载选项有问题:

// Create the browser window.
  mainWindow = new BrowserWindow(
    x: mainWindowState.x,
    y: mainWindowState.y,
    width: mainWindowState.width,
    height: mainWindowState.height,
    minHeight: 500,
    minWidth: 1000,
    icon: path.join(__dirname, 'icon.ico'),
    frame: false,
    webPreferences: 
      preload: path.resolve(__dirname, 'preload.js'), // <--- PROBLEM
      nativeWindowOpen: true,
      spellcheck: true,
      nodeIntegration: false
    
  );

启动打包的应用程序后,我收到以下错误:

无法加载预加载脚本:C:\Users[...]\resources\app.asar\preload.js

preload.js 与 main.js 位于同一目录中。

有解决这个问题的想法吗?

诚挚的问候, 凯W.

【问题讨论】:

请告诉我你的项目结构。而你electron-builderconfiguration 对于任何来到这里并遇到 unpackaged 应用程序问题的人,然后我发现问题是 preload.js 内部出现错误,出现下Unable to load preload script 【参考方案1】:
webPreferences: 
                    frame: false,
                    nodeIntegration: true,
                    enableRemoteModule: true, //this must be true
                    preload: path.resolve(root, 'bridge', 'initialize.js'), 
                

无法加载预加载脚本,但实际上 initialize.js 有问题。在我的文件中,有一个错误,remote.getGlobal 未定义,因为这个 webPreferences.enableRemoteModule 在 10.x 版本的默认值是 false,所以你必须将它设置为 true。那么它会很好用。

【讨论】:

为什么要在启用 nodeIntegration 和 remoteModule 的情况下预加载?通常,当您预加载时,它们会被禁用——这就是预加载的重点。 我的预加载脚本本身也有一个错误。【参考方案2】:
"extraResources": [
  "src/main/preload.js",
  "src/electron-actions/*,"
]

在我的情况下成功了!

【讨论】:

不幸的是,您不能在“文件”和“extraResources”中都包含通用的index.js 文件(添加到第二组,将其从第一组中删除)。因此,这对我来说不起作用,因为我的预加载文件与我的主要 index.js 文件相同。 (它动态检查是作为主索引文件运行还是作为预加载运行) 这对我不起作用。即使脚本现在存在于该目录中,我仍然收到错误 Unable to load preload script: "C:\Users\...\resources\preload.js"【参考方案3】:

今天我从 electron 9.x 迁移到 13.1.9。这些解决方案对我没有帮助。我的愿望:

    预加载文件路径:./src/public/preload.js background.js
  win = new BrowserWindow(
    width: 800,
    height: 600,
    minHeight: 300,
    minWidth: 500,
    webPreferences: 
      preload: path.join(__static, 'preload.js'), // <- static
    ,
  );

它是如何工作的?

./src/public 中的所有文件都只是复制到构建文件夹中。但是在electron:serveelectron:build 之后 - 构建文件夹具有不同的结构。而你(或者只是我的情况)不能使用__dirname。所以需要使用__static

附:关于__static:https://webpack.electron.build/using-static-assets

附: electron的另一个例子__static

protocol.registerSchemesAsPrivileged([
  scheme: 'app',
  privileges: 
    secure: true,
    standard: true,
    icon: path.join(__static, 'icon.png'), // <- this
  ,
]);

他们帮我找到了解决方案(使用公用文件夹):https://mmazzarolo.medium.com/building-a-desktop-application-using-electron-and-create-react-app-2b6d127f4fd7

【讨论】:

【参考方案4】:

files 配置中添加preload.js 文件,如下所示:

 "build": 
    "files": [
      "./src/preload.js"
    ]

【讨论】:

【参考方案5】:

抱歉回复晚了。 对我来说,有效的是:

preload.js 位置

static
  |- preload.js

main/index.js

win = new BrowserWindow(
  width: 800,
  height: 600,
  minHeight: 300,
  minWidth: 500,
  webPreferences: 
    preload: path.resolve(getElectronApp().getAppPath(), 'preload.js'),
  ,
);

还有 package.json (electron-webpack)

"electronWebpack": 
  "main": 
    "extraEntries": [
      "./static/preload.js"
    ],
  ,

【讨论】:

【参考方案6】:
  webPreferences: 
    webSecurity: false,
    enableRemoteModule: true,
    nodeIntegration: true,
    contextIsolation: false,  // <== important
    preload: path.join(__dirname, 'src/preload.js')
  

https://github.com/electron/electron/pull/15738

【讨论】:

查看链接,contextIsolation 字段的官方默认值已更改,如果该字段为 true,则将禁用不安全代码插入

从 BrowserWindow 电子类扩展时出错

】从BrowserWindow电子类扩展时出错【英文标题】:ErrorwhenextendingfromBrowserWindowelectronclass【发布时间】:2018-10-1208:12:17【问题描述】:我使用https://github.com/SimulatedGREG/electron-vue模板创建了vue电子模板。在主进程index.js旁边,我创建了... 查看详情

browserwindow

Window对象Window对象表示浏览器中打开的窗口。如果文档包含框架(iframe或iframe标签),浏览器会被html文档创建一个window对象,并为每个框架创建一个额外的window对象。注释:没有应用于window对象的公开标准,不过所有浏览器度... 查看详情

Electronjs - BrowserWindow 不是渲染器进程中的构造函数错误

】Electronjs-BrowserWindow不是渲染器进程中的构造函数错误【英文标题】:Electronjs-BrowserWindowisnotaconstructorerrorinsiderendererprocess【发布时间】:2021-11-2801:45:08【问题描述】:节点版本:14.18.0操作系统:Mac这是我的package.json文件"name":"cr... 查看详情

在 Electron 中单击按钮重新打开 BrowserWindow 后,对象已被销毁异常

】在Electron中单击按钮重新打开BrowserWindow后,对象已被销毁异常【英文标题】:ObjecthasbeendestroyedExceptionafterreopenBrowserWindowonbuttonclickinElectron【发布时间】:2018-05-2803:24:03【问题描述】:我是Electron框架的新手,使用Electron开发简... 查看详情

未捕获的 ReferenceError:Electron BrowserWindow 中未定义要求

】未捕获的ReferenceError:ElectronBrowserWindow中未定义要求【英文标题】:UncaughtReferenceError:requireisnotdefinedinElectronBrowserWindow【发布时间】:2021-08-1605:01:51【问题描述】:我是electronjs的新手,我正在尝试使用devtron。当我在电子浏览器... 查看详情

在 Atom Electron 中以 60fps 将 <canvas> 图像从 BrowserWindow 复制到另一个

】在AtomElectron中以60fps将<canvas>图像从BrowserWindow复制到另一个【英文标题】:Copy<canvas>imagefromaBrowserWindowtoanotherat60fpsinAtomElectron【发布时间】:2017-02-1405:30:50【问题描述】:是否可以将BrowserWindow中以60fps渲染的元素图像... 查看详情

电子 - 处理输入

...处理用户输入?我有一个main.js和一个指向本地html文件的BrowserWindow(包含一些带有输入字段的用户设置)。当HTML表单提交(到同一个文件或另一个文件)时,我如何访问这些数据?ma 查看详情

设置 browserWindow 始终在顶部,即使其他应用程序/游戏全屏 [Electron,Windows 操作系统]

】设置browserWindow始终在顶部,即使其他应用程序/游戏全屏[Electron,Windows操作系统]【英文标题】:SetbrowserWindowAlwaysontop,EvenifOtherApps/Gamesareinfullscreen[Electron,WindowsOS]【发布时间】:2021-12-3103:44:44【问题描述】:我如何让我的电子... 查看详情

electron开发记录:electron中组件的一些用法

...electron应用的基本框架和结构。现在来讲讲其中一些组件(BrowserWindow,Menu等)的一些用法。这些方法我是从electron-api-demo以及electron官网上的文档中看来的,自己整理了下,挑了点我觉得有用和项目中用到的用法说一下... 查看详情

electron主进程和渲染进程

...染进程是独立的,它只关心它所运行的页面。主进程使用BrowserWindow实例创建网页。每个BrowserWindow实例都在自己的渲染进程中运行。当一个BrowserWindow实例被销毁后,相应的渲染进程也会被终止。主进程管理所有页面和与之对应的... 查看详情

浏览器透明设置例子,qt5.6才支持

用simpleBrowser例子的基础上,在BrowserWindow构造函数修改如下BrowserWindow::BrowserWindow(QWidget*parent,Qt::WindowFlagsflags):QMainWindow(parent,flags),m_tabWidget(newTabWidget(this)),m_progressBar(newQProgressBar(thi 查看详情

electron开发记录:electron中组件的一些用法

...electron应用的基本框架和结构。现在来讲讲其中一些组件(BrowserWindow,Menu等)的一些用法。这些方法我是从electron-api-demo以及electron官网上的文档中看来的,自己整理了下,挑了点我觉得有用和项目中用到的用法说一下... 查看详情

electron的cookies无法存取,带测试对比图

现象背景Electron中BrowserWindow提供比较简易的浏览器界面,但是没有直接提供cookies持久化和恢复的操作,以至于在关闭窗口后,无法恢复cookies。需求实现cookies在BrowserWindow中持久化,以及重启恢复现场关联https://www.jianshu.com/p/d30094... 查看详情

electron应用结构

...底层交互。EN主进程和渲染进程之间的区别主进程使用 BrowserWindow 实例创建页面。每个 BrowserWindow 实例都在自己的渲染进程里运行页面。当一个 BrowserWindow 实例被销毁后,相应的渲染进程也会被终止。主进程管理所有的we... 查看详情

nodejs前端接口调试(代码片段)

...变量(如fetch等),因此需要装一些polyfill。启动nodejs前preloa 查看详情

electron中的cookies持久化保存到硬盘及恢复现场

...术A非经过允许请勿随意转发,尊重版权,感谢。Electron中BrowserWindow提供比较简易的浏览器界面,但是没有直接提供cookies持久化和恢复的操作,以至于在关闭窗口后,无法恢复cookies。实现cookies在BrowserWindow中持久化,以及重启恢... 查看详情

电子构建“不允许加载本地资源”但文件存在

...:我有一个普通的Electron应用程序,带有一个加载文件的BrowserWindow:win=newBrowserWindow(...);win.loadURL(url.format( 查看详情

解决electron使用透明窗口无效

...。而这里又设置了backgroundColor为一个透明的颜色,是因为BrowserWindow默认的背景颜色是白色,设置透明之后,才能够真正地看到透明的效果。有的文章提到,开发模式开启devtool也有可能导致背景白色,这里主动设置BrowserWindow的颜... 查看详情