什么是 Lynxtron?
Lynxtron 是一个使用 Lynx 和 Node.js 构建桌面应用的框架。如果你了解 Electron,可以将 Lynxtron 理解为把 Chromium 渲染层替换为 Lynx 的 Electron。
- 主进程侧本质上就是 Electron。Node.js 控制应用生命周期、窗口、菜单、托盘、对话框等系统级 API。
- UI 侧是 Lynx 运行时。可以使用 ReactLynx、VueLynx 等 Lynx 运行时 DSL 编写界面,最终使用
<view>、<text>、<image>等原生元素进行渲染,而非 HTML。
那你已经掌握了 Lynxtron 的大部分知识。本页只介绍新的部分:那些只因 Electron + Lynx 组合才存在的概念。
来自 Electron 的部分
主进程运行在 Node.js 上;Lynxtron 提供一组 Electron 风格的窗口、应用生命周期、菜单、托盘等桌面端 API。如果你用过 Electron,以下常用概念基本相同:
来自 Lynx 的部分
UI 层就是标准的 Lynx。你可以使用 Lynx 支持的运行时 DSL(如 ReactLynx、VueLynx)编写界面:
架构:单进程,双线程隔离
与 Electron 的多进程模型(主进程 + 渲染进程)不同,Lynxtron 运行在单个进程中,通过主线程 + Lynx 后台线程形成和 Electron 双进程模型对偶的双线程隔离;其中 Lynx 后台线程可以被多个窗口共享,也可以为窗口使用独立后台线程。
Lynxtron 在单进程内,把主控能力和 Lynx 主线程能力放在主线程,把 Lynx UI 业务逻辑放在 Lynx 后台线程。Lynx 后台线程直接运行在 Node.js 上,但每个窗口的 BTS Context 是隔离 context,不是 Node.js 全局环境,不能直接使用 Node.js 接口。多个窗口可以共享同一个后台线程,也可以为窗口分配独立后台线程;无论哪种方式,各窗口的 BTS Context 仍然相互隔离;BTS 只能通过 NativeModules.bridge 或 preload scripts 暴露的白名单能力访问 Node.js。
Lynxtron 中的关键差异
以下机制用于连接 Electron-like 主进程模型和 Lynx UI 运行时,是 Lynxtron 相比 Electron 或纯 Lynx 需要额外理解的部分:
使用 Lynx 元素构建桌面 UI
Lynxtron 为 Lynx 的 UI 系统增加了桌面特有的能力:
LynxWindow替代 ElectronBrowserWindow:窗口加载 Lynx bundle,并使用 Lynx 元素渲染 UI,而非加载 HTML 页面-x-app-region: drag:让 Lynx 元素成为窗口拖拽区域(类似 Electron 的-webkit-app-region: drag)<title-bar-view>:用于自定义标题栏的内置 Lynx 元素
线程间通信
Lynxtron 有三种线程间通信模式,对应 Electron 的 IPC:
通过 Preload Scripts 集成 Node.js
Preload scripts 可以理解为 Electron preload scripts / contextBridge 模式面向 Lynx BTS 的能力桥接层:preload scripts 在具备 Node.js 能力的隔离 context 中执行,再把明确允许的方法或对象暴露给 Lynx UI。
与 Electron 不同,Lynxtron 的 preload scripts 和 BTS 位于同一进程内的隔离 JS context 中。contextBridge.exposeInLynxBTS() 暴露的不是单纯的可序列化消息 payload,而是可供 BTS 直接调用的 JS 对象;这些对象可以包含函数、闭包,也可以返回 Promise。
核心流程是:
- 在
LynxWindow上配置lynxPreference.preload指定 preload script 文件。 - preload script 直接使用 Node.js API,并通过
contextBridge.exposeInLynxBTS()暴露白名单能力。 - Lynx BTS 通过
NativeModules.nodejs.exposed调用暴露出来的对象。
BTS 所在的 Lynx 后台线程直接运行在 Node.js 上,但 BTS 仍然处于隔离 context,不是 Node.js 全局环境,不能直接访问 Node.js 接口;所有 Node.js 能力都需要经过 preload scripts 显式暴露。
→ 了解更多:Lynxtron 中 Node.js 与 Lynx 的通信
下一步
- 准备动手写代码:快速上手
- 边做边学:教程:打造你的浏览器
- API 参考:@lynx-js/lynxtron API