expo/exact
开发工具用 Contract 描述一次界面,配合 TypeScript 或 Rust 逻辑,在 Web、macOS、iOS 与 Linux 上原生运行。
项目介绍
Exact 是面向「主要由 AI agent 编写」场景的跨平台应用运行时。界面用一套小巧的声明式语言 Contract 描述,数据逻辑用 TypeScript 或 Rust 编写。编译器把界面编译成紧凑的 plan:在 Web 上,plan 变成一个基于约 20 KB 运行时的 ES module,直接操作真实 DOM;在 macOS、iOS 和 Linux 上,Rust runner 执行同一份 plan,Rust 布局内核按 CSS 规则计算每个盒子,各平台分别用 AppKit、UIKit 或 GPU painter 绘制。UI 层没有 webview,也没有 JavaScript bridge(三项原则、工作原理)。
项目处于 pre-1.0 阶段,不保证 API 稳定,也不提供迁移指南。它假设 app 由 coding agent 创建、运行、查看和测试,scripts/agent.mjs 提供十个跨宿主一致的操作。
快速使用
macOS 上的前置条件:通过 rustup 安装 Rust、使用锁定版本的 Bun 1.4.2、Google Chrome 和 Xcode。Hermes 只在原生宿主上运行 TypeScript 时需要,按文档中的 installer 为每个 target 安装一次(快速开始)。
git clone https://github.com/expo/exact.git
cd exact
bun scripts/exact.mjs setup
bun host/web/dev.mjs
打开 http://127.0.0.1:8765/ 查看 Caltrain 应用。首次运行会编译工具链,需要几分钟。修改 apps/caltrain/app.contract 并保存,页面会在约十分之一秒内重新构建并刷新。加上 --lan 可以从局域网内的手机打开。
在 macOS 上原生运行:
bun host/apple/build.mjs --run
首次 native 构建需要十到十五分钟。像 agent 一样驱动应用:
bun host/web/build.mjs caltrain-web
bun scripts/agent.mjs web tree "tap change-station" state "screenshot out.png"
bun scripts/agent.mjs web --test apps/caltrain/app.test.contract
新建应用可以运行 bun scripts/exact.mjs new ../hello,然后在新目录里运行 bun exact.mjs web。exact new 会生成 app.contract、app.ts、app.json 和小型宿主 crate,并附上指向 start-here.md 的 agent 说明。
使用约束
- 平台: Web、macOS、iOS(模拟器和真机)和 Linux 目前可用。Windows 只有部分支持;Android 处于早期阶段,没有上架打包;Android 的分发和商店打包也还没有。
- TypeScript 导入:
app.ts可以导入本地文件,但从 npm 包中只能导入类型,构建时会检查,但不会执行。 - 没有 JSX 或 React 层: 数据 seam 之上不运行任何 JavaScript。
- 数据与 I/O: Contract 本身不做 I/O;数据通过单一的类型化 source seam 流动,网络、文件、SQLite 和 secrets 受声明的 grants 控制。
- 编辑与文本: Linux 宿主只读不写;Linux 也没有分词器,泰文、老挝文、高棉文和缅甸文只能在空格处断行。
- 工具链: 没有打包好的 CLI;需要从源码 checkout 工作,
exact new生成的应用按路径引用它。 - 许可证: workspace 采用 MIT 许可证。
HotRepo 点评
Exact 是 Expo 在 agent-native 应用开发方向上较早的尝试,README 对构建循环、性能预算和当前缺口的说明相当具体。HotRepo 只在 2026-11-09 记录到一条新项目榜快照:264 stars,报告窗口内新增 130。历史太短,无法判断趋势,也没有每日总榜名次记录,因此更适合把它看作一个仍在快速变动的 pre-1.0 实验:目标具体,但平台覆盖和兼容性保证都明确尚未完成。
本文由 AI 根据项目 README 生成,更新于 ,以项目官方文档为准。