静态文件服务
Hono 可以服务静态文件,但具体方式取决于运行时。Node.js 使用 @hono/node-server/serve-static,Cloudflare Workers 推荐使用平台的 Static Assets。
Node.js serveStatic
目录示例:
my-app/
├─ public/
│ ├─ favicon.ico
│ └─ hello.txt
└─ src/
└─ index.ts
代码:
import { serve } from '@hono/node-server'
import { serveStatic } from '@hono/node-server/serve-static'
import { Hono } from 'hono'
const app = new Hono()
app.use('/static/*', serveStatic({ root: './public' }))
app.use('/favicon.ico', serveStatic({ path: './public/favicon.ico' }))
serve(app)
访问 /static/hello.txt 会读取本地文件。
路径解析注意事项
root 相对的是当前工作目录 process.cwd(),不是源文件所在目录。如果你从不同目录启动 Node.js 进程,文件路径可能出错。
更稳定的写法是基于 import.meta.url:
import { fileURLToPath } from 'node:url'
import { serveStatic } from '@hono/node-server/serve-static'
const publicRoot = fileURLToPath(new URL('../public/', import.meta.url))
app.use('/static/*', serveStatic({ root: publicRoot }))
Cloudflare Workers 静态资源
Workers 项目推荐使用平台静态资源能力。在 wrangler.jsonc 中配置:
{
"name": "my-hono-worker",
"main": "src/index.ts",
"compatibility_date": "2026-09-29",
"assets": {
"directory": "public"
}
}
然后把文件放到 public/:
public/
├─ favicon.ico
└─ static/
└─ hello.txt
静态资源会由 Workers 平台处理,Hono 继续负责 API 路由。
API 与静态文件边界
建议把 API 和静态资源路径分开:
/api/* Hono API
/static/* 静态资源
/favicon.ico 静态图标
不要把所有请求都交给 Hono 再手写文件读取逻辑。能交给平台或静态资源服务器处理的内容,应优先交给它们处理。
缓存建议
- 带 hash 的静态资源可以设置长缓存。
- HTML 入口文件通常使用短缓存或不缓存。
- API 响应缓存要结合用户身份、权限和数据更新频率设计。
如果只是构建 API 服务,静态文件支持通常不是重点。需要完整前端构建时,可以考虑 Hono + Vite 或把前端单独部署。
相关内容
- Hono 是什么 介绍 Hono 的定位、核心特点、Web Standards 思路、多运行时能力,以及它与传统 Node.js Web 框架的差异。
- 安装和 Hello World 学习使用 create-hono 创建 Hono 项目,分别了解通用模板和 Node.js 模板的 Hello World 写法。
- 运行时选择 对比 Hono 在 Node.js、Cloudflare Workers、Bun、Deno 等运行时中的入口写法、部署方式和适用场景。
- 路由基础 学习 Hono 的 GET、POST、动态参数、通配符、路由分组和模块化路由写法。
- Context 详解 介绍 Hono Context 的 req、json、text、html、redirect、header、status、set、get 等常用 API。
- 中间件机制 学习 Hono 中间件的执行顺序、自定义中间件写法、路径匹配、next 调用和常见使用场景。