Hono:构建于 Web 标准之上的极速轻量多运行时 Web 框架
2026/9/10 22:10:29 网站建设 项目流程

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,其内部组合了RegExpRouterTrieRouter,并按需自动降级(详见下文"路由内核")。
  • app.get('/')是类型化的路由注册方法。在 src/hono-base.ts 中,Hono 在构造函数里为get/post/put/delete/options/patch/query/all等方法统一生成了注册逻辑,支持app.get(path, ...handlers)app.get(...handlers)两种写法。
  • cContext对象(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 预设源码 则组合LinearRouterTrieRouter,适合动态路由(如含参数路径)较多的场景。

体积数字 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:提供serveupgradeWebSocket等 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-authHTTP Basic 认证src/middleware/basic-auth/index.ts
bearer-authBearer Token 认证src/middleware/bearer-auth/index.ts
jwt/jwkJWT 校验与 JWK 密钥处理src/middleware/jwt
cors跨域资源共享src/middleware/cors/index.ts
csrfCSRF 防护src/middleware/csrf/index.ts
etagETag 缓存协商src/middleware/etag/index.ts
logger请求日志src/middleware/logger/index.ts
pretty-jsonJSON 美化输出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-restrictionIP 访问限制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-rendererJSX 服务端渲染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.reqc.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的三个可选配置:

选项默认值作用
stricttrue是否区分末尾是否为目录(/about/about/是否视为不同路径)。设为false时尾斜杠将被忽略。
routerSmartRouter(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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询