Orbis:使用 Rust 和 React 构建插件驱动的桌面平台
Source: Dev.to
现有插件系统的痛点
如果你曾为 VS Code、IntelliJ 或 Figma 等工具开发插件,你一定体会过以下痛苦:
- 陌生的环境 – 每个平台都有自己的 API、怪癖和限制。
- UI 开发困难 – 要么只能使用有限的 UI 基元,要么必须再学习另一套框架。
- 安全性被忽视 – 大多数插件系统默认信任插件代码。
- 状态管理成一团乱麻 – 在插件状态与宿主应用状态之间协调简直是噩梦。
我想要在不牺牲性能的前提下解决所有这些问题,所以答案是 Rust。
激进想法:插件交付 JSON Schema,而非 React 代码
{
"type": "Container",
"children": [
{
"type": "Heading",
"level": 1,
"text": "Hello, {{state.username}}!"
},
{
"type": "Button",
"label": "Count: {{state.clicks}}",
"events": {
"onClick": [
{
"type": "updateState",
"path": "clicks",
"value": "{{state.clicks + 1}}"
}
]
}
}
]
}
就是这样。 没有 JSX、没有打包工具、没有框架锁定。Orbis 核心解释此 schema,并使用 shadcn/ui 渲染可直接投入生产的 React 组件。
受控动作系统
因为插件不能交付任意 JavaScript,也就不能运行任意 JavaScript。所有交互都通过 受控动作系统 进行:
- 想要发起 API 调用?使用
call_api动作。 - 想要导航?使用
navigate动作。
核心会在执行前验证每个动作。
一致的、原生感 UI
所有插件都通过同一组件库渲染,消除突兀的 UI 不匹配(例如,一个插件使用 Material Design,另一个插件使用 Bootstrap)。
你不需要是前端开发者就能创建插件。
只要会写 JSON(或将来我们的自定义 DSL),就能构建 UI。
Source: …
分层架构
┌─────────────────────────────────────────────────┐
│ User Interface │
│ (Plugin Pages & UI) │
├─────────────────────────────────────────────────┤
│ Frontend Layer │
│ Schema Renderer │ Zustand State │ Actions │
├─────────────────────────────────────────────────┤
│ Backend Layer │
│ Tauri Commands │ Plugin Runtime │ Auth │
├─────────────────────────────────────────────────┤
│ Plugin System │
│ WASM Sandbox │ Manifests │ UI Schemas │
├─────────────────────────────────────────────────┤
│ Storage Layer │
│ SQLite │ PostgreSQL │
└─────────────────────────────────────────────────┘
前端
- 使用 React 构建。
- 使用 Zustand 进行状态管理。
- 每个插件页面拥有独立的状态——不会产生全局状态污染。
// Simplified: each page gets its own isolated state store
const pageStore = createPageStateStore({
username: "Guest",
clicks: 0
});
后端
- 纯 Rust,使用 Tauri 作为桌面包装器,使用 Axum 作为 HTTP 服务器。
- 优势:
- 原生性能——没有 Electron 的臃肿。
- 内存安全——Rust 的保证同样适用于插件。
- 跨平台——Windows、macOS、Linux 只需一套代码。
WASM 沙箱
插件编译为 WASM 并在 wasmtime 沙箱中运行,提供以下保障:
- 未经授权无法访问文件系统。
- 未经授权无法发起网络请求。
- 插件崩溃不会影响宿主应用。
- 内存空间相互隔离。
内置 UI 组件
开箱即用,Orbis 提供:
- 布局组件
- 表单组件
- 展示组件
- 交互组件
每个都映射到经过充分测试的 shadcn/ui 实现,为您免费提供可访问性、键盘导航和现代 UI 模式。
操作 – 插件如何与外部交互
{
"type": "call_api",
"api": "users.list",
"method": "GET",
"onSuccess": [
{
"type": "update_state",
"path": "users",
"value": "{{$response.body.data}}"
}
]
}
可用操作
| 操作 | 描述 |
|---|---|
update_state | 修改页面状态 |
call_api | 发起 HTTP 请求 |
navigate | 更改路由 |
show_toast | 显示 toast 通知 |
show_dialog / close_dialog | 处理模态框 |
validate_form / reset_form | 管理表单状态 |
conditional | if/else 逻辑 |
| … | 更多功能即将推出 |
存储选项
- 单用户桌面应用 – 嵌入式 SQLite(零外部依赖)。
- 多用户应用 – 连接到带有 PostgreSQL 后端的 Orbis 中央服务器,完整的身份验证、会话管理等。
安全 – 内置而非后加
- Secure authentication – JWT 令牌,使用 Argon2 密码哈希。
- Session management – 使用刷新令牌进行安全处理。
- WASM sandboxing – 隔离的插件执行。
- TLS support – 可选的 HTTPS,使用 rustls(不依赖 OpenSSL 或其他系统依赖)。
路线图
| 里程碑 | 描述 |
|---|---|
| 插件市场 | 一键发现并安装插件 |
| 插件间通信 | 在插件之间进行安全消息传递 |
| 自定义 DSL | 相比 JSON 更简洁的页面定义语法 |
| 完全 GUI 覆盖 | 允许插件完全替换默认 UI |
| 自动更新 | 利用 Tauri 内置的更新器实现无缝更新 |
| … | 更多功能正在开发中 |
更新
查看完整的即将推出功能路线图
克隆仓库
git clone https://github.com/cyberpath-HQ/orbis
cd orbis
安装前端依赖
cd orbis && bun install
在开发模式下运行
bun run tauri dev
您的第一个插件可以如此简单
{
"name": "hello-world",
"version": "0.1.0",
"pages": [
{
"id": "main",
"title": "Hello World",
"route": "/hello",
"state": {
"message": { "type": "string", "default": "Hello, Orbis!" }
},
"layout": {
"type": "Container",
"children": [
{
"type": "Heading",
"text": "{{state.message}}"
}
]
}
}
]
}
为什么选择 Rust?
选择 Rust 并非随意。除了性能优势之外,Rust 的所有权模型还能确保:
- 我们的插件运行时没有数据竞争
- 可预测的内存使用
- 插件执行时的无畏并发
- 在编译时提供的保证,在其他地方可能会导致运行时错误
此外,Rust 在 WASM 领域的生态系统已经相当成熟:
- Wasmtime – 经受实战考验的沙箱
- Tauri – 轻量级桌面包装器
- Axum – 高速异步 HTTP 服务器
Orbis 能提供的
Orbis 代表了一种面向可扩展桌面应用的新方法。通过将 what(JSON 架构)与 how(React 渲染)分离,我们创建了一个平台,使得:
- 插件开发者专注于功能,而不是框架的怪癖
- 用户获得一致、安全、美观的应用程序
- 核心团队可以演进渲染层,而不会破坏插件
如果你正在构建需要扩展的桌面应用——无论是内部工具、开发者实用程序,还是完整的产品——不妨试试 Orbis。
资源
- 网站: orbis.cyberpath-hq.com
- GitHub: github.com/cyberpath-HQ/orbis
- 文档: orbis.cyberpath-hq.com/docs
- 问题与讨论: GitHub Issues
如果你觉得这很有趣,关注我以获取更多关于 Rust、安全和开发者工具的深度解析。如果你用 Orbis 构建了什么,我很想看到!