news 2026/9/10 12:46:25

Electron 如何用 ImageView 显示启动画面并在内容加载完成后切换为 WebContentsView?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Electron 如何用 ImageView 显示启动画面并在内容加载完成后切换为 WebContentsView?

Electron 如何用 ImageView 显示启动画面并在内容加载完成后切换为 WebContentsView?

【免费下载链接】electron:electron: Build cross-platform desktop apps with JavaScript, HTML, and CSS项目地址: https://gitcode.com/GitHub_Trending/el/electron

使用 Electron 的BaseWindow组合多个视图时,页面 URL 加载期间窗口内会有一段空白时间。官方文档推荐的方案是:先用ImageView显示一张启动画面(splash screen)作为窗口内容视图,等WebContentsView内的页面加载完成后再把内容视图切换过去。

const { BaseWindow, ImageView, nativeImage, WebContentsView } = require('electron') const path = require('node:path') const win = new BaseWindow({ width: 800, height: 600 }) // Create a "splash screen" image to display while the WebContentsView loads const splashView = new ImageView() const splashImage = nativeImage.createFromPath(path.join(__dirname, 'loading.png')) splashView.setImage(splashImage) win.setContentView(splashView) const webContentsView = new WebContentsView() webContentsView.webContents.once('did-finish-load', () => { // Now that the WebContentsView has loaded, swap out the "splash screen" ImageView win.setContentView(webContentsView) }) webContentsView.webContents.loadURL('https://electronjs.org')

上面这段代码即出自 ImageView 文档 开头的示例,ImageView的用途说明原文就是:"Useful for showing splash screens that will be swapped forWebContentsViews when the content finishes loading."。下面逐段说明其中的关键 API 与适用条件。

前提条件

以下约束来自文档,写代码前需要确认:

  • BaseWindowImageViewWebContentsView都运行在主进程(Process: Main),并且都要求app模块的ready事件触发后才能使用。所以这些 API 的调用代码应放在app.whenReady()之后执行。
  • ImageView是实验性 API(文档中标注_Experimental_),未来可能变更或移除。
  • Electron 内置类不能在用户代码中被子类化,包括ImageViewWebContentsView(参见 FAQ 说明)。
  • ImageView.setImage()只接受NativeImage参数,且只能使用NativeImage支持的图片格式。
  • nativeImage.createFromPath(path)从图片文件(如 PNG 或 JPEG)创建NativeImage;如果路径不存在、无法读取或不是合法图片,返回的是一个空图像,不会抛错——也就是说加载了错误路径时启动画面会是空白,排查时要先确认图片路径有效。

步骤拆解

  1. 创建窗口new BaseWindow({ width: 800, height: 600 })BaseWindow是用于组合多个视图的窗口;如果窗口只需要一个全屏 web view,文档建议直接用更简单的BrowserWindow,启动画面场景才需要BaseWindow
  2. 创建并设置启动画面
    • new ImageView()创建图片视图;
    • nativeImage.createFromPath(path.join(__dirname, 'loading.png'))把本地图片文件读成NativeImageloading.png需要替换为你自己项目里的启动图片路径;
    • splashView.setImage(splashImage)设置图片;
    • win.setContentView(splashView)把它设为窗口内容视图。win.setContentView(view)的定义见 BaseWindow 文档:"Sets the content view of the window",参数是任意View
  3. 创建 WebContentsView 并监听加载完成new WebContentsView()之后通过只读属性view.webContents拿到内部WebContents引用,用它来加载 URL(用法见 WebContentsView 文档)。
  4. 切换内容视图:在did-finish-load事件回调里再次调用win.setContentView(webContentsView),把窗口内容从ImageView换成WebContentsView。注意示例中用的是once,即只监听一次加载完成事件。

如何判断切换时机到了

切换的触发点是WebContentsdid-finish-load事件。WebContents 文档 对它的定义是:

Emitted when the navigation is done, i.e. the spinner of the tab has stopped spinning, and theonloadevent was dispatched.

即导航完成(浏览器标签页加载指示器停止转动、页面onload已派发)时触发,这就是启动画面应该撤掉的时点。另外webContents.loadURL()在文档中也有对应的成功判定:它返回的 Promise 在导航完成时 resolve(见did-finish-load),加载失败时 reject 并触发did-fail-load。示例代码选择的是事件监听而非 Promise,两种方式都基于"导航完成"这一条件。

运行效果上可以这样核对:loadURL指向一个慢加载的页面时,窗口先显示启动图;等did-finish-load触发后,窗口内容变为加载好的页面。反过来,如果启动画面始终不切换,优先检查图片路径(图片加载失败只产生空图像而非报错)以及did-finish-load是否真的触发(可对照did-fail-load判断是否加载失败)。

限制与补充

  • ImageView的实验性属性意味着这个模式在后续版本中可能调整,接入生产功能前建议留意 API 变更记录。
  • 资源管理方面,BaseWindow关闭时并不会自动销毁其WebContentsViewwebContents,需要在使用者关闭窗口时自行关闭这些webContents,相关说明见 BaseWindow 文档的 Resource management 一节。
  • WebContentsView构造时可以传webContents选项,让视图接管一个已存在的WebContents,但同一个WebContents同一时间只能被一个WebContentsView展示;本场景用默认构造即可。

【免费下载链接】electron:electron: Build cross-platform desktop apps with JavaScript, HTML, and CSS项目地址: https://gitcode.com/GitHub_Trending/el/electron

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/10 12:44:46

基于STM32F4的DMX512控制器实现:串口时序与RS-485信号解析

简介:这是一套基于STM32的DMX512灯光控制协议实现工程,面向嵌入式开发者和舞台设备爱好者,解决了如何在STM32上通过GPIO或串口模拟DMX512通信、完成512通道数据收发的核心问题。压缩包共102个文件,以45个.c源文件和45个.h头文件为…

作者头像 李华
网站建设 2026/9/10 12:41:36

ESP32无线音频实战:5步搭稳I2S播放链路

ESP32无线音频实战:5步搭稳I2S播放链路 【免费下载链接】arduino-esp32 Arduino core for the ESP32 family of SoCs 项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32 你正在调试一台ESP32无线音频播放设备:前2分钟一切正常&…

作者头像 李华
网站建设 2026/9/10 12:40:37

SQLite不是迷你MySQL,而是文件格式的升级版:选型与实战指南

1. 重新认识SQLite:它不是迷你版MySQL,而是文件的升级版这几年帮朋友做技术选型,被问得最多的一句话是:“我的项目规模不大,用SQLite还是用MySQL?”我一开始还会按照数据量、并发数、功能需求一条条去比&am…

作者头像 李华
网站建设 2026/9/10 12:39:35

Reactive-Resume 开源简历生成器:本地部署与模板导出实测

Reactive-Resume 开源简历生成器:本地部署与模板导出实测 【免费下载链接】reactive-resume A one-of-a-kind resume builder that keeps your privacy in mind. Completely secure, customizable, portable, open-source and free forever. Try it out today! 项…

作者头像 李华