有人可以告诉我们CEF和Electron之间的区别吗?
关于Electron,既然它是基于Chromium的,为什么要使用NodeJS而不是直接使用Chromium中的V8引擎?
有人可以告诉我们CEF和Electron之间的区别吗?
关于Electron,既然它是基于Chromium的,为什么要使用NodeJS而不是直接使用Chromium中的V8引擎?
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的源代码非常相似,我可以假设:
Electron == CEF + Node.js我对给出的答案都不是完全满意。
无论您使用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++跨平台库。