全栈 Web 框架 Wasp 发布了其第 12 次 Launch Week 的重头戏——TypeScript Spec。这是一次对框架核心架构的根本性改造:Wasp 抛弃了自研的领域特定语言(DSL),转而用纯 TypeScript 来实现其最具特色的"spec"层。Wasp 联合创始人兼 CTO Martin Sosic 在博客中坦言,这个决定源于一个关键认知——"为 Web 开发发明新语言,问题比价值更多"。

先理解 Wasp 是什么。它是一个有自我特色(opinionated)、功能齐全(batteries-included)、真正的全栈 JS/TS Web 框架,精神上继承自 Ruby on Rails、Laravel、Django 这一脉络,但为现代 JavaScript 生态重新设计。"真正的全栈"意味着 Wasp 同时覆盖前端、后端和数据库,目标是端到端地捕获 Web 应用开发的全部环节。"Spec 驱动"则是 Wasp 最独特的核心理念——框架的名字本身就是"Web App SPecification"的首字母缩写。
Spec 是 Wasp 中一个独有的逻辑层。它不写前端、后端或数据库逻辑,而是写"全栈逻辑"。在这个层中,你用一套高级构建块(page、route、query、action、job、api 等)来定义你的应用是什么,然后把具体实现交给 React、Node.js、Prisma 等你已经熟悉的底层技术。Wasp 编译器读取 spec 和实现代码,将它们编织成一个完整的全栈应用。
到目前为止,这个 spec 层是用一套自研的 DSL 搭配自定义编译器和工具链来实现的。但 Sosic 在五月初就已经公开反思过——维护一门自己的语言意味着编辑器支持、错误提示、类型检查、社区上手成本全部要从头搭建。当框架试图扩展为更大的生态时,DSL 变成了瓶颈。
TypeScript Spec 的解决方案是:你不再写 .wasp 文件,而是写 *.wasp.ts 文件。你从 @wasp.sh/spec 包中导入 app、page、route、query、action、job 等构建函数,用 TypeScript 代码组合出一个完整的 app spec 对象,然后在 main.wasp.ts 中 export default 它。
从表面看,代码结构变化不大——你仍然在定义路由、页面、查询、认证方式。但本质区别在于,你写的不再是受限的 DSL 语法,而是完整的 TypeScript。你可以使用第三方 npm 库、可以将 spec 拆分到多个 TypeScript 文件中、可以定义自己的 helper 函数、可以用 for 循环动态生成 spec、可以从磁盘读取配置、可以检查环境变量——"甚至可以发射火箭",Sosic 半开玩笑地写道。
这种灵活性带来了诸多前所未有的可能性。文章中最精彩的示例是文件系统路由的实现:Wasp 默认使用显式路由定义(在 spec 中逐一声明),但如果你更偏好 Next.js 风格的文件路由,你可以在 main.wasp.ts 中写一个 helper 函数,用 Node.js 的 fs 模块扫描 src/ 目录结构,根据目录和文件自动生成 route() 和 page() 的 spec 数组,然后将其拼接到 app.spec 中。Sosic 称之为"把 Wasp 变成了一个元框架(meta-meta-framework)"。
Wasp 还引入了一个巧妙的编译时机制来解决 spec 和实现之间的连接问题:with { type: 'ref' } 导入。这类导入不会被真正执行,而是在打包阶段被转换为引用对象(ref({ import: 'getTasks', from: './src/tasks' })),传递给 spec 构造函数。这意味着你的 spec 可以引用实现代码,同时保持 spec 本身的独立性和可分析性。
为什么 Wasp 团队对 spec 如此执着?Sosic 的解释触及了 Web 框架的本质:所有 Web 框架,从定义上说,都在捕捉"Web 应用是什么"这个领域的本质,给它结构,引入概念,然后让你填补空白——这本质上就是在分离"规格说明"(想要什么)和"实现"(怎么实现)。Wasp 的不同之处在于,它将这种规格说明提升为"一等公民"。它不是基于惯例的(魔法文件名、目录结构)、不是隐式的、不绑定于底层技术栈的运行时。它是显式的、可编程的、可组合的、栈无关的、可扩展的。
这种设计对 AI 辅助编程有特殊的价值。在 spec 驱动的 AI 工程方法日益流行的当下(如 OpenSpec、GitHub Spec Kit 等工具),Wasp 的 spec 更进一步:你的 spec 是应用的真正可编译组成部分,而不是随时间漂移的 Markdown 文件。AI 可以先从 spec 中获取应用的高层鸟瞰图和设计意图,然后才深入实现细节。未来如果 Full Stack Modules(全栈模块)落地,开发者甚至可以给 AI 提供经过测试验证的全栈构建块,确保某些部分不会被 AI 意外搞砸。
Wasp 目前仍在 Beta 阶段,团队正在三条线上并行推进:进一步完善 TS Spec 设计(将数据模型纳入 spec、实现 spec 可扩展性)、推动核心模块(认证、任务队列、数据库、路由渲染等)向 1.0 成熟度演进、以及横向扩展(支持 Drizzle 等其他 ORM、Svelte/Vue 等前端库、甚至 Python/Go/Rust 等后端语言)。
这次架构变更折射出一个更广泛的趋势:在经过了十年的"去框架化"和"微库组合"思潮之后,全栈框架正在经历一次复兴。Wasp 的 TypeScript Spec 代表了这种复兴中的一个新方向——不是重新发明语言,而是用业界最主流的语言来承载框架的独特设计哲学。
参考来源: