从 Express 到 Hono:Node.js 网络框架源码研究地图

发布于 · 1,641 字 · 约 4 分钟#Github 解读
从 Express 到 Hono:Node.js 网络框架源码研究地图 封面图
  • Node.js 服务端正从 Express/Koa 的中间件模型分化为三条路线:Fastify 的高性能插件模型、NestJS 的工程化模型、Hono 的 Web Standards 多运行时模型
  • Fastify 用插件封装上下文和 Schema 驱动的校验序列化替代全局中间件栈,更适合大型系统;NestJS 是跑在 Express/Fastify 之上的应用框架,可替换平台适配层
  • Hono 把框架建立在 Web 标准 Request/Response 上,经运行时适配层同时跑在 Node、Bun、Deno、Cloudflare Workers 等环境
  • 研究 WebSocket 协议实现优先读 ws 而非 Socket.IO,前者完整覆盖 Upgrade、帧、掩码、分片与背压等协议细节
  • 六个源码级研究对象:Express 读路由、Koa 读 compose、Fastify 读插件、Hono 读适配层、ws 读协议、Moleculer 读分布式

聊「Node.js 网络框架」,我习惯把范围放得宽一些:不只是 Express 这类 Web Framework,还包括 HTTP/API、WebSocket/Realtime、微服务、Proxy/Gateway 这些用来构建网络服务的开源项目。

截至 2026-09-29,这一领域有个很明显的趋势:Node.js 服务端正从早期的 Express/Koa 中间件模型,逐渐分化出三个方向——Fastify 的高性能插件模型、NestJS 的工程化模型,以及 Hono 的 Web Standards / 多运行时模型。

先看全景。Star 数为当日经 GitHub API 实查:

项目Star领域定位主要特点研究价值
NestJS76.7kHTTP / 应用框架企业级 BackendDI、Module、Decorator、微服务★★★★★
Express69.5kHTTP / 应用框架Web / HTTP极简、中间件生态巨大★★★★★
Socket.IO63.2kRealtime双向低延迟通信Room、Namespace、重连、传输升级★★★★
Fastify37.2kHTTP / 应用框架高性能 HTTPPlugin、Schema、低 overhead★★★★★
Koa35.7kHTTP / 应用框架Web / HTTP洋葱模型、中间件极简★★★★
Hono32.4kHTTP / 应用框架Web StandardsEdge / Node / Bun / Deno★★★★★
ws22.8kRealtime轻量 WebSocketRFC 6455 实现、Autobahn 全测★★★★★
AdonisJS19.1kHTTP / 应用框架全栈 BackendTS-first、ORM、Auth、MVC★★★★
Feathers15.3kAPI / RealtimeWeb API 框架Service 抽象、实时 API★★★★
node-http-proxy14.1kProxy / Gateway可编程代理HTTP/HTTPS/WebSocket 代理★★★
Moleculer6.4k微服务微服务运行时Service Discovery、RPC、MQ★★★★

Star 是量级参考而非严格排名。下面按一条演进路线展开:先讲 HTTP 框架五部曲,再看 Realtime、微服务、Service 抽象和网关,最后给出一份源码研究清单。

HTTP 框架五部曲:一条演进路线

Express:Node.js Web Framework 的「原点」

expressjs/express

Express 到今天仍然值得读源码,因为后来大量 Node.js 框架的设计都拿它当坐标系。核心非常简单:

HTTP Server
     ↓
Application
     ↓
Router
     ↓
Middleware Stack
     ↓
Request → middleware → middleware → handler

核心思想就是 Middleware + Router + Request/Response 增强。Express 已进入 v5 时代,官方要求 Node.js 18 以上。

如果目标是「自己实现一个 Node.js 网络框架」,第一个读的应该是 Express,因为它能让你最快理解这套后来成为通用词汇的东西:

app.use()
router
Layer
next()
req / res
error middleware

Koa:研究 Middleware 模型必看

koajs/koa

Koa 最大的贡献不是功能,而是经典的洋葱模型(Onion Middleware Model):

request
   ↓
middleware A
   ↓
middleware B
   ↓
middleware C
   ↓
handler
   ↑
middleware C
   ↑
middleware B
   ↑
