
Hono构建于 Web 标准之上的极速轻量多运行时 Web 框架【免费下载链接】honoWeb framework built on Web Standards项目地址: https://gitcode.com/GitHub_Trending/ho/honoHono 是一个小而简单、极速的 Web 框架完全构建在 Web 标准Web Standards之上可用于 Cloudflare Workers、Fastly Compute、Deno、Bun、Vercel、AWS Lambda、LambdaEdge 和 Node.js 等任意 JavaScript 运行时。本文以仓库根目录 README.md 为骨架结合源码src/hono.ts、src/router 等深入剖析其路由内核、轻量预设、内置中间件、多运行时适配器与 TypeScript 类型系统帮助你掌握从零创建应用到在边缘平台部署的全流程。快速开始第一个 Hono 应用Hono 官方提供脚手架命令一条命令即可生成项目npm create honolatest该命令会引导你选择目标平台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.tsc.text(Hono!)返回文本响应。export default app直接导出符合 Fetch API 的处理器因为 Hono 基于 Web 标准应用本身就是一个标准的(request, env, ctx) Response函数可以直接被任何兼容 Fetch 的运行时加载。核心特性README.md 概括了 Hono 的五大特性下面逐一展开并结合源码验证。极速RegExpRouter 与 SmartRouterHono 的快关键在于路由层不使用线性循环not using linear loops而是由RegExpRouter在**构建期build 阶段**将所有路由路径编译成单一的正则表达式与参数索引映射请求到达时通过一次正则匹配即可完成寻址。RegExpRouter 实现 内部使用Triesrc/router/reg-exp-router/trie.ts将路由拆分然后统一编译为正则。SmartRouter 实现 会在第一次 match 时依次尝试其内部路由器列表逐个add所有路由并执行一次match一旦某个路由器成功未抛出UnsupportedPathError就永久锁定该路由器为唯一活动路由器this.#routers [router]后续请求零切换开销。默认组合是RegExpRouter TrieRoutersrc/hono.tsRegExpRouter 足够快则用 RegExpRouter遇到其不支持的特殊路径语法抛出UnsupportedPathError时自动降级到 TrieRouter。轻量零依赖与 tiny 预设Hono 是**零依赖zero dependencies**的——它只使用 Web 标准 APIRequest/Response/fetch等没有任何运行时外部依赖。其hono/tiny预设体积低于 12kB。tiny 预设源码 只引入PatternRoutersrc/router/pattern-router以体积换极简import { Hono } from hono/tiny即可获得最小化打包。quick 预设源码 则组合LinearRouter与TrieRouter适合动态路由如含参数路径较多的场景。体积数字 12kB 是官方在 README.md 中声明的指标可作为事实引用具体数值随版本与构建方式可能变化。多运行时同一代码跑遍全平台Hono 支持 Cloudflare Workers、Fastly Compute、Deno、Bun、AWS Lambda、LambdaEdge、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-authHTTP Basic 认证src/middleware/basic-auth/index.tsbearer-authBearer Token 认证src/middleware/bearer-auth/index.tsjwt/jwkJWT 校验与 JWK 密钥处理src/middleware/jwtcors跨域资源共享src/middleware/cors/index.tscsrfCSRF 防护src/middleware/csrf/index.tsetagETag 缓存协商src/middleware/etag/index.tslogger请求日志src/middleware/logger/index.tspretty-jsonJSON 美化输出src/middleware/pretty-json/index.tssecure-headers安全响应头src/middleware/secure-headers/index.tsbody-limit请求体大小限制src/middleware/body-limit/index.tscompress响应压缩src/middleware/compress/index.tstimeout请求超时控制src/middleware/timeout/index.tsrequest-id请求 ID 生成src/middleware/request-id/index.tstrailing-slash尾斜杠处理src/middleware/trailing-slash/index.tsip-restrictionIP 访问限制src/middleware/ip-restriction/index.tsmethod-not-allowed/method-override方法限制 / 方法覆写src/middleware/method-not-allowedpowered-by自定义 X-Powered-By 头src/middleware/powered-by/index.tsjsx-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应用可以用泛型HonoE, S, BasePath描述环境Env与路由 SchemaSchema这些类型定义在 src/types.ts并由 src/index.ts 统一导出。hc类型化客户端src/client/index.ts 提供hc根据服务端 Schema 自动推断请求与响应类型InferRequestType/InferResponseType实现前后端类型共享。校验器validatorsrc/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.tsTrieRouter前缀树匹配支持更宽泛的路径语法src/router/trie-router/router.tsSmartRouter首次匹配时自动在候选路由器中择优并锁定src/router/smart-router/router.tsLinearRouter线性匹配适合路由少且追求最小开销的场景src/router/linear-router/router.tsPatternRouter极简实现体积最小用于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使用PatternRoutersrc/preset/tiny.ts。SmartRouter的自动择优逻辑在 src/router/smart-router/router.ts它先遍历候选路由器逐个add所有路由并试匹配捕获到UnsupportedPathError就换下一个候选continue否则立刻把自身锁定为[该路由器]并替换match为它的匹配函数此后每次请求都是零判断的直接命中。HonoOptions构造参数详解从 src/hono-base.ts 可以看到HonoOptions的三个可选配置选项默认值作用stricttrue是否区分末尾是否为目录/about与/about/是否视为不同路径。设为false时尾斜杠将被忽略。routerSmartRouterRegExpRouter TrieRouter指定自定义路由器。例如new Hono({ router: new RegExpRouter() })。getPath默认从RequestURL 解析路径自定义从请求中提取路径的逻辑典型场景是基于 Host 头的路由虚拟主机。基于 Host 头路由的官方示例源自 src/hono-base.tsconst 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.devREADME 中声明见 README.md。迁移指南docs/MIGRATION.md包含从旧版本升级的注意事项。贡献指南docs/CONTRIBUTING.md涵盖 Issue、Pull Request、第三方中间件开发等参与方式。开源协议MIT见 LICENSE。结语Hono 的定位清晰Fast, but not only fast。它以 Web 标准为基石做到零依赖、多运行时可移植以RegExpRouterSmartRouter实现极速路由以tiny/quick预设满足体积与场景的精细化需求以类型化 Schema 与hc客户端带来端到端的 TypeScript 体验。无论是边缘函数、Serverless 还是 Node.js 服务Hono 都值得作为你下一个项目的起点。【免费下载链接】honoWeb framework built on Web Standards项目地址: https://gitcode.com/GitHub_Trending/ho/hono创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考