构建 服务器
Nitro 构建可在任何地方运行的生产就绪服务器。
编写 API 路由,然后无需任何配置即可将同一代码库部署到 Node.js、Bun、Deno 或无服务器环境。
3.8 kB
Gzip 压缩后输出
0
运行时依赖
25+
部署目标
~50 ms
冷启动
路由
文件即路由
将文件放入
routes/,它就会成为一个路由。在文件名后追加 HTTP 方法来限定它,将文件夹嵌套以表示路径参数,并用括号包裹文件夹来对路由分组,而不会影响 URL。- 路由会被编译,包中不会包含运行时路由器
- 动态参数、通配符和按方法区分的文件
- 路由组可以整理文件,而不会改变 URL
routes/
- hello.get.tsGET/hello
- hello.post.tsPOST/hello
- api/test.tsANY/api/test
- api/[org]/[repo].tsANY/api/:org/:repo
- (admin)/users.tsANY/users
服务器入口
使用你自己的框架
任何支持 Web
服务器入口文档 fetch(request): Response 接口的框架都可以作为你的服务器入口,只需在 server.ts 中导出它,它就会在匹配路由之前处理每个请求。Node 风格的 (req, res) 框架同样适用:将文件命名为 server.node.ts,Nitro 会对其进行适配。server.ts
import { H3 } from "h3";
const app = new H3();
app.get("/", () => "⚡️ Hello from H3!");
export default app;部署
一个代码库,适用于所有平台
同一个服务器可以构建到 Node.js、Deno、Bun、边缘 Worker 和无服务器函数。Nitro 会生成每个主机所需的输出格式,因此在它们之间迁移无需修改代码!
- CI 中会自动检测提供商,无需安装适配器
- 通过单个 `preset` 选项切换目标
- 兼容性日期可让提供商行为长期保持稳定
输出
小到足以阅读
一个最小 Nitro 服务器的生产构建仅包含三个文件,无需在旁边安装任何内容。依赖会被打包并进行 Tree Shaking,因此你部署的就是自己编写的代码,以及让它运行所需的少量代码。
构建你的第一个服务器 未压缩16.2 kB
已压缩8.8 kB
已压缩 + Gzip 压缩3.8 kB
缓存
与存储相匹配的缓存
包装一个处理器或任意异步函数,Nitro 就会在你的应用已经使用的同一存储层上缓存其结果:开发环境中使用内存,生产环境中则使用 Redis、Cloudflare KV、Vercel Blob 存储或文件系统。代码相同,后端不同。
- 默认使用 stale-while-revalidate 响应
- 开箱即用地支持 ETag、last-modified 和 304 处理
- 对同一键的并发请求共享单次调用
routes/stars.ts
import { defineCachedHandler } from "nitro/cache";
export default defineCachedHandler(
async () => {
const res = await fetch("https://api.github.com/repos/nitrojs/nitro");
const { stargazers_count } = await res.json();
return { stars: stargazers_count };
},
{ maxAge: 60 * 60 }
);内置功能
服务器所需的一切
大多数应用都会用到的功能都已随 Nitro 一起提供,并且在每个部署目标上的行为都相同。
KV 存储
在文件系统、Redis、Cloudflare KV 等之上提供统一的键值 API。
数据库
实验性由 db0 驱动的 SQL 层,已预配置 SQLite。
任务
实验性一次性运行时操作,可从 CLI 运行或按 cron 计划运行。
WebSockets
基于 crossws 构建的跨运行时 WebSocket 支持。
插件
从 plugins/ 目录接入服务器生命周期。
OpenAPI
实验性根据你的处理器生成规范,并通过 Scalar 或 Swagger UI 提供服务。
资源
直接提供公共文件,在运行时读取服务器资源。
渲染器
用于处理未匹配路由的兜底处理器,可用于 SSR、SPA 外壳或纯 HTML。
生命周期
请求按顺序经过的每一层,以及拦截请求的位置。