我们的原则
设计以人为本
我们的目标是设计一个符合人体工程学、合理且高效的工作框架,即使是初学者也能轻松使用。
设计以避免不必要的复杂性,并为您简化类型复杂性,以便您专注于构建。
一个感觉就像 JavaScript 的框架
import { Elysia, file } from 'elysia'
new Elysia()
.get('/', 'Hello World')
.get('/image', file('mika.webp'))
.get('/stream', function* () {
yield 'Hello'
yield 'World'
})
.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 '@elysiajs/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 '@elysiajs/openapi'
new Elysia()
.use(openapi())
介绍我们迄今为止最强大的功能
TypeScript 转 OpenAPI
Elysia 可以直接从您的 TypeScript 代码生成 OpenAPI 规范 无需任何注释,无需任何配置和 CLI 运行。
允许您将实际代码从 任何库 如 Prisma、Drizzle 以及所有 TypeScript 库转换为您自己的 API 文档。
import { Elysia } from 'elysia'
import { openapi, fromTypes } from '@elysiajs/openapi'
export const app = new Elysia()
.use(
openapi({
// ↓ Where magic happens
references: fromTypes()
})
)带上你自己的 验证器
支持 标准模式
Elysia 提供了强大的内置验证,但您也可以 带上您喜欢的验证器,如 Zod, Valibot, ArkType, Effect 等等
无缝支持类型推断和 OpenAPI。您会感到宾至如归。
import { Elysia, t } from 'elysia'
new Elysia()
// Try hover 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()
// Try hover 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()
// Try hover 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()
// Try hover body ↓
.post('/user', ({ body }) => body, {
body: type({
name: '"Elysia"',
age: 'number',
friends: 'string[]'
})
})import { Elysia } from 'elysia'
import { Schema } from 'effect'
new Elysia()
// Try hover 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 '@elysiajs/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 '@elysiajs/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 的实现得益于这些出色的赞助商。
感谢您让 Elysia 成为可能
我们只能全职开发 Elysia,感谢您的支持。
来自我们社区的爱
Got more questions?
Just Ask!Can I use Zod with Elysia?
Elysia validates incoming request data (params, query, body, headers, cookies, response) before your handler runs.
It ships with a built‑in schema builder (Elysia.t) based on TypeBox, but it also natively supports any “Standard Schema” library – that includes Zod, Valibot, Yup, Joi, ArkType, Effect‑Schema, and many more.
Elysia
Ergonomic Framework for Humans
Speed
Top Performance
Type Safety
Best in class
Developer Experience
Exceptional
OpenAPI Support
One of a kind





























