Elysia 0.2 - 祝福

「Blessing」带来了更多改进,主要针对 TypeScript 性能、类型推断、更佳的自动补全,以及一些减少样板代码的新功能。
以 YOASOBI 的歌曲《祝福》命名,这是《机动战士高达:水星的魔女》的开场曲。
延迟加载 / 懒加载模块
Elysia 0.2 现在添加了对懒加载模块和异步插件的支持。
这使得延迟注册插件成为可能,并在 Elysia 服务器启动后逐步应用,从而在 Serverless/Edge 环境中实现最快的启动时间。
要创建延迟模块,只需将插件标记为异步:
const plugin = async (app: Elysia) => {
const stuff = await doSomeHeavyWork()
return app.get('/heavy', stuff)
}
app.use(plugin)
懒加载
某些模块可能很重,在启动服务器之前导入它们可能不是一个好主意。
我们可以告诉 Elysia 跳过该模块,然后稍后注册,并在 use
中使用 import
语句完成加载后注册模块:
app.use(import('./some-heavy-module'))
这将在导入完成后注册模块,使模块实现懒加载。
延迟插件和懒加载模块将开箱即用地提供所有类型推断。
引用模型
现在 Elysia 可以记忆 schema 并直接在 Schema 字段中引用 schema,而无需通过 Elysia.setModel
创建导入文件。
这个可用 schema 列表带来了自动补全、完整的类型推断,以及您从内联 schema 期望的验证。
要使用引用模型,首先使用 setModel
注册模型,然后在 schema
中写入模型名称来引用模型:
const app = new Elysia()
.setModel({
sign: t.Object({
username: t.String(),
password: t.String()
})
})
.post('/sign', ({ body }) => body, {
schema: {
body: 'sign',
response: 'sign'
}
})
这将带来已知模型的自动补全。
类型引用还会防止您意外返回无效类型。
使用 @elysiajs/swagger
还会为列出可用模型创建一个单独的 Model
部分。
引用还会按您期望的方式处理验证。
简而言之,它与内联 schema 完全相同,但现在您只需输入 schema 的名称即可处理验证和类型定义,而无需长长的导入列表。
OpenAPI 详情字段
引入新字段 schema.detail
,用于自定义路由的详情,遵循 OpenAPI Schema V2 标准,并带有自动补全。

这允许您编写更好的文档,并完全可编辑的 Swagger,如您所愿:
联合类型
Elysia 的前一个版本有时在处理不同的联合类型时会出现问题,因为 Elysia 试图捕获响应以为 Eden 创建完整的类型引用。
这会导致可能类型的无效化。
联合响应
得益于联合类型,现在为 schema
返回多个响应状态成为可能,使用 schema.response[statusCode]
。
app
.post(
'/json/:id',
({ body, params: { id } }) => ({
...body,
id
}),
{
schema: {
body: 'sign',
response: {
200: t.Object({
username: t.String(),
password: t.String(),
id: t.String()
}),
400: t.Object({
error: t.String()
})
}
}
}
)
Elysia 将尝试验证 response
中的所有 schema,允许返回其中一种类型。
返回类型也会在 Swagger 的响应中报告。
更快的类型推断
在 Elysia 0.1 中探索使用类型推断来改善开发者体验的可能性时,我们发现有时由于繁重的类型推断和低效的自定义泛型,更新类型推断需要很长时间。
Elysia 0.2 现在针对更快的类型推断进行了优化,防止繁重类型展开的重复,从而在更新类型和推断方面实现更好的性能。
生态系统
Elysia 0.2 通过启用异步插件和延迟模块,使得许多之前不可能的新插件成为现实。
例如:
- 具有非阻塞能力的 Elysia Static 插件
- Eden 支持多响应联合类型推断
- 新 Elysia Apollo 插件
值得注意的改进:
onRequest
和onParse
现在可以访问PreContext
- 默认支持
application/x-www-form-urlencoded
- body parser 现在解析带有额外属性的
content-type
,例如application/json;charset=utf-8
- 解码 URI 参数路径参数
- 如果 Elysia 未安装,Eden 现在会报告错误
- 跳过现有模型和装饰器的声明
破坏性变更:
onParse
现在接受(context: PreContext, contentType: string)
而不是(request: Request, contentType: string)
- 要迁移,请在 context 中添加
.request
来访问Request
- 要迁移,请在 context 中添加
后记
感谢您支持 Elysia 并对这个项目感兴趣。
本次发布带来了更好的 DX,并希望这能让您使用 Bun 编写优秀的软件所需要的一切。
现在我们有 Discord 服务器,您可以在那里询问关于 Elysia 的任何问题,或者只是闲逛和放松,也欢迎加入。
凭借这些精彩的工具,我们很高兴看到您将构建出什么样的精彩软件。
不成为他人画中描绘的那些图像的一部分
不在那场由他人选择的表演中前进
你和我,活着来书写我们的故事
绝不会让你孤独,从你身边离去