处理缓慢的 Electron 启动

aoc*_*via 12 javascript performance desktop-application node.js electron

语境

我花了几个小时玩 Electron,我观察到在屏幕上绘制一个简单的 html 文件总是需要超过 2.5 秒。时间线大致如下:

  • 60 ms:appready事件被触发;我们创建一个窗口使用new BrowserWindow()
  • 170 ms:屏幕上出现一个空白窗口
  • 2800 ms:窗口显示指定的 HTML

我已经使用我的代码建立了一个存储库,该代码源自 Electron 的快速入门文档。

关于我的机器,我在 2016 年的 ThinkPad T460 上运行 Windows 10,带有 SSD 和足够的内存。

问题

发送一个在启动时显示空白窗口的应用程序对我来说是行不通的。我假设大多数开发 Electron 应用程序的人都有类似的想法。因此我的第一个问题是:我做错了什么吗?或者这是一个简单的 Electron 应用程序的预期加载时间?

假设这是正常行为,处理此问题的常用方法是什么?想到了一些想法:

  1. 要求 Electron 显示启动画面:除非有特定的内置功能,否则这似乎是不行的,因为启动画面本身只会在 2.5 秒后显示。
  2. 隐藏应用程序的窗口,直到它被渲染(使用ready-to-show事件),所以不会显示空白窗口。这并不理想,因为这意味着用户不会得到任何关于应用程序实际加载的反馈。
  3. 创建一个包装应用程序(使用本机代码),显示启动画面,启动电子并在显示电子窗口后隐藏自身。有点违背了使用 Electron 的初衷,因为您最终会编写本机代码并意外增加复杂性。
  4. 按照docs 的建议,将窗口的背景颜色设置为类似于您的应用程序的颜色。这看起来不太好。

鉴于这一定是一个普遍的问题,我希望社区已经找到了标准的解决方案。如果有人能指出我正确的方向,我会很高兴。

aoc*_*via 12

简短回答

Windows Defender 导致速度变慢,因此这不是 Electron 问题。

长答案

事实证明,Windows Defender 实时保护会导致启动时间比所需时间长得多。关闭实时保护后,我们获得了可接受的性能:

  • 55 毫秒:应用程序就绪
  • 150 毫秒:显示空白窗口
  • 500 毫秒:HTML 加载并显示

这意味着我建议的解决方案的选项 1(显示启动屏幕)应该非常适合加载缓慢的应用程序。

剩下的唯一事情就是弄清楚如何解决 Windows Defender 问题。为此,我提出了一个新问题