CEF 和 Electron 有什么区别?

5

有人可以告诉我们CEF和Electron之间的区别吗?

关于Electron,既然它是基于Chromium的,为什么要使用NodeJS而不是直接使用Chromium中的V8引擎?

3个回答

10

CEF

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

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

这类应用程序的示例包括Steam、Spotify、Adobe Brackets和更多

Electron

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

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/JavaFX/SWT、Flutter等,则Electron适合您。

6
回答第二个问题 - NodeJs在Electron中是作为Chromium引擎的补充而不是替代品。请参阅这篇很棒的文章,以了解框架内的进程通信。简单来说,有两个主要角色:
- 主(或“宿主”)进程 - 在NodeJs上运行,具有访问操作系统功能的权限,负责窗口编排并提供对本机功能的访问。 - 渲染器进程 - 实际的Chromium实例,具有额外的绑定,允许与"主"进程"交流。
关于框架之间的差异 - 这是一个广泛的问题,一般来说它们都涵盖相同的需求,大部分差异在技术方面:
- 开发工具(开发语言、API、SDK、测试框架) - 支持的平台 - 打包和分发选项 - 性能和内存管理 - 开发社区采用情况 - 等等
没有明确的“赢家”或“输家”。以上每个项目(及其他几个项目)都需要进行额外的研究,并考虑您的用户群体、开发团队对相关技术栈的经验、应用程序复杂度等因素。

4

我对给出的答案都不是完全满意。

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

[@Vladimir正确指出CEF具有其他“嵌入式”用途,例如在应用程序内显示PDF。我假设在此答案中,大多数使用这两个平台的人都想编写使用HTML、CSS和JavaScript编写的跨平台桌面应用程序的“前端”。此外,也许可以现在或将来以类似的方式嵌入Electron。]

对于您应用程序的“后端”/“服务器”部分,您可以使用任何框架进行选择。如果您的后端是C++,使用CEF确实有一些好处,其中之一是您可以将后端代码放在与CEF构建相同的进程/项目中,并且后端可以直接在进程中与前端通信,而不必使用IPC,比如localhost HTTP。同样,如果您的后端是Node,则可以在不使用IPC来在客户端和服务器之间通信的情况下使用Electron。

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

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

为了调试,我可以在Visual Studio中运行我的C++服务器代码。然后,当我的Electron应用程序启动(通过运行“npm start”)时,它会检查服务器是否已经运行,如果是则使用它(否则将其作为子进程产生)。这些程序通过本地主机HTTP进行通信。因此,在同一进程中运行服务器(使用CEF的C++或带有Electron的Node),与单独运行服务器的进程(允许你使用任何语言编写服务器)之间的区别很小。我的同事用Python制作了她的服务器,它也可以正常工作。

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

最后,Electron拥有众多开发人员和庞大的社区。据我所知,CEF仍由一个非常小的团队开发,因此较少有教程、Stack Overflow问题等。此外,使用Node提供公共功能,如上面描述的对话框,是一个更安全的选择,因为有一个更大的社区和一个更精细的API,而不是使用像POCO这样的C++跨平台库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接