middleware A
   ↓
response

典型代码:

app.use(async (ctx, next) => {
  console.log('A start')

  await next()

  console.log('A end')
})

Koa 核心本身非常小,官方描述只有约 570 SLOC,也没有内置一堆 middleware。所以如果你的目标是写一个 mini Web Framework,Koa 源码可能比 NestJS 更值得先读。

Fastify:现代 HTTP Framework 的代表性设计

fastify/fastify

如果目的不是「学怎么用框架」,而是研究怎么设计一个现代 Node.js 网络框架,Fastify 是重点。它与 Express 最大的差异:

Express
   ↓
Middleware-oriented

Fastify
   ↓
Plugin-oriented
+
Schema-oriented
+
Encapsulation

Fastify 把核心能力组织成:

Fastify Instance
 ├── Router
 ├── Plugin System
 │     └── Encapsulation Context
 ├── Hooks
 ├── Decorators
 ├── Schema
 │     ├── Validation
 │     └── Serialization
 ├── Logger
 └── HTTP Server

官方目前把 Performance、低 overhead、Developer Experience 和 Plugin Architecture 作为核心方向,提供 HTTP/2、Serverless、TypeScript、Lifecycle、Hooks、Validation/Serialization 等完整机制。

最值得研究的是 Plugin Encapsulation:

root
├── plugin A
│   ├── decorator A
│   └── routes
│
└── plugin B
    ├── decorator B
    └── routes

每个插件有自己的 context/scope。这套设计比 Express 的全局 middleware stack 更适合大型系统。

Hono:新一代多运行时框架

honojs/hono

从近几年的 JS Server Framework 演进趋势看,Hono 特别值得关注。它有一个很重要的思想:

Framework 不应该绑定 Node.js。

Hono 建立在 Web Standards 之上,而不是 Node.js 的 IncomingMessage / ServerResponse 之上:

               Hono App
                  │
             Web Standards
                  │
       ┌──────────┼───────────┐
       ↓          ↓           ↓
     Node.js     Bun         Deno
       ↓                      ↓
 AWS Lambda             Cloudflare
       ↓
    Fastly...

官方列出的运行环境包括 Node.js、Bun、Deno、Cloudflare Workers、Fastly、AWS Lambda、Lambda@Edge 等,Node.js 通过 honojs/node-server 这样的 adapter 接入。

这实际上是一个非常漂亮的架构:

Application
     ↓
Web Standard Request/Response
     ↓
Runtime Adapter
     ↓
Node / Bun / Deno / Worker

对现在的 AI Infra、Serverless、Edge 应用来说,这个方向非常值得研究。

NestJS:大型应用框架的首选研究对象

nestjs/nest

NestJS 和前面几个不太一样,它更接近 Spring Boot 和 Angular,而不是 Express。架构大致是:

Application
   ↓
Module
   ↓
Controller
   ↓
Service
   ↓
Provider
   ↓
Dependency Injection Container

同时提供 Middleware、Guard、Interceptor、Pipe、Filter、Decorator、Metadata、DI、Module、Microservices、WebSocket、GraphQL 一整套机制。Nest 默认跑在 Express 上,也可以切换到 Fastify:

NestJS

      Application Framework
               ↓
       Platform Adapter
          ↙          ↘
     Express        Fastify
          ↓          ↓
             Node.js

这意味着 NestJS 更像一个 Application Framework / Architecture Framework,而 Fastify 和 Express 更接近 HTTP Framework。想研究 DI Container、Module Graph、Decorator + Metadata、Lifecycle、Framework Adapter,这个项目非常值得拆。

Realtime:Socket.IO 与 ws

Socket.IO:一套 Realtime 协议框架

socketio/socket.io · 63.2k Star

重点研究它的协议栈:

Client
  ↕
Engine.IO
  ↕
Socket.IO Protocol
  ↕
Server

以及 Room、Namespace、Broadcast、Reconnect、Heartbeat、Transport Upgrade、Adapter 这些机制。它不是简单的 WebSocket wrapper,而是一套更高层的 realtime protocol/framework。

ws:读协议实现的首选

websockets/ws · 22.8k Star

