logo
0
0
WeChat Login
wjk<wangjikun3@163.com>
feat(Post): 添加count方法返回固定值 refactor: 优化类型定义和代码格式 chore: 添加biome作为lint工具并配置 refactor(controller): 简化index方法返回逻辑

Bun-Crane: 轻量级Bun Web框架

项目概述

Bun-Crane 是一个专为Bun JavaScript运行时设计的轻量级Web框架。它提供了简洁直观的API,支持装饰器路由、中间件、依赖注入和数据验证等功能,帮助开发者快速构建高性能的Web应用。

主要特性

  • 装饰器路由:使用TypeScript装饰器定义API路由和控制器
  • 中间件支持:灵活的中间件机制,支持全局和路径级中间件
  • 依赖注入:通过@Inject@Provide装饰器实现简单的依赖注入
  • 数据验证:集成Zod进行请求数据验证
  • 文件系统路由:支持类似Next.js的文件系统路由方式
  • WebSocket支持:内置WebSocket功能
  • 路径参数:支持URL路径参数解析

安装说明

前提条件

  • Bun运行时环境
  • TypeScript 5.0+

安装步骤

# 使用Bun安装 bun add bun-crane

快速开始

基本用法

  1. 创建一个简单的应用入口文件:
// index.ts import { App } from 'bun-crane' const app = await App.create('./demo') app.listen()
  1. 创建控制器:
// demo/controller/home.ts import { EventContext, Controller, Get, Post } from 'bun-crane' @Controller('/home') export class Home { @Get('/') async index(ctx: EventContext) { return { code: 0, msg: 'success', data: { name: 'Bun-Crane' } } } @Post('/add') async add(ctx: EventContext) { return ctx.body } }
  1. 创建服务:
// demo/service/Post.ts import { Provide } from 'bun-crane' @Provide('Post') export class Post { name = "post" add() { console.log('Post add', this.name) } }
  1. 创建中间件:
// demo/middleware/log.ts import { definePathMiddleware } from "bun-crane" export default definePathMiddleware({ '/home': async (context) => { console.log('Request received') let ret = await context.next() console.log('Response sent') return ret } })
  1. 创建页面路由:
// demo/page/index.ts import { defineHandler } from "bun-crane" export default defineHandler((context) => { return new Response('首页') })
  1. 运行应用:
bun run index.ts

API文档

核心类

App类

应用主类,用于创建和配置Web服务器。

// 创建应用实例 const app = await App.create('./demo') // 或手动创建 const app = new App() await app.service('./demo/service') await app.middleware('./demo/middleware') await app.controller('./demo/controller') await app.page('./demo/page')
主要方法
  • listen(options?: ServerOptions): 启动服务器
  • use(path: string | Middleware, middleware?: Middleware): 添加中间件
  • get/post/put/delete/patch/head/options(path: string, handler: Handler): 注册路由处理器
  • ws(path: string, handler: WebSocketHandler): 配置WebSocket
  • onError(error: (err: Error) => Response): 设置错误处理器

装饰器

控制器装饰器

  • @Controller(path?: string): 将类标记为控制器并设置基础路径
  • @Get(path: string): 注册GET路由
  • @Post(path: string): 注册POST路由
  • @Put(path: string): 注册PUT路由
  • @Delete(path: string): 注册DELETE路由

依赖注入装饰器

  • @Provide(key?: string): 将类标记为可注入服务
  • @Inject(key?: string): 注入依赖服务

验证装饰器

  • @Validate(zodSchema: z.ZodSchema): 验证请求体数据

上下文对象 (EventContext)

每个路由处理器都会接收一个EventContext对象,包含以下属性和方法:

  • req: Bun请求对象
  • params: URL路径参数
  • body: 请求体数据
  • state: 用于在请求处理过程中存储状态数据
  • cookies: Cookie映射
  • env: 环境变量
  • next(): 调用下一个中间件或处理器

中间件系统

Bun-Crane提供了灵活的中间件系统,支持全局中间件和路径级中间件。

定义中间件

// 定义全局中间件 import { defineMiddleware } from 'bun-crane' export default defineMiddleware(async (context) => { console.log('Global middleware') return await context.next() })
// 定义路径中间件 import { definePathMiddleware } from 'bun-crane' export default definePathMiddleware({ '/api': async (context) => { console.log('API middleware') return await context.next() }, '/admin': async (context) => { console.log('Admin middleware') return await context.next() } })

数据验证

Bun-Crane集成了Zod用于请求数据验证。

定义验证模式

// validate/post.ts import { z } from 'zod' export const PostSchema = z.object({ title: z.coerce.string('标题必填').min(1, '标题不能为空'), content: z.coerce.string('内容必填').min(1, '内容不能为空') })

使用验证

// controller/post.ts import { Controller, Post, Validate, EventContext } from 'bun-crane' import { PostSchema } from '../validate/post' @Controller('/posts') export class PostController { @Post('/create') @Validate(PostSchema) async create(ctx: EventContext) { // ctx.body 已通过验证 return { success: true, data: ctx.body } } }

文件系统路由

Bun-Crane支持类似Next.js的文件系统路由。

基本路由

// page/index.ts - 对应 / 路径 export default (context) => { return new Response('首页') }

方法特定路由

// page/users.ts export const onRequestGET = (context) => { return Response.json([{ id: 1, name: 'User 1' }]) } export const onRequestPOST = (context) => { return Response.json({ success: true }) }

WebSocket支持

Bun-Crane内置WebSocket支持。

// page/_websocket.ts import { defineWebSocketHandler } from 'bun-crane' export default defineWebSocketHandler({ message(ws, message) { // 处理收到的消息 console.log('收到消息:', message) // 发送消息给客户端 ws.send('已收到消息: ' + message) }, open(ws) { // 新连接建立时 console.log('新连接建立') }, close(ws) { // 连接关闭时 console.log('连接关闭') } })

依赖注入

Bun-Crane提供简单的依赖注入机制。

定义服务

// service/UserService.ts import { Provide } from 'bun-crane' @Provide('UserService') export class UserService { findAll() { return [{ id: 1, name: 'User 1' }] } }

注入服务

// controller/user.ts import { Controller, Get, Inject, EventContext } from 'bun-crane' @Controller('/users') export class UserController { @Inject('UserService') userService: any @Get('/') async index(ctx: EventContext) { return this.userService.findAll() } }

错误处理

可以自定义全局错误处理器。

app.onError((err) => { console.error('发生错误:', err) return new Response(`错误: ${err.message}`, { status: 500 }) })

示例项目

项目中包含一个完整的示例应用,位于demo/目录下。示例展示了:

  • 控制器定义和路由
  • 服务定义和依赖注入
  • 中间件使用
  • 数据验证
  • 页面路由

要运行示例:

bun run dev

注意事项

  1. 确保使用TypeScript 5.0+版本以支持装饰器语法
  2. 项目依赖Bun运行时环境,无法在Node.js环境下运行
  3. 使用装饰器时,确保在tsconfig.json中启用了装饰器支持:
{ "compilerOptions": { "experimentalDecorators": true, "emitDecoratorMetadata": true } }

许可证

该项目采用MIT许可证 - 详情请查看LICENSE文件

About

Bun-Crane 是一个基于 Bun 运行时的轻量级 Web 框架,提供了简洁的 API 来构建 HTTP 服务器和 WebSocket 服务。它支持中间件机制、Next.js 风格的文件系统路由以及多种路由定义方式,旨在为开发者提供一个高效、易用的 Web 开发体验。

624.00 KiB
0 forks0 stars1 branches0 TagREADMEMIT license
Language
TypeScript100%