跳至主要内容

从 BrowserView 迁移到 WebContentsView

·阅读时长 3 分钟

BrowserViewElectron 30 起已被弃用,由 WebContentsView 取代。幸运的是,迁移过程相当顺利。


Electron 正从 BrowserView 迁移到 WebContentsView,以便与 Chromium 的 UI 框架 Views API 对齐。WebContentsView 提供了一个直接与 Chromium 渲染管道关联的可重用视图,简化了未来的升级,并为开发者在 Electron 应用程序中集成非 Web UI 元素提供了可能性。通过采用 WebContentsView,应用程序不仅为即将到来的更新做好了准备,而且从长远来看,还可以减少代码复杂性并减少潜在 bug。

熟悉 BrowserWindow 和 BrowserView 的开发者应注意,BrowserWindowWebContentsView 分别是继承自 BaseWindowView 基类的子类。要完全理解可用的实例变量和方法,请务必查阅这些基类的文档。

迁移步骤

1. 升级 Electron 到 30.0.0 或更高版本

警告

Electron 版本可能包含影响您应用程序的重大更改。最好首先测试并在您的应用程序上落地 Electron 升级,然后再进行本次迁移的其余步骤。每个 Electron 主要版本的重大更改列表可以在此处找到,也可以在 Electron 博客上每个主要版本的发布说明中找到。

2. 熟悉您的应用程序在哪里使用了 BrowserViews

一种方法是搜索您的代码库查找 new BrowserView(。这应该能让您了解您的应用程序是如何使用 BrowserViews 的,以及有多少调用点需要迁移。

提示

在大多数情况下,您的应用程序实例化新 BrowserViews 的每个实例都可以与其他实例隔离迁移。

3. 迁移 BrowserView 的每处使用

  1. 迁移实例化。这应该相当简单,因为 WebContentsViewBrowserView 的构造函数基本形状相同。两者都通过 webPreferences 参数接受 WebPreferences 。

    - this.tabBar = new BrowserView({
    + this.tabBar = new WebContentsView({
    信息

    默认情况下,WebContentsView 实例化时背景为白色,而 BrowserView 实例化时背景为透明。要在 WebContentsView 中获得透明背景,请将其背景颜色设置为 RGBA 十六进制值,并将 Alpha (不透明度) 通道设置为 00

    + this.webContentsView.setBackgroundColor("#00000000");
  2. 迁移将 BrowserView 添加到其父窗口的位置。

    - this.browserWindow.addBrowserView(this.tabBar)
    + this.browserWindow.contentView.addChildView(this.tabBar);
  3. 迁移父窗口上的 BrowserView 实例方法调用。

    旧方法新方法注意
    win.setBrowserViewwin.contentView.removeChildView + win.contentView.addChildView
    win.getBrowserViewwin.contentView.children
    win.removeBrowserViewwin.contentView.removeChildView
    win.setTopBrowserViewwin.contentView.addChildView在现有视图上调用 addChildView 会将其重新排序到顶部。
    win.getBrowserViewswin.contentView.children
  4. setAutoResize 实例方法迁移到 resize 监听器。

    - this.browserView.setAutoResize({
    - vertical: true,
    - })

    + this.browserWindow.on('resize', () => {
    + if (!this.browserWindow || !this.webContentsView) {
    + return;
    + }
    + const bounds = this.browserWindow.getBounds();
    + this.webContentsView.setBounds({
    + x: 0,
    + y: 0,
    + width: bounds.width,
    + height: bounds.height,
    + });
    + });
    提示

    所有现有的 browserView.webContents 使用以及实例方法 browserView.setBounds, browserView.getBoundsbrowserView.setBackgroundColor 无需迁移,并且应该可以直接在 WebContentsView 实例上使用!

4. 测试并提交您的更改

遇到问题?请查看 Electron 问题跟踪器上的 WebContentsView 标签,看看您遇到的问题是否已被报告。如果您在那里没有看到您的问题,请随时添加新的错误报告。包含测试用例 gists 将有助于我们更好地分类您的问题!

恭喜,您已迁移到 WebContentsViews!🎉