NoWayOS
ZH
GitHub
菜单关闭

2026年11月13日

写的是 React,出的是 Rust

设计师继续用 React。设备得到的是原生 Rust。Screen Compiler 如何在构建时把屏幕变成代码,让设备上没有可供攻击的浏览器。

现代界面是用 React 设计的。于是,从控制面板到售票机,非常多的专用设备都带着一整个浏览器引擎,这是世上最庞大、受攻击最多的程序之一,只为了画出几个按钮和“Touch Start to begin”这几个词。

我们想要现代的设计流程,但不要浏览器。于是我们构建了 Screen Compiler。

用 React 编写屏幕

您的设计师和前端开发者继续使用他们的工具:组件、props、设计令牌,还有他们的编辑器。他们用 TSX 编写屏幕(下面这个节选自 Screen Compiler 的一个测试屏幕):

<Column gap={SPACE_SM} padding={SPACE_LG}>
  <Text id="title">Welcome</Text>
  <Text>Touch Start to begin.</Text>
  <Spacer />
  <Button id="start" onPress={onStart}>Start</Button>
</Column>

交付的是普通的 Rust

在构建时,在您的机器上或在 CI 中,Screen Compiler 把它转换成面向 NoWayOS 用户界面运行时的 Rust:

let n1 = b.text("Welcome")?; // welcome.tsx:17:9 <Text>
let n2 = b.text("Touch Start to begin.")?; // welcome.tsx:18:9 <Text>
let n4 = b.spacer(None)?; // welcome.tsx:20:9 <Spacer>
let n5 = b.button("Start", actions::START)?; // welcome.tsx:21:9 <Button>

每一行都指回它所来自的 TSX。设备得到的只有这些代码,别无其他:没有 JavaScript 引擎,没有浏览器,没有可供攻击的网页。Screen Compiler 本身从不随设备交付。

写的是 React,出的是 Rust

浏览器留在了构建环节。

构建时

  1. 用 TSX 写的屏幕设计师平常写的 React

  2. Screen Compiler要么精确,要么不做

  3. 普通的 Rust可追溯到对应的 TSX 行

子集之外:拒绝,并给出文件、行和列

设备上

NoWayOS 界面运行时没有浏览器。没有 JavaScript。

Screen Compiler 在构建时运行,从不随设备交付。这是对流程的示意。

要么精确,要么不做

靠猜测的转换器,是您无法信任的转换器。Screen Compiler 精确地转换它所声明的 TSX 子集,其余的一律拒绝,并给出文件、行和列。它从不近似。它写出的 Rust 没有 unsafe,没有 unwrap,也没有 panic。

然后,每个转换后的屏幕都由 NoWayOS 的渲染器绘制,并与它的已批准图像逐像素比较。哪怕只有一个像素移动,构建也会指出来。

目前的进展

Screen Compiler 正在开发中:它的第一个子集已经构建完成,下一个正在进行。它以 MIT 许可证开源,在 GitHub 上与 NoWayOS 并列。如果您的团队用 React 设计,并且构建举足轻重的设备,我们很希望听到您的消息。