AB
AiBoss
project

exact - 用 Contract 声明界面、一次编写跑在 Web 与原生平台的跨端应用运行时

exact 是 expo 维护的跨平台应用运行时:界面用声明式语言 Contract 描述,数据逻辑用 TypeScript 或 Rust 编写,同一份代码在 Web、macOS、iOS 与 Linux 上原生渲染。项目自述强调「面向 AI agent」与「无 webview、无 JS 桥」,目前处于 pre-1.0 阶段,尚无正式 release。

exact 是 expo 维护的一个跨平台应用运行时。按项目自述,它把界面与数据逻辑分开:界面写在一种名为 Contract 的小型声明式语言里,数据逻辑用 TypeScript 或 Rust 编写;Contract 编译器把界面编译成一份紧凑的「plan」,Web 端把它变成一个约 20 KB 运行时的 ES module 驱动真实 DOM,macOS、iOS 与 Linux 端则由 Rust runner 执行同一份 plan,用 AppKit、UIKit 或 GPU 绘制。项目强调 UI 层没有 webview、没有 JavaScript 桥,首帧之前不执行应用 JavaScript。

它适合两类读者:一是希望一套界面代码同时覆盖 Web 与 Apple 平台、又不想接受 webview 折衷的开发者;二是想把「写、跑、看、测」交给 AI agent 自动完成的团队——项目自述的第一条设计原则就是「agent native」。需要提醒的是,项目自述明确说明它处于 pre-1.0、每天变化,没有 API 稳定性、没有向后兼容、也没有迁移指南。

维护者与状态

仓库由 expo 维护,地址为 github.com/expo/exact。按官方接口数据,仓库创建于 2026-11-02,最后提交时间为 2026-11-13,截至 2026-11-13 星标数为 3758,尚无正式 release。也就是说,目前没有可引用的版本号与发布说明,使用者只能跟随主分支。

项目自述补充了版本状态的背景:当前仓库是一次重建(自述中称为 exact2),前身项目的设计文档只作为研究材料、不具权威性;设计记录存放在另一个私有仓库中,公开文档是 docs/ 目录下的指南。自述还提到一条 2026-10-16 的升级说明,涉及 mutation 回复失败时的行为变化,说明接口仍在调整之中。

主要能力

以下能力均据项目 README 自述,未经独立验证。

  • 一套界面,多端原生呈现。 同一份 app.contract 在 Web、macOS、iOS(模拟器或真机)与 Linux 上渲染同一屏。Web 端使用浏览器自身的 DOM 与 CSS;Apple 平台使用 UIKit / AppKit 原生控件与系统标签栏;Linux 端使用 GPU 绘制或 CPU 光栅化。
  • 面向 agent 的十个操作。 自述称 tree · screenshot · tap · type · state · layout · logs · clock · prefer · perf 这十个操作在所有宿主上一致,通过同一个脚本 scripts/agent.mjs 驱动。数量被刻意限制为十个,理由是前身项目的 agent API 曾膨胀到八十个接口名。
  • 可控的时钟。 两次操作之间界面不自行推进;agent 用 clock +60000 或 clock settle 推进时间再读结果,以避免等待动画造成的时序抖动。
  • 测试即操作脚本。 app.test.contract 文件可在任意宿主上原样运行,不需要第二套求值器。
  • 面向机器的工具输出。 contract build --json 给出带稳定 id 与源码区间的诊断,contract symbols 提供导航,开发用 source map 可从屏幕上的节点回溯到声明它的那一行;驱动会拒绝驱动比源码更旧的构建并提示重建。
  • CSS 词汇与布局模型。 自述称布局遵循 CSS 规则(裸节点等同 display: block、box-sizing: content-box 等),属性名使用 Web 拼写,编译器会拒绝别名;未声明的表现交给平台默认,例如文本使用系统标签颜色与字号、button 使用系统按钮。
  • 性能预算。 自述列出若干被逐次提交跟踪的预算目标,包括冷启动到可交互首帧 100 ms p50、开发重启 100 ms p50、首帧前执行的应用 JavaScript 为零、改动一行后重建对应 crate 30 秒、整套阻塞检查 65 秒。这些是项目设定的目标值,不是第三方测得的成绩。

使用入口

仓库地址:expo/exact。

据项目说明,使用前需要先安装工具链,然后执行一次初始化,再用 new 命令创建应用:

bun scripts/exact.mjs setup
bun scripts/exact.mjs new

自述称 docs/start-here.md 是唯一必读的指南,做网站则读 docs/start-here-site.md。README 还给出了一个可直接交给编码 agent 的提示词示例:在装有 Xcode、Rust、Bun 与 Chrome 的 Mac 上,让 agent 克隆仓库、按 README 用 exact new 创建应用、先跑一次 setup,然后做一个待办清单,把视图放在 Contract、列表放在 app.ts,写一个 app.test.contract,用 scripts/agent.mjs 在 Web、macOS 与 iOS 模拟器上跑通后再打开应用。自述提到,在干净克隆、Hermes 已在机器缓存且 Cargo 缓存已热的情况下,一个 agent 用早期版本的提示词约 57 分钟完成,其中约 25 分钟是首次 macOS 与 iOS 构建(各约 13 分钟),后续构建为一两分钟。

许可与限制

许可证为 MIT。

项目自述写明的限制与边界包括:

  • pre-1.0,无稳定性承诺。 自述明确表示没有 API 稳定性、没有向后兼容、没有迁移指南,这是有意为之。
  • 工具链前置条件较重。 示例提示词要求机器上装有 Xcode、Rust、Bun 与 Chrome;自述提到若机器缺少 Hermes,需要先做源码构建,会额外增加时间。当前 setup 会一次性下载并校验固定版本的宿主与 iOS 包,之后的常规构建保持离线。
  • 布局存在已声明的偏差。 自述称任何不可避免的布局偏差都会连同原因记录在编号文档中,并举例说明所用布局引擎没有 position: static。
  • 示例应用非真实业务。 自述中的 Softwear 是演示商店,展示某品牌目录但与品牌无关联,不处理真实订单与支付。
  • 文档与设计记录的边界。 设计记录位于私有仓库,公开可读的是 docs/ 下的指南;前身项目的设计文档仅作研究参考。

由于尚无正式 release,且自述称项目每天变化,评估时应以仓库当前代码与公开指南为准,而不是以任何二手描述为准。