Skip to content

Elysia 0.3 - 大地の閾を探して [Looking for Edge of Ground]

碎玻璃片漂浮在深渊中

以 Camellia 的歌曲「大地の閾を探して [Looking for Edge of Ground]」 ft. 初音未来 命名,是我最喜欢的 Camellia 专辑「U.U.F.O」的最后一曲。这首歌对我个人影响深远,因此我不会轻视这个名字。

这是最具挑战性的更新,带来了迄今为止最大的 Elysia 发布,重新思考和重新设计了 Elysia 架构,以实现高可扩展性,同时尽量减少破坏性更改。

我很高兴地宣布 Elysia 0.3 的发布候选版本,令人兴奋的新功能即将到来。

Elysia Fn

介绍 Elysia Fn,可以在前端运行任何后端函数,具备完整的自动补全和类型支持。

为了快速开发,Elysia Fn 允许你“暴露”后端代码,以便从前端调用,具备完整的类型安全、自动补全、原始代码注释和“点击定义”功能,帮助你加速开发进程。

你可以通过 Eden Fn 将 Elysia Fn 与 Eden 结合使用,以实现完全的类型安全。

权限

你可以限制函数的允许或拒绝范围,检查授权头和其他头字段,验证参数,或以编程方式限制密钥访问。

密钥检查支持类型安全和自动补全所有可能的函数,因此你不会错过某些功能或意外输入错误的名称。 Narrowed Key

以编程方式缩小属性范围也会缩小参数的类型,换句话说,实现了完全的类型安全。 Narrowed Params

技术细节

在技术细节上,Elysia Fn 使用 JavaScript 的 Proxy 来捕获对象属性和参数,以创建批量请求发送到服务器进行处理,并在网络上返回值。 Elysia Fn 扩展了 superjson,允许在 JSON 数据中解析 JavaScript 的原生类型,如 Error、Map、Set 和 undefined。

Elysia Fn 支持多种用例,例如在客户端 Nextjs 应用中访问 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 在插件注册时不再那么严格,允许你在没有完全类型补全的情况下注册插件。 内联的 use 函数现在推断父类型,而嵌套守卫可以更准确地引用父类的模型类型。

类型声明现在也可以构建和导出。

经过类型重构,Elysia 对 TypeScript 的理解远超以前,类型补全的速度将显著加快,我们鼓励你尝试一下,看看有多快。 有关更多细节,请参见这条 Twitter 线程

文件上传

感谢 Bun 0.5.7,Elysia 0.3 中默认实现并启用了表单数据 multipart/formdata

为上传文件定义类型补全和验证后,Elysia.t 现在通过 FileFiles 扩展 TypeBox 以进行文件验证。

验证包括检查文件类型,并自动补全标准文件大小,文件的最小和最大大小,以及每个字段的文件总数。

Elysia 0.3 还引入了 schema.contentType,以明确验证传入请求类型,在验证数据之前严格检查头信息。

OpenAPI Schema 3.0.x

在 Elysia 0.3 中,Elysia 现在默认使用 OpenAPI schema 3.0.x,以更好地声明 API 定义,并根据内容类型更好地支持多种类型。

schema.details 现已更新为 OpenAPI 3.0.x,Elysia 还更新了 Swagger 插件,以匹配 OpenAPI 3.0.x,利用 OpenAPI 3 和 Swagger 中的新功能,尤其是文件上传方面。

Eden 重构

为了支持更高的 Elysia 需求,支持 Elysia Fn、Rest 等,Eden 被重新设计以与新架构扩展。

Eden 现在导出 3 类型的函数。

  • Eden Treaty eden/treaty: 原始的 Eden 语法
  • Eden Fn eden/fn: 访问 Elysia Fn
  • Eden Fetch eden/fetch: 类似 fetch 的语法,适用于复杂的 Elysia 类型 (> 1,000 路由 / Elysia 实例)

通过重构类型定义和支持 Elysia Eden,Eden 现在在推断服务器类型时显著更快和更好。

自动补全速度更快,使用的资源比以往更少,实际上,Eden 的类型声明几乎重构了 100%,以减少大小和推断时间,使其在眨眼之间支持超过 350 条路由的自动补全(约 0.26 秒)。

为了使 Elysia Eden 完全类型安全,利用 Elysia 对 TypeScript 更好的理解,Eden 现在可以根据响应状态缩小类型,使你能够在任何条件下准确捕获类型。 Narrowed error.webp

显著改进:

  • 添加字符串格式:'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 标记为可选的 peerDenpendencies

修复:

  • Raikiri 0.2 在未找到时抛出错误
  • t.File 的联合响应无法工作
  • Swagger 中未定义定义
  • 在分组插件中缺少详细信息
  • 分组插件无法编译架构
  • 因为 EXPOSED 是私有属性,分组不能导出
  • 多个 cookies 不将 content-type 设置为 application/json
  • 使用 fn.permissionEXPOSED 未导出
  • .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 创建你们要构建的精彩事物。

我们有专门的 Discord 服务器 支持 Elysia。欢迎随时打招呼或畅所欲言。

感谢您对 Elysia 的支持。

在永无止境的天幕下

在没有名字的悬崖上

我只是嚎叫

希望那无尽的回响能传达到你

我相信某天,我会站在大地的边缘

(直到那天我能回到你身边告诉你)