这篇长文解释了我当前 Dart 开源工作的重心为什么会收束到这里。
可以把它当作 odroe.dev 首页与 /zh/packages 当前项目入口的长文补充。
需要英文版?阅读 English version。
为什么这条主线必须被明确说出来
过去几年里,我在 Dart 和 Flutter 上做过不少开源实验。
真实的问题也随之出现了:能看到的东西很多,但其中真正能组成“当前方向”的东西并不清晰。
所以我开始主动收束焦点。
现在,这条工作线的中心是 Spry。
Spry 是一个基于文件路由的服务端框架,面向希望在 Dart VM、Node.js、Bun、Deno、Cloudflare Workers、Vercel 与 Netlify 之间复用同一套代码的团队。它保持小而直接的编写模型,让生成结果显式、可检查,并且能从同一份源码树里生成 OpenAPI 文档与类型化客户端。
对我来说,这个组合比再套一层抽象更重要。
我想要的是一个足够贴近文件系统的框架:把部署目标变成构建问题,而不是重写问题;把生成出来的运行时保持为可见状态,而不是全部藏进巨大的 DSL 里。
这就是为什么 Spry 成了当前的重心。
它不只是一个 package,而是一个可以承接文档、示例、starter、部署指南、AI 辅助工具,以及更清晰公开叙事的项目入口。
为什么先把 Spry 放到最前面
我把 Spry 推到最前面,主要有三个原因。
第一,用户价值足够清楚
你可以用一句话解释 Spry:文件路由、显式输出、跨运行时部署,以及从同一个 Dart 项目生成 OpenAPI 与类型化客户端。
一旦落到具体场景,这件事会更容易被判断。
我希望一个团队可以先在 Dart VM 上启动一套文件路由 API,之后把同样的路由树发布到 Cloudflare Workers 或 Bun,同时继续从同一项目里产出 openapi.json 和类型化客户端。这就是我希望 Spry 能够变得足够无聊、足够稳定的工作流。
第二,它能产生杠杆
如果 Spry 做得更好,围绕它的很多东西都会更容易讲清楚:starter 仓库、运行时适配、文档、调试流程,以及未来面向 AI 辅助开发体验的集成。
第三,它给了我更合理的运营模型
与其继续维护一堆入口薄弱、彼此分散的实验,我更希望围绕一个表面积足够大、路线足够具体的项目来组织当前工作。
Alien Signals 和 Oref 放在什么位置
这并不意味着其他东西就此消失。
alien-signals-dart 和 oref 仍然是当前重点的一部分,只是它们承担的角色不同。
alien-signals-dart 是响应式核心。
它为 Dart 提供了一个轻量且高性能的响应式系统,核心原语是 signal()、computed() 与 effect()。我把它看作基础设施:表面积小、组合性强、追求性能,同时尽量减少不必要的仪式感。
oref 则是这种思路在 Flutter 里的开发体验表达。
它建立在 alien_signals 之上,把基于 signals 的状态模型变成真实 Flutter 应用里更顺手的开发方式。它不是为了“再做一个状态管理包”而存在,而是同一套偏好在 Flutter 场景里的实际延伸:更直接、更少模板代码、行为也更容易检查。
所以,我现在理解这组项目的方式很简单:
Spry是框架主线,也是当前最主要的公开入口。alien-signals-dart是响应式核心主线。oref是这套响应式模型在 Flutter 侧的应用表达。
它们不是同一个项目,但它们确实属于同一条方向。
接下来我会围绕 Spry 建什么
下一步不是制造更多噪音,而是让 Spry 更容易进入、更容易采纳,也更容易扩展。
这意味着:
- 围绕真实起步路径继续收紧文档和示例;
- 持续改善不同部署目标下的运行时与发布体验;
- 围绕文档、调试和项目脚手架,构建第一方的 AI 辅助工作流;
- 继续让生成结果和框架行为保持可检查,而不是变成黑盒魔法。
我已经在推进和 AI 辅助开发体验有关的工作,包括第一方文档、调试 skill、可选的 MCP server 路径,以及面向 coding agents 的第一方 plugin 方向。
这些不是支线任务。
它们本来就是同一个想法的一部分:如果框架的人体工学重要,那么围绕“理解项目、生成项目、调试项目”的工具体验同样重要。
之后的写作会写什么
接下来,我希望长文成为解释这些项目更深层原因的地方,而不是继续只发碎片化更新。
所以后续写作会沿着三条线展开:
- 围绕
Spry、alien-signals-dart与oref的项目长文; - 关于运行时设计、响应式系统与框架取舍的架构长文;
- 关于发布、维护与 AI 辅助工具链的开源运营长文。
简短版本仍然是同一句话:
Spry 之所以成为我当前 Dart 开源工作的中心,是因为它提供了最清晰的用户价值、最强的杠杆,也为我正在构建的其余工作给出了最连贯的下一步。
如果这条方向和你有关,最简单的跟进方式就是:先从 Spry 开始,再把 alien-signals-dart 与 oref 理解成同一条更大方向里的响应式核心和 Flutter 侧表达。