关于 hono-typescript
用于使用 TypeScript 构建 Hono 应用的开发指导技能,涵盖类型化路由、验证、中间件、测试,以及适用于多种运行时的配置实践。
主要功能
- 01TypeScript 类型规范
- 02Hono 路由与中间件
- 03Zod 请求验证
- 04上下文与错误处理
- 05多运行时配置
- 06测试与性能实践
适用场景
- 01设计类型化 Hono API
- 02使用 Zod 验证请求数据
- 03为不同运行时配置应用
- 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