# 自定义渲染器
> 使用 Nitro 构建一个具有服务端数据获取功能的自定义 HTML 渲染器。
```ts [nitro.config.ts]
import { defineConfig } from "nitro";
export default defineConfig({
serverDir: "./",
renderer: { handler: "./renderer" },
});
```
```json [package.json]
{
"type": "module",
"scripts": {
"dev": "nitro dev",
"build": "nitro build"
},
"devDependencies": {
"nitro": "latest"
}
}
```
```ts [renderer.ts]
import { fetch } from "nitro";
export default async function renderer({ url }: { req: Request; url: URL }) {
const apiRes = await fetch("/api/hello").then((res) => res.text());
return new Response(
/* html */ `
Custom Renderer
Hello from custom renderer!
Current path: ${url.pathname}
API says: ${apiRes}
`,
{ headers: { "content-type": "text/html; charset=utf-8" } }
);
}
```
```json [tsconfig.json]
{
"extends": "nitro/tsconfig"
}
```
```ts [vite.config.ts]
import { defineConfig } from "vite";
import { nitro } from "nitro/vite";
export default defineConfig({ plugins: [nitro()] });
```
```ts [api/hello.ts]
import { defineHandler } from "nitro/h3";
export default defineHandler(() => "Nitro is amazing!");
```
创建一个自定义渲染器,用于生成包含 API 路由数据的 HTML 响应。使用 Nitro 内部的 `fetch` 调用路由,无需网络开销。
## 渲染器
```ts [renderer.ts]
import { fetch } from "nitro";
export default async function renderer({ url }: { req: Request; url: URL }) {
const apiRes = await fetch("/api/hello").then((res) => res.text());
return new Response(
/* html */ `
Custom Renderer
Hello from custom renderer!
当前路径: ${url.pathname}
API 响应: ${apiRes}
`,
{ headers: { "content-type": "text/html; charset=utf-8" } }
);
}
```
Nitro 会自动检测项目根目录中的 `renderer.ts` 并将其用于所有非 API 路由。渲染器函数接收请求 URL 并返回一个 `Response`。
使用来自 `nitro` 的 `fetch` 调用 API 路由,无需网络开销——这些请求在进程内完成。
## API 路由
```ts [api/hello.ts]
import { defineHandler } from "nitro/h3";
export default defineHandler(() => "Nitro 非常棒!");
```
在 `api/` 目录中定义 API 路由。当渲染器调用 `fetch("/api/hello")` 时,该处理器执行并返回响应。
## 了解更多
- [渲染器](/docs/renderer)