CEF和电子之间有什么区别?



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

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

CEF

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

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

此类应用程序的例子有Steam、Spotify、Adobe Brackets等。

电子

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

电子===CEF+Node.js

Electron的主要目的是让JavaScript开发人员在Chromium之上构建跨平台桌面应用程序。Electron应用程序中的每个窗口都代表一个Chromium窗口,用于呈现特定的网页或HTML。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就是你的选择。

回答第二个问题-NodeJs补充了Chromium引擎,而不是在Electron中替代它。请阅读这篇伟大的文章,了解框架内的流程沟通。简而言之,有两个主要参与者:

  • Main(或"主机")进程-在NodeJ上运行,可访问操作系统功能,负责windows编排并提供对本机功能的访问
  • Renderer进程-具有额外绑定的实际Chromium实例;说";到Main过程

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

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

没有明确的";胜利者";或";失败者;在那边以上每一项(以及顶部的一些)都需要额外的研究,请记住您的用户基础、开发团队对相关技术堆栈的经验、应用程序复杂性等

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

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

[@Vladimir说得对,CEF还有其他"嵌入式"用例,比如在应用程序中显示PDF。在这个答案中,我假设大多数使用这两个平台的人都对编写跨平台桌面应用程序感兴趣,其中"前端"是用HTML、CSS和JavaScript编写的不管是现在还是将来。]

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

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

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

对于调试,我可以在Visual Studio中运行C++服务器代码。然后,当我的Electron应用程序启动时(通过运行"npm-start"),它会检查服务器是否已经在运行,以及是否正在使用它(否则会将其作为子进程生成)。程序通过localhost HTTP进行通信。因此,在同一进程中运行服务器(使用带有CEF的C++或带有Electron的Node)与将服务器作为一个单独的进程运行(允许您用任何语言编写服务器)之间有一个非常小的区别。一位同事用Python制作了她的服务器,一切都一样。

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

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

相关内容

  • 没有找到相关文章

最新更新