Vafast
2,454,631 reqs/sExpress
113,117
Measured in requests/second. Result from TechEmpower Benchmark Round 22 (2023-10-17) in PlainText

本指南适用于希望了解 Express 与 Vafast 之间差异的 Express 用户,包括语法,以及如何通过示例将应用程序从 Express 迁移到 Vafast。
Express 是一个流行的 Node.js 网络框架,广泛用于构建 Web 应用程序和 API。因其简单性和灵活性而闻名。
Vafast 是一个专为 Bun 运行时设计的高性能 Web 框架,专注于类型安全、中间件系统和性能优化。设计时强调简单性和开发者友好,提供完整的 TypeScript 支持。
由于专为 Bun 运行时优化和智能路由匹配算法,Vafast 在性能上相比 Express 有显著提高。
113,117
Measured in requests/second. Result from TechEmpower Benchmark Round 22 (2023-10-17) in PlainText
Express 和 Vafast 有类似的路由语法,但 Vafast 使用配置对象的方式定义路由,提供更好的类型安全和中间件支持。
import express from 'express'
const app = express()
app.get('/', (req, res) => {
res.send('Hello World')
})
app.post('/id/:id', (req, res) => {
res.status(201).send(req.params.id)
})
app.listen(3000)Express 使用
req和res作为请求和响应对象
import { Server, defineRoutes, createHandler } from 'vafast'
const routes = defineRoutes([
{
method: 'GET',
path: '/',
handler: createHandler(() => 'Hello World')
},
{
method: 'POST',
path: '/id/:id',
handler: createHandler(({ params }) => {
return { id: params.id }
})
}
])
const server = new Server(routes)
export default { fetch: server.fetch }Vafast 使用配置对象定义路由,支持类型安全和中间件
Express 使用链式方法调用:
app.get('/users', (req, res) => { ... })
app.post('/users', (req, res) => { ... })Vafast 使用配置对象数组:
const routes = defineRoutes([
{
method: 'GET',
path: '/users',
handler: createHandler(() => { ... })
},
{
method: 'POST',
path: '/users',
handler: createHandler(() => { ... })
}
])Express 使用 req 和 res 对象:
app.get('/user/:id', (req, res) => {
const id = req.params.id
const query = req.query
res.json({ id, query })
})Vafast 使用解构参数:
{
method: 'GET',
path: '/user/:id',
handler: createHandler(({ params, query }) => {
return { id: params.id, query }
})
}Express 使用 app.use() 和路由级中间件:
app.use(loggingMiddleware)
app.get('/admin', authMiddleware, (req, res) => {
res.send('Admin Panel')
})Vafast 支持全局和路由级中间件:
const server = new Server(routes)
server.use(loggingMiddleware)
const routes = defineRoutes([
{
method: 'GET',
path: '/admin',
handler: createHandler(() => 'Admin Panel'),
middleware: [authMiddleware]
}
])Express 使用错误处理中间件:
app.use((err, req, res, next) => {
console.error(err.stack)
res.status(500).send('Something broke!')
})Vafast 支持中间件链中的错误处理:
const errorHandler = async (req: Request, next: () => Promise<Response>) => {
try {
return await next()
} catch (error) {
return new Response(
JSON.stringify({ error: error.message }),
{ status: 500 }
)
}
}bun add vafast将 Express 的路由定义转换为 Vafast 的配置对象格式:
// Express 风格
app.get('/api/users', (req, res) => {
const users = getUsers()
res.json(users)
})
// Vafast 风格
{
method: 'GET',
path: '/api/users',
handler: createHandler(() => {
return getUsers()
})
}将 Express 中间件转换为 Vafast 中间件格式:
// Express 中间件
const authMiddleware = (req, res, next) => {
const token = req.headers.authorization
if (!token) {
return res.status(401).send('Unauthorized')
}
next()
}
// Vafast 中间件
const authMiddleware = async (req: Request, next: () => Promise<Response>) => {
const token = req.headers.get('authorization')
if (!token) {
return new Response('Unauthorized', { status: 401 })
}
return await next()
}// Express 错误处理
app.use((err, req, res, next) => {
res.status(500).json({ error: err.message })
})
// Vafast 错误处理
const errorHandler = async (req: Request, next: () => Promise<Response>) => {
try {
return await next()
} catch (error) {
return new Response(
JSON.stringify({ error: error.message }),
{ status: 500 }
)
}
}import express from 'express'
import cors from 'cors'
import helmet from 'helmet'
const app = express()
app.use(cors())
app.use(helmet())
app.use(express.json())
app.get('/users', (req, res) => {
const users = getUsers()
res.json(users)
})
app.post('/users', (req, res) => {
const user = createUser(req.body)
res.status(201).json(user)
})
app.get('/users/:id', (req, res) => {
const user = getUserById(req.params.id)
if (!user) {
return res.status(404).json({ error: 'User not found' })
}
res.json(user)
})
app.listen(3000)import { Server, defineRoutes, createHandler } from 'vafast'
import { cors } from '@vafast/cors'
import { helmet } from '@vafast/helmet'
const routes = defineRoutes([
{
method: 'GET',
path: '/users',
handler: createHandler(() => {
return getUsers()
})
},
{
method: 'POST',
path: '/users',
handler: createHandler(({ body }) => {
return createUser(body)
})
},
{
method: 'GET',
path: '/users/:id',
handler: createHandler(({ params }) => {
const user = getUserById(params.id)
if (!user) {
return new Response(
JSON.stringify({ error: 'User not found' }),
{ status: 404 }
)
}
return user
})
}
])
const server = new Server(routes)
server.use(cors())
server.use(helmet())
export default { fetch: server.fetch }| 特性 | Express | Vafast |
|---|---|---|
| 类型安全 | ❌ 需要额外配置 | ✅ 完整的 TypeScript 支持 |
| 性能 | ⚠️ 中等 | 🚀 高性能 |
| 中间件系统 | ✅ 成熟 | ✅ 灵活可扩展 |
| 路由定义 | ⚠️ 链式调用 | ✅ 配置对象 |
| 错误处理 | ✅ 中间件方式 | ✅ 中间件链 |
| Bun 支持 | ❌ 需要适配 | ✅ 原生支持 |
现在您已经了解了如何从 Express 迁移到 Vafast,建议您:
如果您在迁移过程中遇到任何问题,欢迎在我们的 GitHub Issues 社区寻求帮助。