74

我试图了解Electron(以前称为 Atom Shell)的工作原理。

我来自传统的 MVC 风格的 Web 应用程序,其中浏览器通过路由系统调用控制器操作,然后控制器从存储(文件系统、数据库等)获取数据并呈现视图,将其发送回浏览器。一些操作可能会返回 JSON,因为它们是通过 JavaScript/AJAX 调用的,而不是浏览器实际导航到它们。

我想创建它,但作为跨平台桌面应用程序。我知道 Atom Shell 结合了 Chromium-Browser 和 Node.js/v8 运行时,但我不确定它们将如何通信。

我想我可以在 Web 服务器上运行一个完整的服务器(基本上是一些 Node.js HTTP 中间件,比如Express),但这会创建一个网络可访问的服务器(这也可能会触发防火墙)——这也是我想要制作桌面的原因之一app 正是为了避免运行真正的服务器。基本上就像“普通”桌面应用程序中的 MVP/MVVM 模式。

有人可以给我一些我正在尝试做的事情的起点吗?浏览器将如何与节点运行时(他们称之为“客户端”?)进行对话以告诉它“嘿,获取我的 ID 为 12345 的记录”,客户端会返回呈现的 HTML,还是浏览器只会得到一个 blob JSON 返回并通过 JavaScript 模板引擎呈现?

4

2 回答 2

72

Electron 似乎没有将 Node.js 用作 Web 服务器,而只是用作运行后台 JavaScript 代码的环境,此代码可以使用节点模块来访问系统。同时,Chromium 为应用程序提供了一个用户界面,它显示了运行普通沙盒 JavaScript 的常规网页。两者都由 Electron 可执行文件嵌入,前者直接嵌入(Node.js 可以构建为静态库),后者通过libchromiumcontent 嵌入。在某种程度上,Node.js 是应用程序的控制器部分,而 Chromium 是视图。

通常,这里用于网页的概念是单页应用程序的概念:一个网页代表一个应用程序窗口,因此只要该窗口可见,它就会一直存在(通常在应用程序的整个生命周期内)。每当它需要显示不同的东西时,它都会从运行在 Node.js 中的后台代码请求数据,就像 AJAX 应用程序从服务器请求数据一样。页面本身不会重新加载,通常会使用 JavaScript 模板来更新内容。

然而,这里并没有真正的服务器/客户端关系,通信实际上可以双向进行。双方可以使用该ipc模块互相发送消息(主进程渲染器)。这些消息可以附加任何参数,这些不需要显式编码(通常这是通过在内部使用 JSON 对参数进行编码来实现的,我没有验证 Electron 是否是这种情况)。在内部,消息传递是通过特定于平台的IPC机制实现的,确切地说是使用libuv

于 2014-07-07T20:12:40.727 回答
2

我们使用 sqlite3 实现了功能齐全的 nodejs 服务器和 angular UI,使用 sequelize ORM

*。https://github.com/theallmightyjohnmanning/electron-express

一些项目帮助了我们很多:

  • 框架:https ://github.com/angular-fullstack/generator-angular-fullstack Windows 打包:electron-packager":"github:electron-userland/electron-packager"
  • 创建快捷方式和自动更新:“electron-squirrel-startup”:“^1.0.0”,
  • 创建发布安装程序:“electron-winstaller”:“^2.3.4”,
于 2016-12-26T05:09:23.527 回答