我们的原则
设计以人为本
我们的目标是设计一个符合人体工程学、合理且高效的工作框架,即使是初学者也能轻松使用。
设计以避免不必要的复杂性,并为您简化类型复杂性,以便您专注于构建。
一个感觉就像 JavaScript 的框架
import { Elysia, file } from 'elysia'
new Elysia()
.get('/', '你好,世界')
.get('/image', file('mika.webp'))
.get('/stream', function* () {
yield '你好'
yield '世界'
})
.ws('/realtime', {
message(ws, message) {
ws.send('got:' + message)
}
})
.listen(3000)21x
比 Express 更快
6x
比 Fastify 更快
Elysia Bun
2,454,631 reqs/sGin Go
676,019
Spring Java
506,087
Fastify Node
415,600
Express Node
113,117
Nest Node
105,064
以每秒请求次数进行测量。数据来源于官方 TechEmpower 基准测试 第 22 轮(2023-10-17)的 PlainText 结果。
这就是关于
唯一事实来源
Schema 是整个服务器的唯一事实来源。从 请求验证、类型推断、OpenAPI 文档, 客户端-服务器通信。Elysia 的每个部分都设计为 完整的类型完整性。
请求验证
Elysia 会根据你的 schema 验证并规范请求,确保只有有效数据到达你的处理程序。
Elysia 还会 直接从你的 schema 推断类型,确保你的处理程序在运行时和类型级别始终接收正确的类型。
import { Elysia, t } from 'elysia'
new Elysia()
.put('/', ({ body: { file } }) => file, {
body: t.Object({
file: t.File({ type: 'image' })
})
})高级类型推断
Elysia 的每个部分都设计为完全类型安全,拥有比其他任何框架都更先进的类型推断。
Elysia 还会直接从你的 schema 推断类型,为模型提供自动补全,或者使用你自己的自定义属性扩展 Elysia,同时确保完整的类型完整性。
import { Elysia } from 'elysia'
import { auth } from './auth'
new Elysia()
.use(auth)
.get('/profile', ({ user }) => user, {
auth: true
})import { Elysia, t } from 'elysia'
export const auth = new Elysia()
.macro('auth', {
cookie: t.Object({
ssid: t.String()
}),
resolve({ cookie, status }) {
if(!cookie.ssid.value) return status(401)
return {
user: cookie.ssid.value
}
}
})客户端-服务器通信
Elysia 可以像 tRPC 一样在客户端和服务器之间共享类型,确保双方始终保持同步。
更进一步,Elysia 还处理多个 HTTP 状态,并使用判别联合进行排列,允许你 轻松处理所有可能的错误情况
import { treaty } from '@elysia/eden'
import type { App } from 'server'
const api = treaty<App>('api.elysiajs.com')
const { data } = await api.profile.patch({
age: 21
})OpenAPI 文档
Elysia 只需一行代码 即可根据您的模式生成 OpenAPI 文档,确保您的 API 文档始终准确且最新。
import { Elysia } from 'elysia'
import { openapi } from '@elysia/openapi'
new Elysia()
.use(openapi())
介绍我们迄今为止最强大的功能
TypeScript 转 OpenAPI
Elysia 可以直接从您的 TypeScript 代码生成 OpenAPI 规范 无需任何注释,无需任何配置和 CLI 运行。
允许您将实际代码从 任何库 如 Prisma、Drizzle 以及所有 TypeScript 库转换为您自己的 API 文档。
import { Elysia } from 'elysia'
import { openapi, fromTypes } from '@elysia/openapi'
export const app = new Elysia()
.use(
openapi({
// ↓ 魔法发生的地方
references: fromTypes()
})
)带上你自己的 验证器
支持 标准模式
Elysia 提供了强大的内置验证,但您也可以 带上您喜欢的验证器,如 Zod, Valibot, ArkType, Effect 等等
无缝支持类型推断和 OpenAPI。您会感到宾至如归。
import { Elysia, t } from 'elysia'
new Elysia()
// 尝试悬停 body ↓
.post('/user', ({ body }) => body, {
body: t.Object({
name: t.Literal('SaltyAom'),
age: t.Number(),
friends: t.Array(t.String())
})
})import { Elysia } from 'elysia'
import { z } from 'zod'
new Elysia()
// 尝试悬停 body ↓
.post('/user', ({ body }) => body, {
body: z.object({
name: z.literal('SaltyAom'),
age: z.number(),
friends: z.array(z.string())
})
})import { Elysia } from 'elysia'
import * as v from 'valibot'
new Elysia()
// 尝试悬停 body ↓
.post('/user', ({ body }) => body, {
body: v.object({
name: v.literal('SaltyAom'),
age: v.number(),
friends: v.array(v.string())
})
})import { Elysia } from 'elysia'
import { type } from 'arktype'
new Elysia()
// 尝试悬停 body ↓
.post('/user', ({ body }) => body, {
body: type({
name: '"Elysia"',
age: 'number',
friends: 'string[]'
})
})import { Elysia } from 'elysia'
import { Schema } from 'effect'
new Elysia()
// 尝试悬停 body ↓
.post('/user', ({ body }) => body, {
body: Schema.standardSchemaV1(
Schema.Struct({
name: Schema.Literal('Elysia'),
age: Schema.Number,
friends: Schema.Array(Schema.String)
})
)
})11.88ms
POST /character/:id/chat
Playback
对于 DevOps
OpenTelemetry
Elysia 原生支持 OpenTelemetry。监控功能内置,因此您可以轻松监控您的服务,无论平台如何。
import { treaty } from '@elysia/eden'
import type { App } from 'server'
const api = treaty<App>('api.elysiajs.com')
const { data } = await api.profile.patch({
age: 21
})对于前端
端到端类型安全
像 tRPC 一样,Elysia 提供从后端到前端的类型安全,而无需代码生成。前端和后端之间的交互在编译时和运行时都经过类型检查。
充满信心地 进行测试
类型安全带有 自动完成功能
Elysia 提供了一个类型安全层,用于与您的服务器进行交互和测试,涵盖从路由到参数的各个环节。
借助自动补全功能,您可以轻松为服务器编写测试,无需任何繁琐操作。
import { treaty } from '@elysia/eden'
import { app } from './index'
import { test, expect } from 'bun:test'
const server = treaty(app)
test('应处理重复用户', async () => {
const { error } = await server.user.put({ username: 'mika',
})
expect(error?.value).toEqual({
success: false,
message: '用户名已被占用'
})
})
你的代码, 你的运行时
Elysia 针对 Bun 进行了优化,
但 不锁定于 Bun
Elysia 构建于 Web 标准之上
允许您在任何地方运行 Elysia
人们怎么说
由你实现
Elysia 不属于任何组织 ,由志愿者和社区驱动。 Elysia 的实现得益于这些出色的赞助商。
Individual Sponsors 💕
感谢您让 Elysia 成为可能
我们只能全职开发 Elysia,感谢您的支持。
来自我们社区的爱
Ask about Elysia
Elysia
Ergonomic Framework for Humans
Speed
Top Performance
Type Safety
Best in class
Developer Experience
Exceptional
OpenAPI Support
One of a kind





























