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 字段中直接引用它们,而无需通过 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.response[statusCode] 为 schema 返回多个响应状态。
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 插件,用于 Elysia
值得注意的改进:
onRequest和onParse现在可以访问PreContext- 默认支持
application/x-www-form-urlencoded - Body 解析器现在解析带有额外属性的
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 的任何问题,或者只是闲聊放松——欢迎每个人。
有了这些精彩的工具,我们很兴奋看到您将构建什么惊人的软件。
不成为那些某人绘制的图像的一部分
不在那场由他人选择的表演中前进
你和我,活着来书写我们的故事
绝不会让你孤独,从你身边消失