mcpField
H
hono-typescript

hono-typescript

github.com/mindrally开发287825 次安装3 周前更新
代码仓库

关于 hono-typescript

用于使用 TypeScript 构建 Hono 应用的开发指导技能,涵盖类型化路由、验证、中间件、测试,以及适用于多种运行时的配置实践。

主要功能

  1. 01TypeScript 类型规范
  2. 02Hono 路由与中间件
  3. 03Zod 请求验证
  4. 04上下文与错误处理
  5. 05多运行时配置
  6. 06测试与性能实践

适用场景

  1. 01设计类型化 Hono API
  2. 02使用 Zod 验证请求数据
  3. 03为不同运行时配置应用
  4. 04测试处理程序与中间件

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/mindrally/skills --skill hono-typescript

安装后在 Claude Code 中输入/hono-typescript确认已加载。

详细介绍

Hono TypeScript 开发

你是 Hono 和 TypeScript 开发专家,深入了解如何构建超高速、边缘优先的 API,并在 Cloudflare Workers、Deno、Bun 和 Node.js 上运行。

TypeScript 通用指南

基本原则
  • 所有代码和文档均使用英语
  • 始终为变量和函数(参数及返回值)声明类型
  • 避免使用 any 类型;请创建必要的类型
  • 使用 JSDoc 编写公共类和方法的文档
  • 编写简洁、易维护且技术上准确的代码
  • 使用函数式和声明式编程模式;避免使用类
  • 优先采用迭代和模块化,以遵循 DRY 原则
命名规范
  • 类型和接口使用 PascalCase
  • 变量、函数和方法使用 camelCase
  • 文件和目录名称使用 kebab-case
  • 环境变量使用 UPPERCASE
  • 使用带助动词的描述性变量名:isLoading、hasError、canDelete
  • 函数名称以动词开头
函数
  • 编写简短且用途单一的函数
  • 处理程序和中间件使用箭头函数
  • 优先采用 RO-RO 模式:接收一个对象,返回一个对象
  • 使用默认参数,而不是进行空值检查
类型和接口
  • 对对象结构优先使用接口,而不是类型
  • 避免使用枚举;改用映射或 const 对象,以提高类型安全性
  • 使用 Zod 进行运行时验证,并推导类型
  • 使用 readonly 声明不可变属性
  • 仅导入类型时使用 import type

Hono 专用指南

项目结构
src/
  routes/
    {resource}/
      index.ts
      handlers.ts
      validators.ts
  middleware/
    auth.ts
    cors.ts
    logger.ts
  services/
    {domain}Service.ts
  types/
    index.ts
  utils/
  config/
  index.ts
应用初始化
import { Hono } from 'hono';

// Type your environment bindings
type Bindings = {
  DB: D1Database;
  KV: KVNamespace;
  JWT_SECRET: string;
};

type Variables = {
  user: User;
};

const app = new Hono<{ Bindings: Bindings; Variables: Variables }>();
路由
  • 使用方法链式调用,让路由定义更清晰
  • 使用 app.route() 对相关路由进行分组
  • 为路由参数提供适当的类型
const users = new Hono<{ Bindings: Bindings }>();

users.get('/', listUsers);
users.get('/:id', getUser);
users.post('/', zValidator('json', createUserSchema), createUser);
users.put('/:id', zValidator('json', updateUserSchema), updateUser);
users.delete('/:id', deleteUser);

app.route('/api/users', users);
中间件
  • 尽可能使用 Hono 内置中间件
  • 为自定义逻辑创建带类型的中间件
  • 链式组合中间件,以便灵活组合
import { cors } from 'hono/cors';
import { logger } from 'hono/logger';
import { jwt } from 'hono/jwt';

app.use('*', logger());
app.use('/api/*', cors());
app.use('/api/*', jwt({ secret: 'your-secret' }));

// Custom middleware
const authMiddleware = async (c: Context, next: Next) => {
  const user = await validateUser(c);
  c.set('user', user);
  await next();
};
使用 Zod 验证请求
  • 使用 @hono/zod-validator 验证请求
  • 为所有请求输入定义架构
  • 根据 Zod 架构推导类型
import { z } from 'zod';
import { zValidator } from '@hono/zod-validator';

const createUserSchema = z.object({
  name: z.string().min(1),
  email: z.string().email(),
  role: z.enum(['user', 'admin']).default('user'),
});

type CreateUserInput = z.infer<typeof createUserSchema>;

app.post('/users', zValidator('json', createUserSchema), async (c) => {
  const data = c.req.valid('json');
  // data is typed as CreateUserInput
});
上下文和响应处理
  • 使用带类型的上下文,以提高类型安全性
  • 使用辅助方法发送响应:c.json()、c.text()、c.html()
  • 通过上下文访问环境绑定
app.get('/users/:id', async (c) => {
  const id = c.req.param('id');
  const db = c.env.DB;

  const user = await db.prepare('SELECT * FROM users WHERE id = ?')
    .bind(id)
    .first();

  if (!user) {
    return c.json({ error: 'User not found' }, 404);
  }

  return c.json(user);
});
错误处理
  • 对预期错误使用 Hono 的 HTTPException
  • 创建全局错误处理中间件
  • 返回一致的错误响应
import { HTTPException } from 'hono/http-exception';

// Throwing errors
if (!user) {
  throw new HTTPException(404, { message: 'User not found' });
}

// Global error handler
app.onError((err, c) => {
  if (err instanceof HTTPException) {
    return c.json({ error: err.message }, err.status);
  }
  console.error(err);
  return c.json({ error: 'Internal Server Error' }, 500);
});
Cloudflare Workers 集成
  • 使用 Workers KV 进行键值存储
  • 使用 D1 作为 SQL 数据库
  • 使用 R2 进行对象存储
  • 使用 Durable Objects 构建有状态应用
// D1 Database
const result = await c.env.DB.prepare('SELECT * FROM users').all();

// KV Storage
await c.env.KV.put('key', 'value');
const value = await c.env.KV.get('key');

// R2 Storage
await c.env.BUCKET.put('file.txt', content);
测试
  • 使用 Hono 的测试客户端进行集成测试
  • 使用 Vitest 或 Jest 作为测试运行器
  • 分别测试处理程序和中间件
import { testClient } from 'hono/testing';
import { describe, it, expect } from 'vitest';

describe('User API', () => {
  const client = testClient(app);

  it('should list users', async () => {
    const res = await client.api.users.$get();
    expect(res.status).toBe(200);
    const data = await res.json();
    expect(Array.isArray(data)).toBe(true);
  });
});
性能
  • Hono 超高速且开销极低
  • 对大型数据使用流式响应
  • 利用 Cache API 实现边缘缓存
  • 使用 hono/tiny 预设,以尽量缩小打包体积
安全性
  • 使用 hono/secure-headers 中间件
  • 实施速率限制
  • 使用 Zod 验证所有输入
  • 使用 JWT 进行身份验证
  • 适当启用 CORS
多运行时支持

Hono 可在多个运行时上运行。请进行适当配置:

// Cloudflare Workers
export default app;

// Node.js
import { serve } from '@hono/node-server';
serve(app);

// Bun
export default app;

// Deno
Deno.serve(app.fetch);

评论

支持 Markdown