Skip to content
Our Sponsors
Open in Anthropic
Blog

Elysia 0.2 - 祝福

雪山上空夜空中从蓝色到紫色的极光

Blessing」带来了许多改进,主要在 TypeScript 性能、类型推断、更好的自动补全以及减少样板代码的新功能。

以 YOASOBI 的歌曲「祝福」命名,这是《机动战士高达:水星的魔女》的开场曲。

延迟加载 / 懒加载模块

Elysia 0.2 现在添加了对懒加载模块和异步插件的支持。

这使得延迟插件注册成为可能,并在 Elysia 服务器启动后逐步应用插件,从而在 Serverless/Edge 环境中实现最快的启动时间。

要创建延迟模块,只需将插件标记为异步:

typescript
const plugin = async (app: Elysia) => {
    const stuff = await doSomeHeavyWork()

    return app.get('/heavy', stuff)
}

app.use(plugin)

懒加载

有些模块可能很重,在启动服务器前导入可能不是一个好主意。

我们可以告诉 Elysia 跳过该模块,然后稍后注册,并在 use 中使用 import 语句加载完成后注册模块:

typescript
app.use(import('./some-heavy-module'))

这将在导入完成后注册模块,从而使模块实现懒加载。

延迟插件和懒加载模块将开箱即用地提供完整的类型推断。

引用模型

现在 Elysia 可以记忆 schema 并在 Schema 字段中直接引用它们,而无需通过 Elysia.setModel 创建导入文件。

这个可用 schema 列表带来了自动补全、完整的类型推断以及您对内联 schema 的预期验证。

要使用引用模型,首先使用 setModel 注册模型,然后在 schema 中写入模型名称来引用模型:

typescript
const app = new Elysia()
    .setModel({
        sign: t.Object({
            username: t.String(),
            password: t.String()
        })
    })
    .post('/sign', ({ body }) => body, {
        schema: {
            body: 'sign',
            response: 'sign'
        }
    })

这将提供已知模型的自动补全。 Screenshot 2566-01-23 at 13 24 28

类型引用还可以防止您意外返回无效类型。 Screenshot 2566-01-23 at 13 26 00

使用 @elysiajs/swagger 还会创建一个单独的 Model 部分来列出可用模型。 Screenshot 2566-01-23 at 13 23 41

引用还会像您预期的那样处理验证。

简而言之,它与使用内联 schema 相同,但现在您只需输入 schema 的名称即可处理验证和类型,而无需一长串导入。

OpenAPI 详细信息字段

引入一个新字段 schema.detail,用于自定义路由的详细信息,遵循 OpenAPI Schema V2 标准,并支持自动补全。

Screenshot 2566-01-23 at 13 54 11

这允许您编写更好的文档,并拥有完全可编辑的 Swagger,正如您所愿: Screenshot 2566-01-23 at 13 23 41

联合类型

Elysia 的先前版本有时在不同的联合类型上存在问题,因为 Elysia 试图捕获响应以为 Eden 创建完整的类型引用。

这导致可能类型的无效化。

联合响应

得益于联合类型,现在可以使用 schema.response[statusCode]schema 返回多个响应状态。

typescript
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

值得注意的改进:

  • onRequestonParse 现在可以访问 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

后续

感谢您支持 Elysia 并对这个项目感兴趣。

此次发布带来了更好的 DX,并希望提供您使用 Bun 编写优秀软件所需的一切。

我们现在有一个 Discord 服务器,您可以在那里询问关于 Elysia 的任何问题,或者只是闲聊放松——欢迎每个人。

有了这些精彩的工具,我们很兴奋看到您将构建什么惊人的软件。

不成为那些某人绘制的图像的一部分

不在那场由他人选择的表演中前进

你和我,活着来书写我们的故事

绝不会让你孤独,从你身边消失

Elysia: Ergonomic Framework for Humans