1. 为什么需要单独选择后端框架
上一篇文章确定了边缘部署的方向,并选择 Cloudflare Workers 作为基础设施。接下来还要解决一个具体问题:使用什么框架组织 API、中间件和服务调用。
我们曾经在两个候选框架之间做过比较,一个是 Python 生态的 FastAPI,另一个是 TypeScript 生态的 Hono.js。它们都强调简洁的 API 开发体验,也都重视性能,但在运行时、部署方式和生态定位上有明显差异。
当部署平台确定为 Cloudflare Workers 后,框架选择仍然不是一道只有一个答案的题目。FastAPI 现在也可以通过 Python Workers 运行,但它处于 Beta 阶段,并且有自己的包兼容性与运行时约束。下面结合当前项目的语言栈、部署目标和团队能力,说明为什么这里更倾向 Hono.js。
2. 两个框架的定位
我们先通过最简单的接口看看两者的代码风格。
FastAPI:Python 生态的 API 框架
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Message(BaseModel):
content: str
user_id: str
@app.post("/chat")
async def chat(msg: Message):
# 调用 LLM、检索记忆、组装回复...
return {"reply": f"收到: {msg.content}"}
Hono.js:TypeScript 生态的轻量级 Web 框架
import { Hono } from 'hono'
const app = new Hono()
app.post('/chat', async (c) => {
const { content } = await c.req.json<{ content: string }>()
// 调用 LLM、检索记忆、组装回复...
return c.json({ reply: `收到: ${content}` })
})
export default app
单看接口定义,两者都足够简洁。影响最终选择的,是它们依赖的运行时、能够使用的部署平台,以及各自擅长的应用场景
| 维度 | FastAPI | Hono.js |
|---|---|---|
| 语言 | Python | TypeScript / JavaScript |
| 执行环境 | Python ASGI 应用;可运行在服务器、容器,也可尝试 Python Workers | JavaScript 运行时(Node、Deno、Bun、Workers) |
| 定位 | 面向 Python 的 ASGI Web 框架 | 面向多种 JS 运行时的 Web 框架 |
| 类型与校验 | Python 类型标注、Pydantic、OpenAPI | TypeScript 类型、Schema 中间件、可选 RPC/OpenAPI |
| 当前项目适配度 | 适合独立 Python 服务或已有 Python 生态的团队 | 与现有 React、Next.js、TypeScript 工具链一致 |
3. 边缘运行时兼容性
运行时兼容性是这次选型中最先考虑的条件,因为它会直接限制部署平台。
FastAPI 是 ASGI 应用,传统部署通常由 Uvicorn 等 ASGI 服务器承载,适合服务器、容器和常规 Serverless 环境。Cloudflare 现在也提供了 Python Workers,可以通过 ASGI 适配器 运行 FastAPI;不过 Python Workers 仍处于 Beta,包支持、启动阶段和与 JavaScript 生态的互操作方式都需要单独评估
如果服务依赖特定的原生扩展、完整的 Python 科学计算栈,或者需要直接使用成熟的 Python 模型库,常规容器或 Python Serverless 往往更稳妥。若只是提供少量 API,也可以评估 Python Workers 是否满足实际依赖和性能要求。
Hono.js 在设计时就考虑了不同 JavaScript 运行时之间的兼容性:
下面是不同运行时的入口片段,实际项目应分别放在不同文件中,不能把多个入口合并到同一个模块:
worker.ts
import app from './app'
export default app
node.ts
import { serve } from '@hono/node-server'
import app from './app'
serve(app)
deno.ts
import app from './app'
Deno.serve(app.fetch)
同一套路由和业务代码可以复用在 Cloudflare Workers、Node.js、Deno 和 Bun 上,但入口文件、环境变量和平台 API 仍然需要分别配置。它带来的主要价值是减少框架层面的迁移成本,而不是保证所有平台的行为完全一致。
因此,在兼容性上,Hono.js 更能契合边缘部署方案
4. 冷启动与运行时开销
我们还需要比较 AWS Lambda、Vercel Functions 等 Serverless 场景的冷启动。冷启动取决于平台、运行时、依赖数量和初始化逻辑
| 维度 | FastAPI | Hono.js |
|---|---|---|
| 启动表现 | 受 Python 运行时、依赖和初始化逻辑影响 | 受 JS 运行时、代码体积和初始化逻辑影响 |
| 并发模型 | 由 ASGI 服务器和部署平台决定;CPU 密集任务仍受 Python 运行时限制 | 由具体 JS 运行时决定;Workers 使用 Isolate 隔离 |
| 评估方式 | 结合真实依赖测量冷启动与首字节时间 | 结合真实依赖测量冷启动与首字节时间 |
FastAPI 冷启动时需要加载 Python 解释器、依赖包以及所有被导入的模块。如果函数还依赖较大的数据处理或模型库,初始化时间可能明显增加
Hono.