# 使用 Preact 进行 SSR > 在 Nitro 中使用 Vite 和 Preact 实现服务器端渲染。 ```json [package.json] { "type": "module", "scripts": { "build": "vite build", "preview": "vite preview", "dev": "vite dev" }, "devDependencies": { "@preact/preset-vite": "^2.10.3", "@tailwindcss/vite": "^4.1.18", "nitro": "latest", "preact": "^10.28.3", "preact-render-to-string": "^6.6.5", "tailwindcss": "^4.1.18", "vite": "beta" } } ``` ```json [tsconfig.json] { "extends": "nitro/tsconfig", "compilerOptions": { "jsx": "react-jsx", "jsxImportSource": "preact" } } ``` ```js [vite.config.mjs] import { defineConfig } from "vite"; import { nitro } from "nitro/vite"; import preact from "@preact/preset-vite"; export default defineConfig({ plugins: [nitro(), preact()], environments: { client: { build: { rollupOptions: { input: "./src/entry-client.tsx", }, }, }, }, }); ``` ```tsx [src/app.tsx] import { useState } from "preact/hooks"; export function App() { const [count, setCount] = useState(0); return ; } ``` ```tsx [src/entry-client.tsx] import { hydrate } from "preact"; import { App } from "./app.tsx"; function main() { hydrate(, document.querySelector("#app")!); } main(); ``` ```tsx [src/entry-server.tsx] import "./styles.css"; import { renderToReadableStream } from "preact-render-to-string/stream"; import { App } from "./app.jsx"; import clientAssets from "./entry-client?assets=client"; import serverAssets from "./entry-server?assets=ssr"; export default { async fetch(request: Request) { const url = new URL(request.url); const htmlStream = renderToReadableStream(); return new Response(htmlStream, { headers: { "Content-Type": "text/html;charset=utf-8" }, }); }, }; function Root(props: { url: URL }) { const assets = clientAssets.merge(serverAssets); return ( {assets.css.map((attr: any) => ( ))} {assets.js.map((attr: any) => ( ))}