如果觉得 Socket.IO 太重,ws 更接近 RFC 6455 的直接实现。官方定位就是 Node.js 的轻量、高性能 WebSocket client/server implementation,并通过 Autobahn 测试套件。

要学习网络协议实现,ws 比 Socket.IO 更值得读源码,因为它能完整覆盖:

HTTP Upgrade
Handshake
Frame
Mask
Opcode
Ping/Pong
Fragmentation
Compression
Backpressure

微服务:Moleculer

moleculerjs/moleculer

一个相对没那么出圈、但技术上很有意思的项目,更接近 Node.js 世界里的 Service Mesh + RPC Framework + Microservice Runtime:

ServiceBroker
      │
 ┌────┼────┐
 ↓    ↓    ↓
Svc A Svc B Svc C
      │
 Transporter
      │
 ┌────┼───────────┐
TCP  NATS  Redis Kafka
MQTT AMQP ...

内置 Service Discovery、Load Balancing、Circuit Breaker、Bulkhead、Retry、Timeout、Caching、Metrics、Tracing。这个项目特别适合研究 Node.js 如何构建真正的分布式网络框架。

Service 抽象:Feathers

feathersjs/feathers

Feathers 的设计核心不是 Controller,而是 Service:

users.find()
users.get()
users.create()
users.update()
users.patch()
users.remove()

同一个 Service 可以暴露为 REST、WebSocket 或 Socket.IO:

           Service
              │
       ┌──────┼──────┐
       ↓      ↓      ↓
     REST    WS    Socket.IO

这种 transport-independent 的 service abstraction 很有意思,官方目前将其定位为 TypeScript/JavaScript 的 Web API + realtime application framework。

Proxy / Gateway:node-http-proxy

http-party/node-http-proxy · 14.1k Star

如果把「网络框架」的边界扩到网络基础设施,还应该看这个可编程 HTTP 代理:

Client
   ↓
Node Proxy
   ↓
 ┌─┴─────────────┐
 ↓               ↓
Backend A     Backend B

支持 HTTP / HTTPS / WebSocket,可以用来实现 reverse proxy、load balancer。不过这个项目架构偏传统——研究「现代 Node.js Gateway」时,我会把它当经典实现看,而不是新项目的架构模板。

研究路线:重点拆这六个

如果目的不是选型,而是研究「Node.js 网络框架到底应该怎么设计」,不建议平均用力看十几个项目,而是沿着这条演进路线:

                 Node.js Networking
                        │
        ┌───────────────┼────────────────┐
        │               │                │
       HTTP          Realtime       Distributed
        │               │                │
     Express            ws            Moleculer
        │
       Koa
        │
     Fastify
        │
       Hono
        │
     Web Standards

其中最值得源码级研究的六个:

项目建议研究什么
ExpressRouter / Middleware / Layer
Koacompose / Onion Middleware
FastifyPlugin / Encapsulation / Lifecycle / Schema
HonoRouter / Web Standards / Runtime Adapter
wsWebSocket Protocol / Frame / Backpressure
MoleculerRPC / Transport / Service Discovery / Load Balancing

这六个项目覆盖了 Node.js 网络框架最核心的几个设计问题:

                       Framework
                           │
 ┌─────────────┬───────────┼───────────┬──────────────┐
 │             │           │           │              │
Router     Middleware    Plugin     Transport      Runtime
 │             │           │           │              │
Express       Koa       Fastify       ws           Hono
                                        │
                                   Moleculer
                                        │
                              Distributed System

换个视角:Agent Runtime 的选型

最后补一个正在变得重要的视角。在 Agent Harness / AI Agent 基础设施的场景下,「哪个网络框架合适」的答案会和传统 CRUD Backend 明显不同:

框架对应路线
HonoEdge Agent Runtime
Fastify高性能 Tool API
Moleculer分布式 Agent Runtime
NestJS企业级 Agent Platform

同样的框架,放在 MCP Server 或 Agent Gateway 的语境里,取舍维度就从「中间件生态」变成了运行时覆盖、协议开销和分布式能力。这也是为什么上面那条从 Express 到 Web Standards 的演进线,值得在 AI 时代重新走一遍。

评论互动

© 2026 王若风的技术博客 · Powered by Astro