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
浏览器留在了构建环节。
构建时
用 TSX 写的屏幕设计师平常写的 React
Screen Compiler要么精确,要么不做
普通的 Rust可追溯到对应的 TSX 行
子集之外:拒绝,并给出文件、行和列
设备上
NoWayOS 界面运行时没有浏览器。没有 JavaScript。
要么精确,要么不做
靠猜测的转换器,是您无法信任的转换器。Screen Compiler 精确地转换它所声明的 TSX 子集,其余的一律拒绝,并给出文件、行和列。它从不近似。它写出的 Rust 没有 unsafe,没有 unwrap,也没有 panic。
然后,每个转换后的屏幕都由 NoWayOS 的渲染器绘制,并与它的已批准图像逐像素比较。哪怕只有一个像素移动,构建也会指出来。
目前的进展
Screen Compiler 正在开发中:它的第一个子集已经构建完成,下一个正在进行。它以 MIT 许可证开源,在 GitHub 上与 NoWayOS 并列。如果您的团队用 React 设计,并且构建举足轻重的设备,我们很希望听到您的消息。