Elysia 0.3 - 大地の閾を探して [寻找大地之缘]

以 Camellia 的歌曲「大地の閾を探して [寻找大地之缘]」ft. Hatsune Miku 命名,这是我最喜欢的 Camellia 专辑「U.U.F.O」的最后一首曲目。这首歌对我个人影响很大,因此我不会轻率地使用这个名字。
这是最具挑战性的更新,带来了 Elysia 到目前为止最大的发布,通过重新思考和重新设计 Elysia 架构,使其高度可扩展,同时尽可能减少破坏性变更。
我很高兴地宣布 Elysia 0.3 的发布候选版,带来令人兴奋的新功能。
Elysia Fn
介绍 Elysia Fn,在前端运行任何后端函数,支持完整的自动补全和完整的类型支持。
为了快速开发,Elysia Fn 允许您“暴露”后端代码,以便从前端调用,支持完整的类型安全、自动补全、原始代码注释和“点击定义”,从而加速开发。
您可以使用 Elysia Fn 与 Eden 结合,通过 Eden Fn 实现完整的类型安全。
权限
您可以限制函数的作用域,允许或拒绝权限,检查授权头部和其他头部字段,验证参数,或以编程方式限制键访问。
键检查支持所有可能函数的类型安全和自动补全,因此您不会遗漏某些函数或意外输入错误的名称。
以编程方式缩小属性作用域也会缩小参数的类型,或者换句话说,实现完整的类型安全。
技术细节
从技术细节来看,Elysia Fn 使用 JavaScript 的 Proxy 来捕获对象属性和参数,以创建批量请求到服务器进行处理,并在网络中返回值。 Elysia Fn 扩展了 superjson,允许 JavaScript 中的原生类型如 Error、Map、Set 和 undefined 跨 JSON 数据解析。
Elysia Fn 支持多种用例,例如在客户端 Next.js 应用中访问 Prisma。 理论上,可以使用 Redis、Sequelize、RabbitMQ 等。 由于 Elysia 运行在 Bun 上,Elysia Fn 可以并发运行超过 120 万次操作/秒(在 M1 Max 上测试)。
了解更多关于 Elysia Fn 的信息,请访问 Eden Fn。
类型重构
类型检查速度提高 6.5-9 倍,并大幅减少类型代码行数。
Elysia 0.3 中,超过 80% 的 Elysia 和 Eden 类型已被重写,重点关注性能、类型推断和快速自动补全。
测试超过 350 个具有复杂类型的路由,Elysia 仅需 0.22 秒即可生成类型声明,以与 Eden 一起使用。
由于 Elysia 路由现在直接编译为字面对象,而不是 Typebox 引用,Elysia 类型声明比 0.2 版本小得多,并且更容易被 Eden 消费。而且“小得多”意味着小 50-99%。
Elysia 与 TypeScript 的集成不仅显著更快,而且 Elysia 更好地理解 TypeScript 和您的代码。
例如,在 0.3 版本中,Elysia 对插件注册不那么严格,允许您在没有完整 Elysia 实例类型补全的情况下注册插件。 内联 use
函数现在可以推断父类型,嵌套守卫可以更准确地引用来自父模型的类型。
类型声明现在也可以构建和导出。
通过类型重写,Elysia 比以往更好地理解 TypeScript,类型补全将显著更快,我们鼓励您尝试一下,看看它有多快。 更多细节,请参阅此 Twitter 线程。
文件上传
感谢 Bun 0.5.7,Form Data 已实现,并在 Elysia 0.3 中默认启用,支持 multipart/formdata
。
为了定义上传文件的类型补全和验证,Elysia.t
现在扩展 TypeBox,支持 File
和 Files
用于文件验证。
验证包括检查文件类型(支持标准文件大小的自动补全)、文件的最小和最大大小,以及每个字段的文件总数。
Elysia 0.3 还提供了 schema.contentType
,以显式验证传入请求类型,在验证数据之前严格检查头部。
OpenAPI Schema 3.0.x
在 Elysia 0.3 中,Elysia 现在默认使用 OpenAPI schema 3.0.x,以更好地声明 API 定义,并更好地支持基于 content-type 的多种类型。
schema.details
现在已更新为 OpenAPI 3.0.x,Elysia 还更新了 Swagger 插件以匹配 OpenAPI 3.0.x,从而利用 OpenAPI 3 和 Swagger 中的新功能,尤其是文件上传。
Eden 重构
为了支持 Elysia 的更多需求,包括支持 Elysia Fn 和 Rest,Eden 已重构以适应新架构。
Eden 现在导出三种类型的函数。
- Eden Treaty
eden/treaty
:您熟悉和喜爱的原始 Eden 语法 - Eden Fn
eden/fn
:访问 Eden Fn - Eden Fetch
eden/fetch
:类似 Fetch 的语法,适用于高度复杂的 Elysia 类型(> 1,000 路由 / Elysia 实例)
通过类型定义的重构和对 Elysia Eden 的支持,Eden 现在更快,并且在从服务器推断类型方面更好。
自动补全更快,使用更少的资源,事实上,Eden 的类型声明已几乎 100% 重构,以减少大小和推断时间,使其能够在眨眼间支持超过 350 个路由的自动补全(~0.26 秒)。
为了使 Elysia Eden 完全类型安全,随着 Elysia 对 TypeScript 的更好理解,Eden 现在可以根据响应状态缩小类型,从而允许您在任何条件下正确捕获类型。
显著改进:
- 添加字符串格式:'email'、'uuid'、'date'、'date-time'
- 更新 @sinclair/typebox 到 0.25.24
- 更新 Raikiri 到 0.2.0-beta.0 (ei)
- 添加文件上传测试,感谢 #21 (@amirrezamahyari)
- 为 Eden 预编译小写方法
- 减少大多数 Elysia 类型的复杂指令
- 将
ElysiaRoute
类型编译为字面值 - 优化类型编译、类型推断和自动补全
- 提高类型编译速度
- 改进插件注册之间的 TypeScript 推断
- 优化 TypeScript 推断大小
- 上下文创建优化
- 默认使用 Raikiri 路由器
- 移除未使用的函数
- 重构
registerSchemaPath
以支持 OpenAPI 3.0.3 - 为 Eden 添加
error
推断 - 将
@sinclair/typebox
标记为可选的peerDependencies
修复:
- Raikiri 0.2 在未找到时抛出错误
- 带有
t.File
的联合响应不工作 - Swagger 上未定义 Definitions
- 组插件上缺少 details
- 组插件无法编译 schema
- 组无法导出,因为 EXPOSED 是私有属性
- 多个 Cookie 未将
content-type
设置为application/json
- 使用
fn.permission
时未导出EXPOSED
- 缺少
.ws
的合并返回类型 - 缺少 nanoid
- 上下文副作用
- Swagger 中的
t.Files
引用单个文件 - Eden 响应类型未知
- 无法通过 Eden 类型化
setModel
推断定义 - 处理非权限函数中抛出的错误
- 导出的变量有或使用来自外部模块的名称 'SCHEMA'
- 导出的变量有或使用来自外部模块的名称 'DEFS'
- 在
tsconfig.json
中使用declaration: true
构建 Elysia 应用时可能出错
破坏性变更:
- 将
inject
重命名为derive
- 弃用
ElysiaRoute
,改为内联 - 移除
derive
- 从 OpenAPI 2.x 更新到 OpenAPI 3.0.3
- 将 context.store[SYMBOL] 移动到 meta[SYMBOL]
后记
随着 Elysia Fn 的引入,我个人很兴奋地看到它如何被前端开发采用,消除前端和后端之间的界限。而且 Elysia 的类型重构使类型检查和自动补全更快。
我很期待看到您如何使用 Elysia 来创建您将要构建的精彩事物。
我们有一个专属于 Elysia 的 Discord 服务器。欢迎随时打招呼或只是放松闲聊。
感谢您支持 Elysia。
在一张永无止境的天体地图下
在一座无名的悬崖上
我只是嚎叫
希望永不停息的回响能触及你
并且我相信有一天,我将站在大地之缘
(直到我能回到你身边告诉你那天的事)