CEF 和 Electron 有什么区别?

有人可以告诉我们 CEF 和 Electron 有什么区别吗?
还有关于 Electron,既然 Electron 是基于 Chromium 的,为什么要使用 NodeJS 而不是直接使用 Chromium 中的 V8 引擎

stack overflow What's the diffrence between CEF and Electron?
原文答案

答案:

作者头像

回答第二个问题 - NodeJs 补充了 Chromium 引擎,而不是在 Electron 中替代它。请通过 this great article 了解框架内的进程通信。简而言之-那里有两个主要参与者:

  • Main(或“主机”)进程 - 在 NodeJ 上运行,可访问操作系统功能,负责 Windows 编排并提供对本机功能的访问
  • Renderer 进程 - 带有额外绑定的实际 Chromium 实例,允许与 Main 进程“对话”

关于框架之间的差异 - 这是一个广泛的问题,通常它们涵盖相同的需求,并且大部分差异都在技术方面:

  • 开发工具(开发语言、API、SDK、测试框架)
  • 支持的平台
  • 包装和分销选项
  • 性能和内存管理
  • 开发社区采用
    *待定

那里没有明确的“赢家”或“输家”。上面的每一项(以及一些最重要的)都需要额外的研究,请记住您的用户群、相关技术堆栈的开发团队经验、应用程序复杂性等

作者头像

CEF

CEF 是最早封装 Chromium 功能并提供可供第三方应用程序使用的 API 的解决方案之一。 Chromium 是一个独立的桌面应用程序。 CEF 将其表示为一个框架。由于 Chromium 是使用 C++ 编写的,因此 CEF 代表了 C++ 开发人员的框架,但有许多用于 Java.NETPython 语言的端口。

CEF 的主要目的是让 C++ 开发人员将 Chromium 嵌入到他们的 C++ 跨桌面应用程序中 并访问 Chromium 功能,如渲染(包括离屏)、DOM、V8、PDF 查看器、打印、网络请求/响应、饼干等

此类应用程序的示例包括 Steam、Spotify、Adoby Brakets 和 more

电子

考虑到 CEF 和 Electron 源代码非常相似,我可以假设:

电子 == CEF + Node.js

Electron 的主要目的是让 JavaScript 开发人员在 Chromium 之上构建跨平台桌面应用程序。 Electron 应用程序中的每个窗口都代表一个呈现特定网页或 HTML 的 Chromium 窗口。 Electron 应用程序的 GUI 是使用 HTML、CSS 和 JavaScript 构建的。逻辑(后端)是使用 Node.js 编写的。

使用哪一个?

如果您是 C++ 开发人员,CEF 适合您。它允许您将 Chromium 嵌入到现有的 C++ 桌面应用程序中并创建 Electron C++ 跨桌面应用程序。

如果您是一名 JavaScript 开发人员,想要使用 HTML、CSS、JavaScript GUI 创建跨桌面应用程序,并且不想学习更高效的技术和框架,例如 Qt、Gtk、Cocoa、Java Swing/,那么 Electron 适合您/ JavaFX/SWT、Flutter 等

作者头像

我对给出的任何一个答案都不完全满意。

无论您使用的是 CEF 还是 Electron,其想法是您将使用浏览器技术(HTML、CSS、JavaScript)构建桌面应用程序的“前端”/“客户端”。这使您可以编写(大部分)前端一次,并在不同的平台上运行(Chrome 可以运行的任何平台)。此外,这些框架允许您通过更高级别的 API 使用 Chromium 代码库,而不必从源代码构建 Chromium 并处理其所有复杂性(回答 OP 中的第二个问题)。

[@Vladimir 说得对,CEF 有其他“嵌入式”用例,例如在应用程序中显示 PDF。我在这个答案中假设大多数使用这两个平台的人都对编写跨平台桌面应用程序感兴趣,其中“前端”是用 HTML、CSS 和 JavaScript 编写的。此外,现在或将来可能会以类似的方式嵌入 Electron。]

对于应用程序的“后端”/“服务器”部分,您可以选择任一框架。如果您的后端是 C++,那么使用 CEF 确实有一些好处,一个是您可以将后端代码与您的 CEF 构建放在同一个进程/项目中,并且后端可以与前端对话直接在进程中,无需使用 localhost HTTP 等 IPC。同样,如果您的后端在 Node 中,它将与 Electron 一起工作,而无需使用 IPC 在客户端和服务器之间进行通信。

但是,在这两种情况下,您都可以使用您想要的任何语言/框架编写后端/服务器。客户端/UI/应用程序启动启动服务器进程,并与之通信。使用 localhost HTTP 是一个不错的选择,因为它类似于真正的基于 Web 的设置(网页与删除服务器通信)。

我使用 CEF 很长时间,最近改用 Electron。尽管我的后端是 C++,但我发现 Electron 是一个更好的工具,因为您可以通过 Node.js 获得额外级别的跨平台功能。例如,Node 具有显示标准打开和保存文件对话框以及截屏的功能。使用 Electron 时,您可以使用 Node 函数。使用 CEF 时,我不得不为 Macintosh 和 Windows 分别编写这些函数。更一般地说,CEF 更底层。例如,您在使用 CEF 时提供自己的 WNDPROC,而使用 Electron 您不必考虑那个级别。此外,Electron 被打包为一个 npm 模块,与 CEF 相比,您可以在 package.json 文件中添加 Electron 作为开发依赖项,这很神奇,整个业务都在您的 node_modules 的子目录中为您管理不用担心。

对于调试,我可以在 Visual Studio 中运行我的 C++ 服务器代码。然后,当我的 Electron 应用程序启动时(通过运行“npm start”),它会检查服务器是否已经在运行,如果是则使用它(否则将其作为子进程生成)。这些程序通过 localhost HTTP 进行通信。因此,在同一进程中运行服务器(将 C++ 与 CEF 或 Node 与 Electron 一起使用)与将服务器作为单独的进程运行(允许您以任何您想要的语言编写服务器)之间存在相当小的差异。一位同事用 Python 制作了她的服务器,一切都一样。

就我而言,这确实意味着需要考虑三个领域:客户端代码(HTML、CSS、JavaScript)、node层(Node/JavaScript)和 C++ 后端/服务器进程。对我来说,Node/JavaScript 层在客户端和 C++ 服务器之间传递消息,并且还处理一些常见的 UI 功能,如上所述。

最后,Electron 有很多开发者和一个庞大的社区。据我所知,CEF 仍然是由一个很小的团队开发的,所以教程、Stack Overflow 问题等较少。此外,使用 Node 提供常用功能(如上述对话框)是更安全的选择,因为与使用像 POCO 这样的 C++ 跨平台库相比,这里有更大的社区和更完善的 API。