For AI agents: the complete documentation index is available at /next/zh/llms.txt, the full documentation bundle is available at /next/zh/llms-full.txt, and this page is available as Markdown at /next/zh/lynxtron/learn/what-is-lynxtron.md.
  • 简体中文
  • 什么是 Lynxtron?

    Lynxtron 是一个使用 Lynx 和 Node.js 构建桌面应用的框架。如果你了解 Electron,可以将 Lynxtron 理解为把 Chromium 渲染层替换为 Lynx 的 Electron

    • 主进程侧本质上就是 Electron。Node.js 控制应用生命周期、窗口、菜单、托盘、对话框等系统级 API。
    • UI 侧是 Lynx 运行时。可以使用 ReactLynx、VueLynx 等 Lynx 运行时 DSL 编写界面,最终使用 <view><text><image> 等原生元素进行渲染,而非 HTML。
    已经熟悉 Electron 和 Lynx?

    那你已经掌握了 Lynxtron 的大部分知识。本页只介绍新的部分:那些只因 Electron + Lynx 组合才存在的概念。

    来自 Electron 的部分

    主进程运行在 Node.js 上;Lynxtron 提供一组 Electron 风格的窗口、应用生命周期、菜单、托盘等桌面端 API。如果你用过 Electron,以下常用概念基本相同:

    ElectronLynxtron区别
    BrowserWindowLynxWindow加载 Lynx bundle 而非 HTML;窗口构造与定制选项如 widthheightframetransparenttitleBarStylevibrancy 用法一致
    app / Menu / Tray / Notification / dialog / shell / screen 等桌面端 APIapp / Menu / Tray / Notification / dialog / shell / screen 等桌面端 API基本沿用 Electron API
    contextBridgecontextBridgeexposeInLynxBTS() 用于替代 Electron exposeInMainWorld(),并在其基础上增加了从 Node.js 向 Lynx 暴露可调用 JS 对象的能力,暴露对象可以包含函数、闭包和返回 Promise 的异步 API
    @electron/rebuild@lynx-js/lynxtron-rebuild不同的运行时 ABI
    electron-builder@lynx-js/lynxtron-builder基于 electron-builder 的 Lynxtron 打包入口;复用 electron-builder.yml,将 Electron runtime 替换为对应版本的 Lynxtron runtime,并支持 macOS universal 构建

    来自 Lynx 的部分

    UI 层就是标准的 Lynx。你可以使用 Lynx 支持的运行时 DSL(如 ReactLynx、VueLynx)编写界面:

    Lynx 概念在 Lynxtron 中的使用了解更多
    元素<view><text><image>窗口内容使用 Lynx 元素,而非 HTMLLynx 元素
    样式(CSS 子集 + -x- 扩展)标准 Lynx 样式Lynx 样式
    ReactLynx / VueLynx 等运行时 DSL使用 Lynx 支持的 DSL 编写 UIReactLynx / VueLynx
    NativeModulesLynx 原生模块入口;在 Lynxtron 中包含 NativeModules.bridge / NativeModules.nodejs 等通道Lynx NativeModules
    GlobalEventEmitter接收主进程推送的事件Lynx GlobalEventEmitter

    架构:单进程,双线程隔离

    与 Electron 的多进程模型(主进程 + 渲染进程)不同,Lynxtron 运行在单个进程中,通过主线程 + Lynx 后台线程形成和 Electron 双进程模型对偶的双线程隔离;其中 Lynx 后台线程可以被多个窗口共享,也可以为窗口使用独立后台线程。

    Lynxtron 单进程双线程架构
    Lynxtron 线程线程关系Electron 对偶主要职责
    主线程每个应用一个Electron 主进程 + Chromium 渲染侧的主线程职责Node.js 主进程 API、窗口管理、原生能力、Lynx MTS、输入、布局、渲染
    Lynx 后台线程可共享或按窗口独立Electron Renderer 中的页面业务 JS直接运行在 Node.js 上,承载各窗口隔离的 BTS Context,执行 Lynx UI 业务逻辑;BTS Context 不是 Node.js 全局环境,可通过桥接访问白名单 Node.js 能力

    Lynxtron 在单进程内,把主控能力和 Lynx 主线程能力放在主线程,把 Lynx UI 业务逻辑放在 Lynx 后台线程。Lynx 后台线程直接运行在 Node.js 上,但每个窗口的 BTS Context 是隔离 context,不是 Node.js 全局环境,不能直接使用 Node.js 接口。多个窗口可以共享同一个后台线程,也可以为窗口分配独立后台线程;无论哪种方式,各窗口的 BTS Context 仍然相互隔离;BTS 只能通过 NativeModules.bridgepreload scripts 暴露的白名单能力访问 Node.js。

    Lynxtron 中的关键差异

    以下机制用于连接 Electron-like 主进程模型和 Lynx UI 运行时,是 Lynxtron 相比 Electron 或纯 Lynx 需要额外理解的部分:

    使用 Lynx 元素构建桌面 UI

    Lynxtron 为 Lynx 的 UI 系统增加了桌面特有的能力:

    了解更多:构建自定义窗口

    线程间通信

    Lynxtron 有三种线程间通信模式,对应 Electron 的 IPC

    方向LynxtronElectron 对应
    Node.js → LynxLynxWindow.sendGlobalEvent()webContents.send()
    Lynx → Node.js(双向)NativeModules.bridge.call-lynx-invoke 事件ipcRenderer.invoke() + ipcMain.handle()
    Lynx → Node.js(单向)NativeModules.bridge.send-lynx-message 事件ipcRenderer.send() + ipcMain.on()

    了解更多:Node 与 Lynx 之间的通信

    通过 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。

    核心流程是:

    1. LynxWindow 上配置 lynxPreference.preload 指定 preload script 文件。
    2. preload script 直接使用 Node.js API,并通过 contextBridge.exposeInLynxBTS() 暴露白名单能力。
    3. Lynx BTS 通过 NativeModules.nodejs.exposed 调用暴露出来的对象。

    BTS 所在的 Lynx 后台线程直接运行在 Node.js 上,但 BTS 仍然处于隔离 context,不是 Node.js 全局环境,不能直接访问 Node.js 接口;所有 Node.js 能力都需要经过 preload scripts 显式暴露。

    了解更多:Lynxtron 中 Node.js 与 Lynx 的通信

    下一步

    除非另有说明,本项目采用知识共享署名 4.0 国际许可协议进行许可,代码示例采用 Apache License 2.0 许可协议进行许可。