Zebkit 使开发者能够将 Chromium 的 Blink、V8、PDFium 和 FFmpeg 组件作为共享库集成,而不是作为完整的运行时环境。这种方法允许宿主应用程序保留自己的原生事件循环、窗口和工具包,同时将 Web 视图作为其自身 UI 的子项或作为离屏帧添加。

Zebkit 架构

项目创建者 Riiiiichard 将 Zebkit 描述为以添加 SQLite 等库相同的方式为程序添加 Web 功能的方法。它将核心引擎组件——用于渲染的 Blink、用于 JavaScript 的 V8、用于 PDF 处理的 PDFium 以及用于媒体的 FFmpeg——作为一个单一库提供,并链接到原生代码中。

与将应用程序捆绑在自己的运行时和打包中的 Electron 不同,Zebkit 允许宿主应用程序保留自己的事件循环和窗口。该引擎可以作为窗口、现有窗口(如 X11、NSView 或 HWND)的子窗口,或者作为离屏组件集成,此时库将帧传回给应用程序进行绘制。

性能与尺寸对比

Riiiiichard 报告称,Zebkit 在 Linux 上比最新的 Electron 版本提供了显著的效率提升。具体而言,它小 34%(压缩后为 62 MB),冷启动时间为 2.3 秒(相比 Electron 的 6.6 秒),且在保持相同 DOM 和 JavaScript 速度的同时,页面内存占用减少了 29%。

尺寸的减少是通过关闭不必要功能的特定构建选项实现的。然而,创建者指出,某些组件如 WebRTC 和视频播放必须保留,因为 Blink 依赖于它们,且大多数应用程序都需要媒体支持。

社区讨论与权衡

Hacker News 上的评论者讨论了 Zebkit 与 Chromium Embedded Framework (CEF) 的区别。一位以 torginus 为名的评论者指出,虽然 CEF 被广泛用于游戏大厅和覆盖层,但它通常保持 Chrome 的“原生”状态,导致难以上游更新新版本。相比之下,Zebkit 更细粒度的方案可能允许更具体的优化,尽管它如何处理这些变化的复杂性仍有待观察。

其他参与者提出了关于安全和进程管理的担忧。一位名为 joahnn_s 的评论者质疑通过 CFFI 将 Chromium 作为共享库加载的安全性,指出引擎中的崩溃可能会导致整个应用程序进程崩溃。Riiiiichard 澄清说,虽然嵌入接口是 C API,但 Zebkit 仍使用 Chromium 内部的沙箱渲染进程和共享内存来保持隔离。

集成与限制

Zebkit 导出多个 Chromium C 库,例如 BoringSSL、zstd 和 FFmpeg,这样宿主应用程序就不需要重复编译或分发它们。这有助于管理底层引擎的依赖关系,同时保持宿主应用程序的占用空间在可控范围内。

虽然该项目提供了 Rust、Python 和 JavaScript 的绑定,但某些特定集成仍在进行中。例如,目前还没有原生的 Go 绑定,尽管 C API 旨在通过 cgo 使用。该项目的主要目标是提供一个“精简版”的 Chromium,赋予宿主应用程序对权限、下载和证书的完全控制。