构建 服务器

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;
server.ts
import { Hono } from "hono";

const app = new Hono();

app.get("/", (c) => c.text("🔥 Hello from Hono!"));

export default app;
server.ts
import { Elysia } from "elysia";

const app = new Elysia();

app.get("/", () => "🦊 Hello from Elysia!");

export default app.compile();
server.node.ts
import Express from "express";

const app = Express();

app.use("/", (_req, res) => {
  res.send("Hello from Express with Nitro!");
});

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 }
);

从一条命令开始

创建项目脚手架,或将 Vite 插件添加到你已有的应用中。
npx create-nitro-app