This is the tiny developer documentation for Hono. # Start of Hono documentation # Hono Hono - _**在日语中意为火焰🔥**_ - 是一个小型、简单且超快的 Web 框架,基于 Web Standards 构建。 它可以在任何 JavaScript 运行时上运行:Cloudflare Workers、Fastly Compute、Deno、Bun、Vercel、Netlify、AWS Lambda、Lambda@Edge 和 Node.js。 快速,但不止于快速。 ```ts twoslash import { Hono } from 'hono' const app = new Hono() app.get('/', (c) => c.text('Hono!')) export default app ``` ## 快速开始 只需运行: ::: code-group ```sh [npm] npm create hono@latest ``` ```sh [yarn] yarn create hono ``` ```sh [pnpm] pnpm create hono@latest ``` ```sh [bun] bun create hono@latest ``` ```sh [deno] deno init --npm hono@latest ``` ::: ## 特性 - **超快** 🚀 - `RegExpRouter` 路由器非常快。不使用线性循环。快速。 - **轻量** 🪶 - `hono/tiny` 预设小于 14kB。Hono 零依赖,仅使用 Web Standards。 - **多运行时** 🌍 - 可在 Cloudflare Workers、Fastly Compute、Deno、Bun、AWS Lambda 或 Node.js 上运行。相同的代码在所有平台上都能运行。 - **功能齐全** 🔋 - Hono 内置了中间件、自定义中间件、第三方中间件和辅助函数。功能齐全。 - **愉悦的开发体验** 😃 - 超干净的 API。一流的 TypeScript 支持。现在,我们有了"类型"。 ## 使用场景 Hono 是一个简单的 Web 应用程序框架,类似于 Express,不包含前端。 但它可以运行在 CDN 边缘,结合中间件可以构建更大的应用程序。 以下是一些使用场景示例。 - 构建 Web API - 后端服务器代理 - CDN 前端 - 边缘应用程序 - 库的基础服务器 - 全栈应用程序 ## 谁在使用 Hono? | 项目 | 平台 | 用途 | | ---------------------------------------------------------------------------------- | ------------------ | ------------------------------------------------------------------------------------------------------------ | | [cdnjs](https://cdnjs.com) | Cloudflare Workers | 免费开源的 CDN 服务。_Hono 用于 API 服务器_。 | | [Cloudflare D1](https://www.cloudflare.com/developer-platform/d1/) | Cloudflare Workers | 无服务器 SQL 数据库。_Hono 用于内部 API 服务器_。 | | [Cloudflare Workers KV](https://www.cloudflare.com/developer-platform/workers-kv/) | Cloudflare Workers | 无服务器键值数据库。_Hono 用于内部 API 服务器_。 | | [BaseAI](https://baseai.dev) | 本地 AI 服务器 | 带记忆的无服务器 AI 代理管道。用于 Web 的开源代理 AI 框架。_使用 Hono 的 API 服务器_。 | | [Unkey](https://unkey.dev) | Cloudflare Workers | 开源 API 认证和授权。_Hono 用于 API 服务器_。 | | [OpenStatus](https://openstatus.dev) | Bun | 开源网站和 API 监控平台。_Hono 用于 API 服务器_。 | | [Deno Benchmarks](https://deno.com/benchmarks) | Deno | 基于 V8 构建的安全 TypeScript 运行时。_Hono 用于基准测试_。 | | [Clerk](https://clerk.com) | Cloudflare Workers | 开源用户管理平台。_Hono 用于 API 服务器_。 | 以及以下项目: - [Drivly](https://driv.ly/) - Cloudflare Workers - [repeat.dev](https://repeat.dev/) - Cloudflare Workers 想看更多?查看 [谁在生产环境中使用 Hono?](https://github.com/orgs/honojs/discussions/1510)。 ## 1 分钟了解 Hono 使用 Hono 创建 Cloudflare Workers 应用程序的演示。 ![一个 gif,展示使用 Hono 快速创建应用程序并快速迭代。](/images/sc.gif) ## 超快 **Hono 是最快的**,与其他 Cloudflare Workers 路由器相比。 ``` Hono x 402,820 ops/sec ±4.78% (80 runs sampled) itty-router x 212,598 ops/sec ±3.11% (87 runs sampled) sunder x 297,036 ops/sec ±4.76% (77 runs sampled) worktop x 197,345 ops/sec ±2.40% (88 runs sampled) Fastest is Hono ✨ Done in 28.06s. ``` 查看 [更多基准测试](/docs/concepts/benchmarks)。 ## 轻量 **Hono 非常小**。使用 `hono/tiny` 预设,压缩后大小**小于 14KB**。有许多中间件和适配器,但仅在使用时才会打包。作为参考,Express 的大小为 572KB。 ``` $ npx wrangler dev --minify ./src/index.ts ⛅️ wrangler 2.20.0 -------------------- ⬣ Listening at http://0.0.0.0:8787 - http://127.0.0.1:8787 - http://192.168.128.165:8787 Total Upload: 11.47 KiB / gzip: 4.34 KiB ``` ## 多个路由器 **Hono 有多个路由器**。 **RegExpRouter** 是 JavaScript 世界中最快的路由器。它使用调度前创建的单个大型 Regex 匹配路由。使用 **SmartRouter**,它支持所有路由模式。 **LinearRouter** 注册路由非常快,因此适合每次初始化应用程序的环境。**PatternRouter** 简单地添加和匹配模式,使其变小。 查看 [有关路由的更多信息](/docs/concepts/routers)。 ## Web Standards 由于使用 **Web Standards**,Hono 可以在许多平台上运行。 - Cloudflare Workers - Cloudflare Pages - Fastly Compute - Deno - Bun - Vercel - AWS Lambda - Lambda@Edge - 其他 通过使用 [Node.js 适配器](https://github.com/honojs/node-server),Hono 可以在 Node.js 上运行。 查看 [有关 Web Standards 的更多信息](/docs/concepts/web-standard)。 ## 中间件和辅助函数 **Hono 有许多中间件和辅助函数**。这使得"少写代码,多做事情"成为现实。 开箱即用,Hono 提供以下中间件和辅助函数: - [基本认证](/docs/middleware/builtin/basic-auth) - [Bearer 认证](/docs/middleware/builtin/bearer-auth) - [请求体限制](/docs/middleware/builtin/body-limit) - [缓存](/docs/middleware/builtin/cache) - [压缩](/docs/middleware/builtin/compress) - [上下文存储](/docs/middleware/builtin/context-storage) - [Cookie](/docs/helpers/cookie) - [CORS](/docs/middleware/builtin/cors) - [ETag](/docs/middleware/builtin/etag) - [html](/docs/helpers/html) - [JSX](/docs/guides/jsx) - [JWT 认证](/docs/middleware/builtin/jwt) - [日志记录器](/docs/middleware/builtin/logger) - [语言](/docs/middleware/builtin/language) - [Pretty JSON](/docs/middleware/builtin/pretty-json) - [安全头](/docs/middleware/builtin/secure-headers) - [SSG](/docs/helpers/ssg) - [流式传输](/docs/helpers/streaming) - [GraphQL 服务器](https://github.com/honojs/middleware/tree/main/packages/graphql-server) - [Firebase 认证](https://github.com/honojs/middleware/tree/main/packages/firebase-auth) - [Sentry](https://github.com/honojs/middleware/tree/main/packages/sentry) - 其他! 例如,使用 Hono 只需几行代码即可添加 ETag 和请求日志记录: ```ts import { Hono } from 'hono' import { etag } from 'hono/etag' import { logger } from 'hono/logger' const app = new Hono() app.use(etag(), logger()) ``` 查看 [有关中间件的更多信息](/docs/concepts/middleware)。 ## 开发体验 Hono 提供愉悦的"**开发体验**"。 得益于 `Context` 对象,可以轻松访问请求/响应。 此外,Hono 使用 TypeScript 编写。Hono 拥有"**类型**"。 例如,路径参数将是字面量类型。 ![截图显示 Hono 在使用 URL 参数时具有适当的字面量类型。URL "/entry/:date/:id" 允许请求参数为 "date" 或 "id"](/images/ss.png) 此外,Validator 和 Hono Client `hc` 启用 RPC 模式。在 RPC 模式中, 你可以使用喜欢的验证器(如 Zod),轻松与客户端共享服务器端 API 规范,并构建类型安全的应用程序。 查看 [Hono 技术栈](/docs/concepts/stacks)。 # Best Practices Hono 非常灵活。你可以随心所欲地编写应用程序。然而,有一些最佳实践最好遵循。 ## Don't make "Controllers" when possible 在可能的情况下,你不应该创建"Ruby on Rails-like Controllers"。 ```ts // 🙁 // 一个 RoR-like Controller const booksList = (c: Context) => { return c.json('list books') } app.get('/books', booksList) ``` 问题与类型有关。例如,路径参数无法在 Controller 中推断,除非编写复杂的泛型。 ```ts // 🙁 // 一个 RoR-like Controller const bookPermalink = (c: Context) => { const id = c.req.param('id') // 无法推断路径参数 return c.json(`get ${id}`) } ``` 因此,你不需要创建 RoR-like controllers,应该在路径定义后直接编写 handlers。 ```ts // 😃 app.get('/books/:id', (c) => { const id = c.req.param('id') // 可以推断路径参数 return c.json(`get ${id}`) }) ``` ## `factory.createHandlers()` in `hono/factory` 如果你仍然想创建 RoR-like Controller,使用 `hono/factory` 中的 `factory.createHandlers()`。如果使用这个,类型推断将正常工作。 ```ts import { createFactory } from 'hono/factory' import { logger } from 'hono/logger' // ... // 😃 const factory = createFactory() const middleware = factory.createMiddleware(async (c, next) => { c.set('foo', 'bar') await next() }) const handlers = factory.createHandlers(logger(), middleware, (c) => { return c.json(c.var.foo) }) app.get('/api', ...handlers) ``` ## Building a larger application 使用 `app.route()` 来构建更大的应用程序,而无需创建"Ruby on Rails-like Controllers"。 如果你的应用程序有 `/authors` 和 `/books` 端点,并且你想从 `index.ts` 分离文件,创建 `authors.ts` 和 `books.ts`。 ```ts // authors.ts import { Hono } from 'hono' const app = new Hono() app.get('/', (c) => c.json('list authors')) app.post('/', (c) => c.json('create an author', 201)) app.get('/:id', (c) => c.json(`get ${c.req.param('id')}`)) export default app ``` ```ts // books.ts import { Hono } from 'hono' const app = new Hono() app.get('/', (c) => c.json('list books')) app.post('/', (c) => c.json('create a book', 201)) app.get('/:id', (c) => c.json(`get ${c.req.param('id')}`)) export default app ``` 然后,导入它们并使用 `app.route()` 挂载到路径 `/authors` 和 `/books`。 ```ts // index.ts import { Hono } from 'hono' import authors from './authors' import books from './books' const app = new Hono() // 😃 app.route('/authors', authors) app.route('/books', books) export default app ``` ### If you want to use RPC features 上面的代码在普通用例中效果很好。但是,如果你想使用 `RPC` 功能,你可以通过链式获取正确的类型。 ```ts // authors.ts import { Hono } from 'hono' const app = new Hono() .get('/', (c) => c.json('list authors')) .post('/', (c) => c.json('create an author', 201)) .get('/:id', (c) => c.json(`get ${c.req.param('id')}`)) export default app export type AppType = typeof app ``` 如果你将 `app` 的类型传递给 `hc`,它将获得正确的类型。 ```ts import type { AppType } from './authors' import { hc } from 'hono/client' // 😃 const client = hc('http://localhost') // 正确推断类型 ``` 更多详细信息,请查看 [RPC page](/docs/guides/rpc#using-rpc-with-larger-applications)。 # Create-hono `create-hono` 支持的命令行选项 - 这是运行 `npm create hono@latest`、`npx create-hono@latest` 或 `pnpm create hono@latest` 时运行的项目初始化工具。 > [!NOTE] > **为什么有这个页面?** 安装/快速入门示例通常显示最小的 `npm create hono@latest my-app` 命令。`create-hono` 支持一些有用的标志,你可以传递这些标志来自动化和自定义项目创建(选择 templates、跳过提示、选择包管理器、使用本地缓存等)。 ## Passing arguments: 当你使用 `npm create`(或 `npx`)时,用于初始化脚本的参数必须放在 `--` 之后。`--` 之后的任何内容都会转发给初始化脚本。 ::: code-group ```sh [npm] # 转发参数到 create-hono(npm 需要 `--`) npm create hono@latest my-app -- --template cloudflare-workers ``` ```sh [yarn] # "--template cloudflare-workers" 选择 Cloudflare Workers template yarn create hono my-app --template cloudflare-workers ``` ```sh [pnpm] # "--template cloudflare-workers" 选择 Cloudflare Workers template pnpm create hono@latest my-app --template cloudflare-workers ``` ```sh [bun] # "--template cloudflare-workers" 选择 Cloudflare Workers template bun create hono@latest my-app --template cloudflare-workers ``` ```sh [deno] # "--template cloudflare-workers" 选择 Cloudflare Workers template deno init --npm hono@latest my-app --template cloudflare-workers ``` ::: ## Commonly used arguments | Argument | Description | Example | | :---------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------ | | `--template