Skip to content

Elysia 0.2 - 祝福

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

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

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

延迟 / 懒加载模块

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

这使得插件注册可以延期,并在 Elysia 服务器启动后逐步应用,从而在无服务器/边缘环境中实现尽可能快的启动时间。

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

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

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

app.use(plugin)

懒加载

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

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

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

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

延迟插件和懒加载模块将直接提供所有类型推断。

参考模型

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

可用模式列表带来了自动补全、完整的类型推断和您对内联模式的期望的验证。

要使用参考模型,首先使用 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

参考也会处理您预期的验证。

简而言之,它与内联模式相同,但现在您只需输入模式名称即可处理验证和类型,而不是一长串导入。

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] 返回多个响应状态。

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 中的所有模式,允许返回其中一种类型。

返回类型也在 Swagger 的响应中报告。

更快的类型推断

随着 Elysia 0.1 探索使用类型推断以改善开发者体验,我们发现有时更新类型推断需要很长时间,因为重的类型推断和低效的自定义泛型。

现在 Elysia 0.2 针对更快的类型推断进行了优化,防止重的类型解包的重复,导致更新类型和推断的性能更好。

生态系统

Elysia 0.2 启用异步插件和延迟模块,许多之前不可能的新插件成为现实。

例如:

  • Elysia 静态插件,具有非阻塞能力
  • Eden,支持多个响应的联合类型推断
  • 新 Elysia Apollo 插件

重要改进:

  • onRequestonParse 现在可以访问 PreContext
  • 默认支持 application/x-www-form-urlencoded
  • 请求体解析器现在解析具有额外属性的 content-type,例如 application/json;charset=utf-8
  • 解码 URI 参数路径参数
  • 如果没有安装 Elysia,Eden 现在会报告错误
  • 跳过现有模型和装饰器的声明

破坏性更改:

  • onParse 现在接受 (context: PreContext, contentType: string) 而不是 (request: Request, contentType: string)
    • 迁移时,请将 .request 添加到上下文以访问 Request

之后

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

此版本带来了更好的开发体验,希望让您能够使用 Bun 编写出色的软件。

现在我们有了 Discord 服务器,您可以在此询问有关 Elysia 的任何问题,或者只是放松一下,也是非常欢迎的。

借助这些优秀的工具,我们期待看到您将构建出什么精彩的软件。

不要成为别人描绘的那些形象的一部分

不要在别人选择的展示中前进

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

永远不会让你孤单,远离你的身边