跳到主要内容
CNode

Hoa - 一个极简 Web 框架

分享
Nnswbmw发布于 1 年前最后回复 10 天前
756960
目录 · 4 个章节

我使用 Koa 很多年了,一直很喜欢它简洁的设计哲学。近几年在 Cloudflare Worker 上开发较多,接触到了 Hono。Hono 也是一个不错的框架,但在深入使用后,我对它的一些设计理念并不是很认同,于是萌生了自己造个轮子的想法。

我为新框架设定了三条核心原则:

  1. 微内核架构:与 Koa 类似,保留了洋葱模型的中间件设计,同时还补充了插件系统
  2. 符合直觉的 API 设计:摒弃 Koa 的 delegates 思路,API 严格区分 ctx/ctx.req/ctx.res,更加符合语义
  3. 环境无关性:可在 Node.js、Bun、Deno 以及 Cloudflare Worker、Vercel 等边缘环境运行

于是 Hoa 诞生了。目前我跟另一个维护者已经为 Hoa 补充了 30+ 常用中间件,我也已经将手头大部分项目从 Koa 迁移至 Hoa。今天分享出来,希望更多人去使用,也期待收到更多反馈,共同把 Hoa 框架打磨得更好。

特点

  • ⚡ Minimal - Only ~4.4KB (gzipped).
  • 🚫 Zero Dependencies - Built on modern Web Standards with no external dependencies.
  • 🛠️ Highly Extensible - Features a flexible extension and middleware system.
  • 😊 Standards-Based - Designed entirely around modern Web Standard APIs.
  • 🌐 Multi-Runtime - The same code runs on Cloudflare Workers, Deno, Bun, Node.js, and more.
  • ✅ 100% Tested – Backed by a full-coverage automated test suite.

安装

npm i hoa --save

快速开始

import { Hoa } from 'hoa'
const app = new Hoa()

app.use(async (ctx, next) => {
  ctx.res.body = 'Hello, Hoa!'
})

export default app

License

MIT

查看回复

回复 (6)

Y
yuan_dev#610 天前

从 Koa 迁过来,请求体只能读一次这点最容易踩。Hoa 把 ctx.req 固定成 Web Request 之后,中间件里如果前面做了 JSON 解析、后面还想记原始 body,是不是得自己 clone?另外官网写的 4.4KB 应该不含那 30 多个中间件,生产里一般会再装 body、cors 和静态文件,这套组合 gzip 后大概会到什么量级?

G
gifcompressor#511 天前

跨 runtime 的 API 设计很有意思。想请教一下:ctx.req / ctx.res 在 Node.js 和 Cloudflare Workers 之间,是直接维持 Web Request/Response 语义,还是 Node 侧另做适配?如果中间件要读取请求体并同时支持流式响应,Hoa 推荐怎样处理这类边界?我觉得这比 hello world 更能体现“环境无关”的设计取舍。

W
wanguk#420 天前

我现在用vitepress写 https://chenmingblog.com/

X
xiaolige#310 个月前

11

S
sainan#21 年前
引用 sainan11

@sainan 1111

S
sainan#11 年前

11

参与回复

登录后即可参与回复。登录