目录 火焰的起源Hono的故事 创始人Yusuke Wada一个典型的刨洋葱案例 快速开始30秒上手✨ 核心特性为什么选择Hono Hono vs Go Gin跨语言的相似之美 最佳实践干货满满 谁在使用Hono 火焰的起源Hono的故事Hono炎在日语中意为火焰这个名字与flareCloudflare有着微妙的联系[[7]][[17]]。2021年12月Cloudflare的工程师Yusuke Wadayusukebe开始了这个项目的开发[[6]][[19]]。当时他面临一个困境想为Cloudflare Workers创建应用但发现不用框架代码变得冗长难维护现有框架找不到完全符合需求的itty-router太简单Worktop和Sunder的API不够优雅于是一个典型的刨洋葱yak shaving故事开始了本想做个应用结果先做了个框架但这次刨洋葱非常有价值。如今Hono不仅被Cloudflare用于核心产品D1、Workers KV、Queues等还被Unkey、OpenStatus等众多公司采用 创始人Yusuke Wada一个典型的刨洋葱案例Yusuke Wada日本开发者Cloudflare Senior Developer AdvocateHono的创造者他的初衷很简单“我想创建一个基于Trie树结构的路由器因为它很快。”从2021年12月至今Hono已经发展成为一个支持多运行时的框架Cloudflare WorkersDenoBunNode.jsAWS LambdaFastly ComputeVercel、Netlify等关键转折点在v2版本时Yusuke决定支持Deno和Bun。这个决定非常明智——如果只针对Cloudflare WorkersHono可能不会有今天的成功 快速开始30秒上手安装方式多种选择# npmnpmcreate honolatest# yarnyarncreate hono# pnpmpnpmcreate honolatest# Bunbun create honolatest# Denodeno init--npmhonolatestHello World跨平台运行创建src/index.tsimport{Hono}fromhonoconstappnewHono()app.get(/,(c)c.text(Hello Hono! ))app.get(/hello/:name,(c){constnamec.req.param(name)returnc.json({message:Hello${name}!})})exportdefaultapp运行方式同一代码不同平台# Cloudflare Workerswrangler dev src/index.ts# Denodeno serve src/index.ts# Bunbun run src/index.ts# Node.jsnpx hono-node src/index.ts这就是真正的 “Write once, run anywhere”✨ 核心特性为什么选择Hono1.超快速⚡Hono的RegExpRouter是JavaScript世界中最快的路由器之一[[43]]Hono x 402,820 ops/sec ±4.78% itty-router x 212,598 ops/sec ±3.11% sunder x 297,036 ops/sec ±4.76% worktop x 197,345 ops/sec ±2.40% ✨ Hono是最快的2.超轻量hono/tiny预设仅14KBminifiedExpress对比572KB零依赖只使用Web Standards API3.多运行时支持// 同一份代码运行在任何地方import{Hono}fromhonoconstappnewHono()app.get(/api/users,(c){returnc.json({users:[]})})exportdefaultapp4.洋葱结构中间件Hono的中间件系统像洋葱一样请求和响应可以层层处理import{Hono}fromhonoimport{logger}fromhono/loggerimport{cors}fromhono/corsimport{jwt}fromhono/jwtconstappnewHono()// 使用中间件app.use(*,logger())app.use(/api/*,cors())app.use(/auth/*,jwt({secret:your-secret}))// 自定义中间件app.use(async(c,next){console.log(${c.req.method}${c.req.path})awaitnext()console.log(Response sent!)})app.get(/,(c)c.text(Hello!))5.内置中间件和Helpers开箱即用的功能import{basicAuth}fromhono/basic-authimport{bearerAuth}fromhono/bearer-authimport{etag}fromhono/etagimport{cache}fromhono/cacheimport{compress}fromhono/compressconstappnewHono()app.use(etag(),cache({cacheName:my-app}))app.use(/admin/*,basicAuth({username:admin,password:secret}))app.get(/api/*,bearerAuth())内置功能包括认证Basic、Bearer、JWT性能缓存、压缩、ETag安全CORS、Secure Headers工具Logger、Cookie、Body Limit渲染JSX、HTML、Streaming第三方Zod验证、Clerk、Auth.js等[[43]]6.强大的TypeScript支持Hono的类型系统非常强大特别是RPC模式import{z}fromzodimport{zValidator}fromhono/zod-validatorimport{hc}fromhono/client// 服务端constschemaz.object({id:z.number(),title:z.string()})constappnewHono().post(/posts,zValidator(json,schema),(c){constdatac.req.valid(json)returnc.json({message:${data.id}is${data.title}})})// 导出类型exporttypeAppTypetypeofapp// 客户端类型安全constclienthcAppType(http://localhost:8787)// 自动补全和类型检查constresawaitclient.posts.$post({json:{id:1,title:Hello}})这就是魔法服务端的API规范自动同步到客户端无需手动维护7.服务器端JSXHono的JSX专为服务器端设计无需renderToString()import{Hono}fromhonoconstappnewHono()app.get(/,(c){returnc.html(htmlheadtitleHono App/title/headbodyh1Hello World!/h1pServer-sideJSXworks!/p/body/html)})独特之处JSX标签被当作字符串处理可以直接返回[[14]]。 Hono vs Go Gin跨语言的相似之美为什么Hono和Gin很像虽然Hono是JavaScript/TypeScript框架Gin是Go框架但它们在设计理念上惊人地相似特性Hono (JS/TS)Gin (Go)性能超快速RegExpRouter最快的Go框架之一API设计简洁直观简洁直观中间件洋葱模型中间件链路由参数化路由参数化路由学习曲线1-2天1-2天适用场景API、边缘计算API、微服务代码对比Hono (TypeScript)import{Hono}fromhonoconstappnewHono()// 路由参数app.get(/users/:id,(c){constidc.req.param(id)returnc.json({id})})// 中间件app.use(*,logger())// 分组路由constapinewHono().basePath(/api)api.get(/posts,(c)c.json({posts:[]}))exportdefaultappGin (Go)importgithub.com/gin-gonic/ginfuncmain(){r:gin.Default()// 路由参数r.GET(/users/:id,func(c*gin.Context){id:c.Param(id)c.JSON(200,gin.H{id:id})})// 中间件r.Use(gin.Logger())// 分组路由api:r.Group(/api){api.GET(/posts,func(c*gin.Context){c.JSON(200,gin.H{posts:[]})})}r.Run()}相似度高达90%如果你熟悉Gin上手Hono会非常快反之亦然。性能对比根据基准测试Hono (Deno) vs Go (Gin) 在URL短链接服务中的表现[[38]][[39]]Hono (Deno): 约 50,000 req/sec Go (Gin): 约 70,000 req/sec虽然Gin略快毕竟是编译型语言但Hono作为JavaScript框架性能已经非常出色有趣的事实有一个hono.go项目基于Hono.js理念开发的Go框架声称比Gin快1.5倍 最佳实践干货满满1.项目结构建议my-hono-app/ ├── src/ │ ├── index.ts # 入口文件 │ ├── routes/ # 路由模块 │ │ ├── users.ts │ │ └── posts.ts │ ├── middleware/ # 自定义中间件 │ │ └── auth.ts │ ├── validators/ # 验证器 │ │ └── schemas.ts │ └── utils/ # 工具函数 ├── wrangler.toml # Cloudflare配置 └── package.json2.路由模块化// src/routes/users.tsimport{Hono}fromhonoconstusersnewHono().basePath(/users)users.get(/,(c)c.json({users:[]}))users.get(/:id,(c)c.json({id:c.req.param(id)}))users.post(/,(c)c.json({created:true},201))exportdefaultusers// src/index.tsimport{Hono}fromhonoimportusersfrom./routes/usersconstappnewHono()app.route(/,users)exportdefaultapp3.错误处理中间件import{Hono}fromhonoimport{HTTPException}fromhono/http-exceptionconstappnewHono()// 全局错误处理app.onError((err,c){if(errinstanceofHTTPException){returnc.json({error:err.message,status:err.status},err.status)}returnc.json({error:Internal Server Error},500)})// 404处理app.notFound((c){returnc.json({message:Not Found},404)})4.使用Zod进行验证import{z}fromzodimport{zValidator}fromhono/zod-validatorconstcreateUserSchemaz.object({name:z.string().min(1),email:z.string().email(),age:z.number().min(18).optional()})app.post(/users,zValidator(json,createUserSchema),(c){constdatac.req.valid(json)// data 已经过验证类型安全returnc.json({user:data,created:true})})5.Cloudflare Bindings集成typeEnv{Bindings:{DB:D1DatabaseKV:KVNamespaceR2:R2Bucket}}constappnewHono{Env}()app.get(/messages,async(c){const{results}awaitc.env.DB.prepare(SELECT * FROM messages).all()returnc.json(results)})app.post(/cache,async(c){constbodyawaitc.req.json()awaitc.env.KV.put(key,JSON.stringify(body))returnc.json({success:true})})类型自动补全开发体验极佳6.测试最佳实践import{Hono}fromhonoimport{describe,it,expect}fromvitestconstappnewHono()app.get(/,(c)c.text(Hello))describe(API Tests,(){it(should return 200,async(){constresawaitapp.request(/)expect(res.status).toBe(200)expect(awaitres.text()).toBe(Hello)})})无需启动服务器直接测试这是Web Standards的优势7.性能优化技巧// 使用压缩import{compress}fromhono/compressapp.use(compress())// 使用缓存import{cache}fromhono/cacheapp.get(/api/data,cache({cacheName:my-app,maxAge:3600}),(c){returnc.json({data:cached})})// 使用ETagimport{etag}fromhono/etagapp.use(etag())8.流式响应适合AI应用app.get(/stream,(c){returnc.streamText(async(stream){for(leti0;i5;i){awaitstream.write(Chunk${i}\n)awaitnewPromise(rsetTimeout(r,1000))}})}) 谁在使用Hono根据官方调查以下公司和项目在生产环境中使用Hono[[1]][[43]]大厂和知名项目CloudflareD1、Workers KV、Queues等核心产品UnkeyAPI认证和授权平台OpenStatus网站和API监控平台Clerk用户管理平台BaseAIAI代理框架Prisma、Resend、Vercel AI SDK、Supabase在示例中使用 总结为什么选择Hono✅ 适合你如果需要超快速的API服务想在边缘计算Cloudflare Workers等上运行喜欢简洁的API设计类似Express或Go Gin需要TypeScript类型安全想要零配置、快速开发关注包大小和性能❌ 可能不适合如果需要完整的全栈框架如Next.js重度依赖Node.js特有API需要庞大的生态系统
周下载量 600个W,这个TS版Gin框架火了?
目录 火焰的起源Hono的故事 创始人Yusuke Wada一个典型的刨洋葱案例 快速开始30秒上手✨ 核心特性为什么选择Hono Hono vs Go Gin跨语言的相似之美 最佳实践干货满满 谁在使用Hono 火焰的起源Hono的故事Hono炎在日语中意为火焰这个名字与flareCloudflare有着微妙的联系[[7]][[17]]。2021年12月Cloudflare的工程师Yusuke Wadayusukebe开始了这个项目的开发[[6]][[19]]。当时他面临一个困境想为Cloudflare Workers创建应用但发现不用框架代码变得冗长难维护现有框架找不到完全符合需求的itty-router太简单Worktop和Sunder的API不够优雅于是一个典型的刨洋葱yak shaving故事开始了本想做个应用结果先做了个框架但这次刨洋葱非常有价值。如今Hono不仅被Cloudflare用于核心产品D1、Workers KV、Queues等还被Unkey、OpenStatus等众多公司采用 创始人Yusuke Wada一个典型的刨洋葱案例Yusuke Wada日本开发者Cloudflare Senior Developer AdvocateHono的创造者他的初衷很简单“我想创建一个基于Trie树结构的路由器因为它很快。”从2021年12月至今Hono已经发展成为一个支持多运行时的框架Cloudflare WorkersDenoBunNode.jsAWS LambdaFastly ComputeVercel、Netlify等关键转折点在v2版本时Yusuke决定支持Deno和Bun。这个决定非常明智——如果只针对Cloudflare WorkersHono可能不会有今天的成功 快速开始30秒上手安装方式多种选择# npmnpmcreate honolatest# yarnyarncreate hono# pnpmpnpmcreate honolatest# Bunbun create honolatest# Denodeno init--npmhonolatestHello World跨平台运行创建src/index.tsimport{Hono}fromhonoconstappnewHono()app.get(/,(c)c.text(Hello Hono! ))app.get(/hello/:name,(c){constnamec.req.param(name)returnc.json({message:Hello${name}!})})exportdefaultapp运行方式同一代码不同平台# Cloudflare Workerswrangler dev src/index.ts# Denodeno serve src/index.ts# Bunbun run src/index.ts# Node.jsnpx hono-node src/index.ts这就是真正的 “Write once, run anywhere”✨ 核心特性为什么选择Hono1.超快速⚡Hono的RegExpRouter是JavaScript世界中最快的路由器之一[[43]]Hono x 402,820 ops/sec ±4.78% itty-router x 212,598 ops/sec ±3.11% sunder x 297,036 ops/sec ±4.76% worktop x 197,345 ops/sec ±2.40% ✨ Hono是最快的2.超轻量hono/tiny预设仅14KBminifiedExpress对比572KB零依赖只使用Web Standards API3.多运行时支持// 同一份代码运行在任何地方import{Hono}fromhonoconstappnewHono()app.get(/api/users,(c){returnc.json({users:[]})})exportdefaultapp4.洋葱结构中间件Hono的中间件系统像洋葱一样请求和响应可以层层处理import{Hono}fromhonoimport{logger}fromhono/loggerimport{cors}fromhono/corsimport{jwt}fromhono/jwtconstappnewHono()// 使用中间件app.use(*,logger())app.use(/api/*,cors())app.use(/auth/*,jwt({secret:your-secret}))// 自定义中间件app.use(async(c,next){console.log(${c.req.method}${c.req.path})awaitnext()console.log(Response sent!)})app.get(/,(c)c.text(Hello!))5.内置中间件和Helpers开箱即用的功能import{basicAuth}fromhono/basic-authimport{bearerAuth}fromhono/bearer-authimport{etag}fromhono/etagimport{cache}fromhono/cacheimport{compress}fromhono/compressconstappnewHono()app.use(etag(),cache({cacheName:my-app}))app.use(/admin/*,basicAuth({username:admin,password:secret}))app.get(/api/*,bearerAuth())内置功能包括认证Basic、Bearer、JWT性能缓存、压缩、ETag安全CORS、Secure Headers工具Logger、Cookie、Body Limit渲染JSX、HTML、Streaming第三方Zod验证、Clerk、Auth.js等[[43]]6.强大的TypeScript支持Hono的类型系统非常强大特别是RPC模式import{z}fromzodimport{zValidator}fromhono/zod-validatorimport{hc}fromhono/client// 服务端constschemaz.object({id:z.number(),title:z.string()})constappnewHono().post(/posts,zValidator(json,schema),(c){constdatac.req.valid(json)returnc.json({message:${data.id}is${data.title}})})// 导出类型exporttypeAppTypetypeofapp// 客户端类型安全constclienthcAppType(http://localhost:8787)// 自动补全和类型检查constresawaitclient.posts.$post({json:{id:1,title:Hello}})这就是魔法服务端的API规范自动同步到客户端无需手动维护7.服务器端JSXHono的JSX专为服务器端设计无需renderToString()import{Hono}fromhonoconstappnewHono()app.get(/,(c){returnc.html(htmlheadtitleHono App/title/headbodyh1Hello World!/h1pServer-sideJSXworks!/p/body/html)})独特之处JSX标签被当作字符串处理可以直接返回[[14]]。 Hono vs Go Gin跨语言的相似之美为什么Hono和Gin很像虽然Hono是JavaScript/TypeScript框架Gin是Go框架但它们在设计理念上惊人地相似特性Hono (JS/TS)Gin (Go)性能超快速RegExpRouter最快的Go框架之一API设计简洁直观简洁直观中间件洋葱模型中间件链路由参数化路由参数化路由学习曲线1-2天1-2天适用场景API、边缘计算API、微服务代码对比Hono (TypeScript)import{Hono}fromhonoconstappnewHono()// 路由参数app.get(/users/:id,(c){constidc.req.param(id)returnc.json({id})})// 中间件app.use(*,logger())// 分组路由constapinewHono().basePath(/api)api.get(/posts,(c)c.json({posts:[]}))exportdefaultappGin (Go)importgithub.com/gin-gonic/ginfuncmain(){r:gin.Default()// 路由参数r.GET(/users/:id,func(c*gin.Context){id:c.Param(id)c.JSON(200,gin.H{id:id})})// 中间件r.Use(gin.Logger())// 分组路由api:r.Group(/api){api.GET(/posts,func(c*gin.Context){c.JSON(200,gin.H{posts:[]})})}r.Run()}相似度高达90%如果你熟悉Gin上手Hono会非常快反之亦然。性能对比根据基准测试Hono (Deno) vs Go (Gin) 在URL短链接服务中的表现[[38]][[39]]Hono (Deno): 约 50,000 req/sec Go (Gin): 约 70,000 req/sec虽然Gin略快毕竟是编译型语言但Hono作为JavaScript框架性能已经非常出色有趣的事实有一个hono.go项目基于Hono.js理念开发的Go框架声称比Gin快1.5倍 最佳实践干货满满1.项目结构建议my-hono-app/ ├── src/ │ ├── index.ts # 入口文件 │ ├── routes/ # 路由模块 │ │ ├── users.ts │ │ └── posts.ts │ ├── middleware/ # 自定义中间件 │ │ └── auth.ts │ ├── validators/ # 验证器 │ │ └── schemas.ts │ └── utils/ # 工具函数 ├── wrangler.toml # Cloudflare配置 └── package.json2.路由模块化// src/routes/users.tsimport{Hono}fromhonoconstusersnewHono().basePath(/users)users.get(/,(c)c.json({users:[]}))users.get(/:id,(c)c.json({id:c.req.param(id)}))users.post(/,(c)c.json({created:true},201))exportdefaultusers// src/index.tsimport{Hono}fromhonoimportusersfrom./routes/usersconstappnewHono()app.route(/,users)exportdefaultapp3.错误处理中间件import{Hono}fromhonoimport{HTTPException}fromhono/http-exceptionconstappnewHono()// 全局错误处理app.onError((err,c){if(errinstanceofHTTPException){returnc.json({error:err.message,status:err.status},err.status)}returnc.json({error:Internal Server Error},500)})// 404处理app.notFound((c){returnc.json({message:Not Found},404)})4.使用Zod进行验证import{z}fromzodimport{zValidator}fromhono/zod-validatorconstcreateUserSchemaz.object({name:z.string().min(1),email:z.string().email(),age:z.number().min(18).optional()})app.post(/users,zValidator(json,createUserSchema),(c){constdatac.req.valid(json)// data 已经过验证类型安全returnc.json({user:data,created:true})})5.Cloudflare Bindings集成typeEnv{Bindings:{DB:D1DatabaseKV:KVNamespaceR2:R2Bucket}}constappnewHono{Env}()app.get(/messages,async(c){const{results}awaitc.env.DB.prepare(SELECT * FROM messages).all()returnc.json(results)})app.post(/cache,async(c){constbodyawaitc.req.json()awaitc.env.KV.put(key,JSON.stringify(body))returnc.json({success:true})})类型自动补全开发体验极佳6.测试最佳实践import{Hono}fromhonoimport{describe,it,expect}fromvitestconstappnewHono()app.get(/,(c)c.text(Hello))describe(API Tests,(){it(should return 200,async(){constresawaitapp.request(/)expect(res.status).toBe(200)expect(awaitres.text()).toBe(Hello)})})无需启动服务器直接测试这是Web Standards的优势7.性能优化技巧// 使用压缩import{compress}fromhono/compressapp.use(compress())// 使用缓存import{cache}fromhono/cacheapp.get(/api/data,cache({cacheName:my-app,maxAge:3600}),(c){returnc.json({data:cached})})// 使用ETagimport{etag}fromhono/etagapp.use(etag())8.流式响应适合AI应用app.get(/stream,(c){returnc.streamText(async(stream){for(leti0;i5;i){awaitstream.write(Chunk${i}\n)awaitnewPromise(rsetTimeout(r,1000))}})}) 谁在使用Hono根据官方调查以下公司和项目在生产环境中使用Hono[[1]][[43]]大厂和知名项目CloudflareD1、Workers KV、Queues等核心产品UnkeyAPI认证和授权平台OpenStatus网站和API监控平台Clerk用户管理平台BaseAIAI代理框架Prisma、Resend、Vercel AI SDK、Supabase在示例中使用 总结为什么选择Hono✅ 适合你如果需要超快速的API服务想在边缘计算Cloudflare Workers等上运行喜欢简洁的API设计类似Express或Go Gin需要TypeScript类型安全想要零配置、快速开发关注包大小和性能❌ 可能不适合如果需要完整的全栈框架如Next.js重度依赖Node.js特有API需要庞大的生态系统