Hono:构建于 Web 标准之上的极速轻量多运行时 Web 框架
【免费下载链接】honoWeb framework built on Web Standards项目地址: https://gitcode.com/GitHub_Trending/ho/hono
Hono 是一个小而简单、极速的 Web 框架,完全构建在 Web 标准(Web Standards)之上,可用于 Cloudflare Workers、Fastly Compute、Deno、Bun、Vercel、AWS Lambda、Lambda@Edge 和 Node.js 等任意 JavaScript 运行时。本文以仓库根目录 README.md 为骨架,结合源码(src/hono.ts、src/router 等)深入剖析其路由内核、轻量预设、内置中间件、多运行时适配器与 TypeScript 类型系统,帮助你掌握从零创建应用到在边缘平台部署的全流程。
快速开始:第一个 Hono 应用
Hono 官方提供脚手架命令,一条命令即可生成项目:
npm create hono@latest该命令会引导你选择目标平台(Cloudflare Workers、Deno、Bun、Node.js 等)并生成对应模板。手写最小应用同样简单,仓库根 README.md 中的最小示例是:
import { Hono } from 'hono' const app = new Hono() app.get('/', (c) => c.text('Hono!')) export default app这段代码的每个细节都值得解读:
new Hono()创建应用实例。从 src/hono.ts 看,默认构造会注册一个SmartRouter,其内部组合了RegExpRouter与TrieRouter,并按需自动降级(详见下文"路由内核")。app.get('/')是类型化的路由注册方法。在 src/hono-base.ts 中,Hono 在构造函数里为get/post/put/delete/options/patch/query/all等方法统一生成了注册逻辑,支持app.get(path, ...handlers)与app.get(...handlers)两种写法。c是Context对象(src/context.ts),c.text('Hono!')返回文本响应。export default app直接导出符合 Fetch API 的处理器:因为 Hono 基于 Web 标准,应用本身就是一个标准的(request, env, ctx) => Response函数,可以直接被任何兼容 Fetch 的运行时加载。
核心特性
README.md 概括了 Hono 的五大特性,下面逐一展开并结合源码验证。
极速:RegExpRouter 与 SmartRouter
Hono 的快,关键在于路由层不使用线性循环(not using linear loops),而是由RegExpRouter在**构建期(build 阶段)**将所有路由路径编译成单一的正则表达式与参数索引映射,请求到达时通过一次正则匹配即可完成寻址。
- RegExpRouter 实现 内部使用
Trie(src/router/reg-exp-router/trie.ts)将路由拆分,然后统一编译为正则。 - SmartRouter 实现 会在第一次 match 时依次尝试其内部路由器列表:逐个
add所有路由并执行一次match;一旦某个路由器成功(未抛出UnsupportedPathError),就永久锁定该路由器为唯一活动路由器(this.#routers = [router]),后续请求零切换开销。 - 默认组合是
RegExpRouter + TrieRouter(src/hono.ts):RegExpRouter 足够快则用 RegExpRouter,遇到其不支持的特殊路径语法(抛出UnsupportedPathError)时自动降级到 TrieRouter。
轻量:零依赖与 tiny 预设
Hono 是**零依赖(zero dependencies)**的——它只使用 Web 标准 API(Request/Response/fetch等),没有任何运行时外部依赖。其hono/tiny预设体积低于 12kB。
- tiny 预设源码 只引入
PatternRouter(src/router/pattern-router),以体积换极简:import { Hono } from 'hono/tiny'即可获得最小化打包。 - quick 预设源码 则组合
LinearRouter与TrieRouter,适合动态路由(如含参数路径)较多的场景。
体积数字 12kB 是官方在 README.md 中声明的指标,可作为事实引用,具体数值随版本与构建方式可能变化。
多运行时:同一代码跑遍全平台
Hono 支持 Cloudflare Workers、Fastly Compute、Deno、Bun、AWS Lambda、Lambda@Edge、Node.js。同一份代码无需修改即可在这些平台运行,因为其核心只依赖 Web 标准,平台差异被收敛到 src/adapter 目录下的各适配器中:
- adapter/cloudflare-workers:提供
env绑定类型、静态资源服务(serve-static)与 WebSocket。 - adapter/deno:提供
serve、upgradeWebSocket等 Deno 原生能力桥接。 - adapter/bun:针对 Bun 的 HTTP 服务与 WebSocket。
- adapter/aws-lambda 与 adapter/lambda-edge:把 Hono 应用封装为 Lambda 处理器。
- adapter/vercel、adapter/netlify、adapter/cloudflare-pages、adapter/service-worker:分别对接各 Serverless / 边缘平台。
仓库还提供了各运行时的真实测试集 runtime-tests(含 deno、bun、node、lambda、lambda-edge、fastly、workerd 等目录),印证"同一套 API 多平台可用"这一承诺。
电池全包:内置中间件
Hono 内置了大量中间件(Batteries Included),位于 src/middleware 目录,包括:
| 中间件 | 用途 | 源码 |
|---|---|---|
basic-auth | HTTP Basic 认证 | src/middleware/basic-auth/index.ts |
bearer-auth | Bearer Token 认证 | src/middleware/bearer-auth/index.ts |
jwt/jwk | JWT 校验与 JWK 密钥处理 | src/middleware/jwt |
cors | 跨域资源共享 | src/middleware/cors/index.ts |
csrf | CSRF 防护 | src/middleware/csrf/index.ts |
etag | ETag 缓存协商 | src/middleware/etag/index.ts |
logger | 请求日志 | src/middleware/logger/index.ts |
pretty-json | JSON 美化输出 | src/middleware/pretty-json/index.ts |
secure-headers | 安全响应头 | src/middleware/secure-headers/index.ts |
body-limit | 请求体大小限制 | src/middleware/body-limit/index.ts |
compress | 响应压缩 | src/middleware/compress/index.ts |
timeout | 请求超时控制 | src/middleware/timeout/index.ts |
request-id | 请求 ID 生成 | src/middleware/request-id/index.ts |
trailing-slash | 尾斜杠处理 | src/middleware/trailing-slash/index.ts |
ip-restriction | IP 访问限制 | src/middleware/ip-restriction/index.ts |
method-not-allowed/method-override | 方法限制 / 方法覆写 | src/middleware/method-not-allowed |
powered-by | 自定义 X-Powered-By 头 | src/middleware/powered-by/index.ts |
jsx-renderer | JSX 服务端渲染 | src/middleware/jsx-renderer/index.ts |
这些中间件也支持自定义与第三方中间件的扩展生态。使用示例:
import { Hono } from 'hono' import { logger } from 'hono/logger' import { basicAuth } from 'hono/basic-auth' import { secureHeaders } from 'hono/secure-headers' const app = new Hono() app.use('*', logger()) app.use('/admin/*', basicAuth({ username: 'admin', password: 'secret' })) app.use('*', secureHeaders()) app.get('/', (c) => c.json({ hello: 'world' }))愉悦的开发体验:一等 TypeScript 支持
Hono 提供 First-class TypeScript support,其"Types"体现在几个方面(均可从源码确认):
- 类型化路由与
Schema:应用可以用泛型Hono<E, S, BasePath>描述环境(Env)与路由 Schema(Schema),这些类型定义在 src/types.ts,并由 src/index.ts 统一导出。 hc类型化客户端:src/client/index.ts 提供hc,根据服务端 Schema 自动推断请求与响应类型(InferRequestType/InferResponseType),实现前后端类型共享。- 校验器
validator:src/validator 支持对 header、query、json、form 等目标的类型化校验(ValidationTargets)。 - Context 类型推断:
c.req、c.req.param()、c.req.query()等都基于路由路径参数自动推导类型。
深入:路由系统的分层设计
Hono 在 src/router 目录下内置了五类路由器,接口统一为add(method, path, handler)与match(method, path)(见 src/router.ts):
| 路由器 | 特点 | 源码 |
|---|---|---|
RegExpRouter | 构建期将全部路由编译为单一正则,匹配极快 | src/router/reg-exp-router/router.ts |
TrieRouter | 前缀树匹配,支持更宽泛的路径语法 | src/router/trie-router/router.ts |
SmartRouter | 首次匹配时自动在候选路由器中择优并锁定 | src/router/smart-router/router.ts |
LinearRouter | 线性匹配,适合路由少且追求最小开销的场景 | src/router/linear-router/router.ts |
PatternRouter | 极简实现,体积最小,用于tiny预设 | src/router/pattern-router/router.ts |
- 默认
Hono使用SmartRouter([RegExpRouter, TrieRouter])(src/hono.ts)。 hono/quick使用SmartRouter([LinearRouter, TrieRouter])(src/preset/quick.ts)。hono/tiny使用PatternRouter(src/preset/tiny.ts)。
SmartRouter的"自动择优"逻辑在 src/router/smart-router/router.ts:它先遍历候选路由器逐个add所有路由并试匹配;捕获到UnsupportedPathError就换下一个候选(continue),否则立刻把自身锁定为[该路由器]并替换match为它的匹配函数,此后每次请求都是零判断的直接命中。
HonoOptions:构造参数详解
从 src/hono-base.ts 可以看到HonoOptions的三个可选配置:
| 选项 | 默认值 | 作用 |
|---|---|---|
strict | true | 是否区分末尾是否为目录(/about与/about/是否视为不同路径)。设为false时尾斜杠将被忽略。 |
router | SmartRouter(RegExpRouter + TrieRouter) | 指定自定义路由器。例如new Hono({ router: new RegExpRouter() })。 |
getPath | 默认从RequestURL 解析路径 | 自定义从请求中提取路径的逻辑,典型场景是基于 Host 头的路由(虚拟主机)。 |
基于 Host 头路由的官方示例(源自 src/hono-base.ts):
const app = new Hono({ getPath: (req) => '/' + req.headers.get('host') + req.url.replace(/^https?:\/\/[^/]+(\/[^?]*)/, '$1'), }) app.get('/www1.example.com/hello', (c) => c.text('hello www1')) // 请求 new Request('http://www1.example.com/hello', { headers: { host: 'www1.example.com' } }) // 将命中上述路由更多官方资源
- 完整文档:官方文档站点 hono.dev(README 中声明,见 README.md)。
- 迁移指南:docs/MIGRATION.md,包含从旧版本升级的注意事项。
- 贡献指南:docs/CONTRIBUTING.md,涵盖 Issue、Pull Request、第三方中间件开发等参与方式。
- 开源协议:MIT,见 LICENSE。
结语
Hono 的定位清晰:Fast, but not only fast。它以 Web 标准为基石做到零依赖、多运行时可移植;以RegExpRouter+SmartRouter实现极速路由;以tiny/quick预设满足体积与场景的精细化需求;以类型化 Schema 与hc客户端带来端到端的 TypeScript 体验。无论是边缘函数、Serverless 还是 Node.js 服务,Hono 都值得作为你下一个项目的起点。
【免费下载链接】honoWeb framework built on Web Standards项目地址: https://gitcode.com/GitHub_Trending/ho/hono
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考