nitro 3.0.1-alpha.2 → 3.0.260415-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +6 -0
- package/README.md +2 -2
- package/dist/THIRD-PARTY-LICENSES.md +1646 -0
- package/dist/_build/common.mjs +7261 -3812
- package/dist/_build/rolldown.mjs +32 -42
- package/dist/_build/rollup.mjs +28 -48
- package/dist/_build/vite.build.mjs +10 -10
- package/dist/_chunks/nitro.mjs +102 -327
- package/dist/_chunks/nitro2.mjs +8 -9
- package/dist/_chunks/nitro3.mjs +136 -0
- package/dist/_chunks/nitro4.mjs +127 -0
- package/dist/_chunks/utils.mjs +40 -29
- package/dist/_common.mjs +13 -25
- package/dist/_dev.d.mts +0 -3
- package/dist/{_chunks/dev.mjs → _dev.mjs} +132 -330
- package/dist/_libs/_.mjs +2 -0
- package/dist/_libs/_2.mjs +2 -0
- package/dist/_libs/_3.mjs +2 -0
- package/dist/_libs/_4.mjs +2 -0
- package/dist/_libs/_5.mjs +2 -0
- package/dist/_libs/_6.mjs +2 -0
- package/dist/_libs/_7.mjs +2 -0
- package/dist/_libs/c12+rc9.mjs +814 -0
- package/dist/_libs/{c12+giget+readdirp+chokidar.d.mts → c12+readdirp+chokidar.d.mts} +49 -40
- package/dist/_libs/citty.mjs +142 -41
- package/dist/_libs/commondir+is-reference.mjs +60 -56
- package/dist/_libs/compatx.d.mts +0 -2
- package/dist/_libs/compatx.mjs +1 -4
- package/dist/_libs/esbuild.d.mts +0 -1
- package/dist/_libs/escape-string-regexp.mjs +1 -4
- package/dist/_libs/{pluginutils+plugin-commonjs.d.mts → estree+pluginutils.d.mts} +0 -5
- package/dist/_libs/estree-walker.mjs +4 -92
- package/dist/_libs/exsolve.d.mts +1 -0
- package/dist/_libs/hasown+resolve+deepmerge.mjs +160 -246
- package/dist/_libs/httpxy.d.mts +20 -13
- package/dist/_libs/httpxy.mjs +519 -95
- package/dist/_libs/js-tokens.d.mts +1 -0
- package/dist/_libs/klona.mjs +1 -4
- package/dist/_libs/magic-string.d.mts +0 -2
- package/dist/_libs/mlly.d.mts +0 -2
- package/dist/_libs/nypm+tinyexec.mjs +822 -0
- package/dist/_libs/perfect-debounce.mjs +68 -0
- package/dist/_libs/pkg-types.d.mts +0 -3
- package/dist/_libs/plugin-alias.mjs +1 -5
- package/dist/_libs/plugin-inject.mjs +1 -7
- package/dist/_libs/plugin-json.mjs +1 -5
- package/dist/_libs/pluginutils.mjs +3 -35
- package/dist/_libs/readdirp+chokidar.mjs +187 -365
- package/dist/_libs/remapping.mjs +1 -5
- package/dist/_libs/resolve-uri+gen-mapping.mjs +15 -53
- package/dist/_libs/rou3.d.mts +1 -4
- package/dist/_libs/rou3.mjs +223 -78
- package/dist/_libs/std-env.d.mts +8 -2
- package/dist/_libs/strip-literal.d.mts +1 -0
- package/dist/_libs/tsconfck.mjs +21 -334
- package/dist/_libs/ultrahtml.mjs +3 -16
- package/dist/_libs/unimport+unplugin.mjs +244 -388
- package/dist/_libs/unplugin+unimport.d.mts +5 -15
- package/dist/_libs/unwasm.d.mts +0 -3
- package/dist/_presets.mjs +576 -488
- package/dist/builder.d.mts +5 -25
- package/dist/builder.mjs +3 -8
- package/dist/cli/_chunks/build.mjs +22 -25
- package/dist/cli/_chunks/common.mjs +1 -4
- package/dist/cli/_chunks/deploy.mjs +37 -0
- package/dist/cli/_chunks/dev.mjs +6 -11
- package/dist/cli/_chunks/docs.mjs +28 -0
- package/dist/cli/_chunks/list.mjs +4 -8
- package/dist/cli/_chunks/prepare.mjs +2 -6
- package/dist/cli/_chunks/preview.mjs +48 -0
- package/dist/cli/_chunks/run.mjs +7 -11
- package/dist/cli/_chunks/task.mjs +1 -5
- package/dist/cli/index.mjs +5 -6
- package/dist/docs/0.docs/0.index/index.md +56 -0
- package/dist/docs/0.docs/1.quick-start.md +110 -0
- package/dist/docs/0.docs/10.lifecycle.md +204 -0
- package/dist/docs/0.docs/11.openapi.md +291 -0
- package/dist/docs/0.docs/12.plugins.md +164 -0
- package/dist/docs/0.docs/13.tasks.md +277 -0
- package/dist/docs/0.docs/14.websocket.md +386 -0
- package/dist/docs/0.docs/15.migration.md +213 -0
- package/dist/docs/0.docs/16.nightly.md +31 -0
- package/dist/docs/0.docs/2.renderer.md +322 -0
- package/dist/docs/0.docs/3.routing.md +711 -0
- package/dist/docs/0.docs/4.server-entry.md +239 -0
- package/dist/docs/0.docs/5.cache.md +408 -0
- package/dist/docs/0.docs/6.storage.md +261 -0
- package/dist/docs/0.docs/7.assets.md +166 -0
- package/dist/docs/0.docs/8.configuration.md +256 -0
- package/dist/docs/0.docs/9.database.md +185 -0
- package/dist/docs/1.deploy/0.index/index.md +64 -0
- package/dist/docs/1.deploy/1.runtimes/0.node.md +63 -0
- package/dist/docs/1.deploy/1.runtimes/1.bun.md +15 -0
- package/dist/docs/1.deploy/1.runtimes/2.deno.md +19 -0
- package/dist/docs/1.deploy/2.providers/0.alwaysdata.md +50 -0
- package/dist/docs/1.deploy/2.providers/1.aws.md +47 -0
- package/dist/docs/1.deploy/2.providers/10.flightcontrol.md +67 -0
- package/dist/docs/1.deploy/2.providers/11.genezio.md +67 -0
- package/dist/docs/1.deploy/2.providers/12.github-pages.md +68 -0
- package/dist/docs/1.deploy/2.providers/13.gitlab-pages.md +37 -0
- package/dist/docs/1.deploy/2.providers/14.heroku.md +84 -0
- package/dist/docs/1.deploy/2.providers/15.iis.md +38 -0
- package/dist/docs/1.deploy/2.providers/16.koyeb.md +109 -0
- package/dist/docs/1.deploy/2.providers/17.netlify.md +47 -0
- package/dist/docs/1.deploy/2.providers/18.platform-sh.md +37 -0
- package/dist/docs/1.deploy/2.providers/19.render.md +37 -0
- package/dist/docs/1.deploy/2.providers/2.aws-amplify.md +81 -0
- package/dist/docs/1.deploy/2.providers/20.stormkit.md +24 -0
- package/dist/docs/1.deploy/2.providers/21.vercel.md +270 -0
- package/dist/docs/1.deploy/2.providers/22.zeabur.md +19 -0
- package/dist/docs/1.deploy/2.providers/23.zephyr.md +99 -0
- package/dist/docs/1.deploy/2.providers/24.zerops.md +102 -0
- package/dist/docs/1.deploy/2.providers/3.azure.md +72 -0
- package/dist/docs/1.deploy/2.providers/4.cleavr.md +33 -0
- package/dist/docs/1.deploy/2.providers/5.cloudflare.md +369 -0
- package/dist/docs/1.deploy/2.providers/6.deno-deploy.md +66 -0
- package/dist/docs/1.deploy/2.providers/7.digitalocean.md +46 -0
- package/dist/docs/1.deploy/2.providers/8.edgeone.md +20 -0
- package/dist/docs/1.deploy/2.providers/9.firebase.md +32 -0
- package/dist/docs/2.config/0.index/index.md +1221 -0
- package/dist/docs/3.examples/0.index/index.md +3 -0
- package/dist/docs/3.examples/1.api-routes.md +145 -0
- package/dist/docs/3.examples/10.hono.md +74 -0
- package/dist/docs/3.examples/11.import-alias.md +97 -0
- package/dist/docs/3.examples/12.middleware.md +91 -0
- package/dist/docs/3.examples/13.mono-jsx.md +68 -0
- package/dist/docs/3.examples/14.nano-jsx.md +70 -0
- package/dist/docs/3.examples/15.plugins.md +91 -0
- package/dist/docs/3.examples/16.renderer.md +113 -0
- package/dist/docs/3.examples/17.runtime-config.md +97 -0
- package/dist/docs/3.examples/18.server-fetch.md +87 -0
- package/dist/docs/3.examples/19.shiki.md +198 -0
- package/dist/docs/3.examples/2.auto-imports.md +92 -0
- package/dist/docs/3.examples/20.virtual-routes.md +74 -0
- package/dist/docs/3.examples/21.vite-nitro-plugin.md +79 -0
- package/dist/docs/3.examples/22.vite-rsc.md +1041 -0
- package/dist/docs/3.examples/23.vite-ssr-html.md +217 -0
- package/dist/docs/3.examples/24.vite-ssr-preact.md +247 -0
- package/dist/docs/3.examples/25.vite-ssr-react.md +226 -0
- package/dist/docs/3.examples/26.vite-ssr-solid.md +256 -0
- package/dist/docs/3.examples/27.vite-ssr-tsr-react.md +442 -0
- package/dist/docs/3.examples/28.vite-ssr-tss-react.md +444 -0
- package/dist/docs/3.examples/29.vite-ssr-vue-router.md +617 -0
- package/dist/docs/3.examples/3.cached-handler.md +81 -0
- package/dist/docs/3.examples/30.vite-trpc.md +335 -0
- package/dist/docs/3.examples/31.websocket.md +282 -0
- package/dist/docs/3.examples/4.custom-error-handler.md +98 -0
- package/dist/docs/3.examples/5.database.md +157 -0
- package/dist/docs/3.examples/6.elysia.md +70 -0
- package/dist/docs/3.examples/7.express.md +78 -0
- package/dist/docs/3.examples/8.fastify.md +79 -0
- package/dist/docs/3.examples/9.hello-world.md +68 -0
- package/dist/docs/README.md +86 -0
- package/dist/docs/index.md +121 -0
- package/dist/node_modules/@poppinss/dumper/build/formatters/html/main.js +8 -0
- package/dist/node_modules/@poppinss/dumper/package.json +1 -1
- package/dist/node_modules/@speed-highlight/core/dist/index.js +4 -4
- package/dist/node_modules/@speed-highlight/core/dist/terminal.js +2 -2
- package/dist/node_modules/@speed-highlight/core/package.json +1 -1
- package/dist/node_modules/cookie-es/dist/index.mjs +299 -250
- package/dist/node_modules/cookie-es/package.json +26 -23
- package/dist/node_modules/croner/dist/croner.js +1 -1
- package/dist/node_modules/croner/package.json +11 -1
- package/dist/node_modules/defu/dist/defu.mjs +2 -2
- package/dist/node_modules/defu/package.json +33 -28
- package/dist/node_modules/rendu/dist/_chunks/libs/cookie-es.mjs +151 -0
- package/dist/node_modules/rendu/dist/index.mjs +5 -112
- package/dist/node_modules/rendu/package.json +25 -24
- package/dist/node_modules/youch/build/helpers-B9BQYaS6.js +23 -0
- package/dist/node_modules/youch/build/index.js +204 -351
- package/dist/node_modules/youch/build/public/error_info/script.js +1 -1
- package/dist/node_modules/youch/build/public_dir-C5bujZKB.js +25 -0
- package/dist/node_modules/youch/build/src/templates/error_cause/main.js +44 -0
- package/dist/node_modules/youch/build/src/templates/error_info/main.js +72 -0
- package/dist/node_modules/youch/build/src/templates/error_metadata/main.js +65 -0
- package/dist/node_modules/youch/build/src/templates/error_stack/main.js +152 -0
- package/dist/node_modules/youch/build/src/templates/error_stack_source/main.js +46 -0
- package/dist/node_modules/youch/build/src/templates/header/main.js +24 -0
- package/dist/node_modules/youch/build/src/templates/layout/main.js +27 -0
- package/dist/node_modules/youch/package.json +35 -32
- package/dist/presets/_nitro/runtime/nitro-dev.mjs +12 -57
- package/dist/presets/_nitro/runtime/nitro-prerenderer.mjs +1 -0
- package/dist/presets/_nitro/runtime/service-worker.mjs +1 -2
- package/dist/presets/aws-lambda/runtime/_utils.mjs +6 -6
- package/dist/presets/aws-lambda/runtime/aws-lambda-streaming.mjs +3 -1
- package/dist/presets/azure/runtime/_utils.mjs +5 -5
- package/dist/presets/azure/runtime/azure-swa.mjs +5 -5
- package/dist/presets/bun/runtime/bun.mjs +9 -6
- package/dist/presets/cloudflare/runtime/_module-handler.mjs +1 -1
- package/dist/presets/cloudflare/runtime/cloudflare-durable.mjs +4 -4
- package/dist/presets/cloudflare/runtime/cloudflare-module.mjs +3 -3
- package/dist/presets/cloudflare/runtime/cloudflare-pages.mjs +2 -2
- package/dist/presets/cloudflare/runtime/plugin.dev.mjs +10 -21
- package/dist/presets/deno/runtime/deno-deploy.mjs +4 -4
- package/dist/presets/deno/runtime/deno-server.mjs +9 -6
- package/dist/presets/edgeone/runtime/edgeone.mjs +10 -0
- package/dist/presets/netlify/runtime/netlify-edge.mjs +2 -3
- package/dist/presets/netlify/runtime/netlify.mjs +1 -1
- package/dist/presets/node/runtime/node-cluster.mjs +5 -4
- package/dist/presets/node/runtime/node-middleware.mjs +1 -1
- package/dist/presets/node/runtime/node-server.mjs +8 -5
- package/dist/presets/stormkit/runtime/stormkit.mjs +1 -2
- package/dist/presets/vercel/runtime/cron-handler.mjs +25 -0
- package/dist/presets/vercel/runtime/queue-handler.mjs +21 -0
- package/dist/presets/vercel/runtime/vercel.node.mjs +3 -3
- package/dist/presets/vercel/runtime/vercel.web.mjs +3 -5
- package/dist/presets/winterjs/runtime/winterjs.mjs +10 -10
- package/dist/presets/zephyr/runtime/server.mjs +3 -0
- package/dist/runtime/internal/app.mjs +12 -11
- package/dist/runtime/internal/cache.d.mts +0 -4
- package/dist/runtime/internal/cache.mjs +32 -256
- package/dist/runtime/internal/context.d.mts +3 -1
- package/dist/runtime/internal/context.mjs +1 -9
- package/dist/runtime/internal/error/dev.d.mts +5 -4
- package/dist/runtime/internal/error/dev.mjs +47 -49
- package/dist/runtime/internal/error/hooks.d.mts +1 -1
- package/dist/runtime/internal/error/prod.d.mts +2 -5
- package/dist/runtime/internal/error/prod.mjs +19 -33
- package/dist/runtime/internal/error/utils.d.mts +4 -4
- package/dist/runtime/internal/meta.d.mts +1 -1
- package/dist/runtime/internal/plugin.d.mts +2 -2
- package/dist/runtime/internal/route-rules.d.mts +11 -4
- package/dist/runtime/internal/route-rules.mjs +15 -5
- package/dist/runtime/internal/routes/dev-tasks.d.mts +3 -2
- package/dist/runtime/internal/routes/dev-tasks.mjs +15 -10
- package/dist/runtime/internal/routes/openapi.mjs +2 -2
- package/dist/runtime/internal/routes/renderer-template.d.mts +1 -1
- package/dist/runtime/internal/routes/renderer-template.dev.d.mts +2 -1
- package/dist/runtime/internal/routes/scalar.mjs +3 -3
- package/dist/runtime/internal/routes/swagger.mjs +7 -4
- package/dist/runtime/internal/runtime-config.d.mts +1 -1
- package/dist/runtime/internal/runtime-config.mjs +2 -2
- package/dist/runtime/internal/static.mjs +5 -4
- package/dist/runtime/internal/task.d.mts +3 -1
- package/dist/runtime/internal/task.mjs +7 -7
- package/dist/runtime/internal/vite/dev-entry.mjs +6 -3
- package/dist/runtime/internal/vite/dev-worker.mjs +264 -0
- package/dist/runtime/meta.d.mts +1 -0
- package/dist/runtime/meta.mjs +2 -0
- package/dist/runtime/nitro.d.mts +2 -0
- package/dist/runtime/nitro.mjs +4 -2
- package/dist/runtime/virtual/error-handler.mjs +1 -1
- package/dist/runtime/virtual/renderer-template.mjs +1 -1
- package/dist/runtime/virtual/server-assets.d.mts +2 -1
- package/dist/runtime/virtual/tracing.d.mts +5 -0
- package/dist/runtime/virtual/tracing.mjs +1 -0
- package/dist/runtime/vite.d.mts +1 -1
- package/dist/types/index.d.mts +215 -195
- package/dist/types/index.mjs +1 -11
- package/dist/vite.d.mts +3 -8
- package/dist/vite.mjs +285 -253
- package/lib/tsconfig.json +3 -5
- package/package.json +97 -80
- package/dist/_libs/confbox.mjs +0 -2509
- package/dist/_libs/nypm+giget+tinyexec.mjs +0 -3603
- package/dist/_libs/rc9+c12+dotenv.mjs +0 -972
- package/dist/node_modules/hookable/dist/index.mjs +0 -266
- package/dist/node_modules/hookable/package.json +0 -52
- package/dist/node_modules/youch/build/chunk-4L7RY2JA.js +0 -42
- package/dist/node_modules/youch/build/chunk-7QV3D5YX.js +0 -83
- package/dist/node_modules/youch/build/chunk-AUGPHE32.js +0 -39
- package/dist/node_modules/youch/build/chunk-CM7DWJNZ.js +0 -44
- package/dist/node_modules/youch/build/chunk-EJH674NB.js +0 -223
- package/dist/node_modules/youch/build/chunk-OIJ3WD7L.js +0 -81
- package/dist/node_modules/youch/build/chunk-P36L72PL.js +0 -87
- package/dist/node_modules/youch/build/chunk-PE3GG3TN.js +0 -65
- package/dist/node_modules/youch/build/chunk-X53OIOJH.js +0 -70
- package/dist/presets/_nitro/runtime/nitro-dev.d.mts +0 -2
- package/dist/presets/_nitro/runtime/nitro-prerenderer.d.mts +0 -3
- package/dist/presets/_nitro/runtime/service-worker.d.mts +0 -2
- package/dist/presets/aws-amplify/runtime/aws-amplify.d.mts +0 -2
- package/dist/presets/aws-lambda/runtime/_utils.d.mts +0 -8
- package/dist/presets/aws-lambda/runtime/aws-lambda-streaming.d.mts +0 -2
- package/dist/presets/aws-lambda/runtime/aws-lambda.d.mts +0 -3
- package/dist/presets/azure/runtime/_utils.d.mts +0 -2
- package/dist/presets/azure/runtime/azure-swa.d.mts +0 -5
- package/dist/presets/bun/runtime/bun.d.mts +0 -3
- package/dist/presets/cloudflare/runtime/_module-handler.d.mts +0 -16
- package/dist/presets/cloudflare/runtime/cloudflare-durable.d.mts +0 -11
- package/dist/presets/cloudflare/runtime/cloudflare-module.d.mts +0 -3
- package/dist/presets/cloudflare/runtime/cloudflare-pages.d.mts +0 -20
- package/dist/presets/cloudflare/runtime/plugin.dev.d.mts +0 -3
- package/dist/presets/deno/runtime/deno-deploy.d.mts +0 -5
- package/dist/presets/deno/runtime/deno-server.d.mts +0 -3
- package/dist/presets/netlify/runtime/netlify-edge.d.mts +0 -3
- package/dist/presets/netlify/runtime/netlify.d.mts +0 -4
- package/dist/presets/node/runtime/node-cluster.d.mts +0 -3
- package/dist/presets/node/runtime/node-middleware.d.mts +0 -3
- package/dist/presets/node/runtime/node-server.d.mts +0 -3
- package/dist/presets/standard/runtime/server.d.mts +0 -3
- package/dist/presets/stormkit/runtime/stormkit.d.mts +0 -21
- package/dist/presets/vercel/runtime/isr.d.mts +0 -2
- package/dist/presets/vercel/runtime/vercel.node.d.mts +0 -3
- package/dist/presets/vercel/runtime/vercel.web.d.mts +0 -8
- package/dist/presets/winterjs/runtime/winterjs.d.mts +0 -2
- package/dist/presets/zeabur/runtime/zeabur.d.mts +0 -3
- package/dist/runtime/internal/vite/node-runner.mjs +0 -359
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# Custom Renderer
|
|
2
|
+
|
|
3
|
+
> Build a custom HTML renderer in Nitro with server-side data fetching.
|
|
4
|
+
|
|
5
|
+
<code-tree>
|
|
6
|
+
|
|
7
|
+
```ts [nitro.config.ts]
|
|
8
|
+
import { defineConfig } from "nitro";
|
|
9
|
+
|
|
10
|
+
export default defineConfig({
|
|
11
|
+
serverDir: "./",
|
|
12
|
+
renderer: { handler: "./renderer" },
|
|
13
|
+
});
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
```json [package.json]
|
|
17
|
+
{
|
|
18
|
+
"type": "module",
|
|
19
|
+
"scripts": {
|
|
20
|
+
"dev": "nitro dev",
|
|
21
|
+
"build": "nitro build"
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"nitro": "latest"
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
```ts [renderer.ts]
|
|
30
|
+
import { fetch } from "nitro";
|
|
31
|
+
|
|
32
|
+
export default async function renderer({ url }: { req: Request; url: URL }) {
|
|
33
|
+
const apiRes = await fetch("/api/hello").then((res) => res.text());
|
|
34
|
+
return new Response(
|
|
35
|
+
/* html */ `<!DOCTYPE html>
|
|
36
|
+
<html>
|
|
37
|
+
<head>
|
|
38
|
+
<title>Custom Renderer</title>
|
|
39
|
+
</head>
|
|
40
|
+
<body>
|
|
41
|
+
<h1>Hello from custom renderer!</h1>
|
|
42
|
+
<p>Current path: ${url.pathname}</p>
|
|
43
|
+
<p>API says: ${apiRes}</p>
|
|
44
|
+
</body>
|
|
45
|
+
</html>`,
|
|
46
|
+
{ headers: { "content-type": "text/html; charset=utf-8" } }
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
```json [tsconfig.json]
|
|
52
|
+
{
|
|
53
|
+
"extends": "nitro/tsconfig"
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
```ts [vite.config.ts]
|
|
58
|
+
import { defineConfig } from "vite";
|
|
59
|
+
import { nitro } from "nitro/vite";
|
|
60
|
+
|
|
61
|
+
export default defineConfig({ plugins: [nitro()] });
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
```ts [api/hello.ts]
|
|
65
|
+
import { defineHandler } from "nitro";
|
|
66
|
+
|
|
67
|
+
export default defineHandler(() => "Nitro is amazing!");
|
|
68
|
+
```
|
|
69
|
+
</code-tree>
|
|
70
|
+
|
|
71
|
+
Create a custom renderer that generates HTML responses with data from API routes. Use Nitro's internal `fetch` to call routes without network overhead.
|
|
72
|
+
|
|
73
|
+
## Renderer
|
|
74
|
+
|
|
75
|
+
```ts [renderer.ts]
|
|
76
|
+
import { fetch } from "nitro";
|
|
77
|
+
|
|
78
|
+
export default async function renderer({ url }: { req: Request; url: URL }) {
|
|
79
|
+
const apiRes = await fetch("/api/hello").then((res) => res.text());
|
|
80
|
+
return new Response(
|
|
81
|
+
/* html */ `<!DOCTYPE html>
|
|
82
|
+
<html>
|
|
83
|
+
<head>
|
|
84
|
+
<title>Custom Renderer</title>
|
|
85
|
+
</head>
|
|
86
|
+
<body>
|
|
87
|
+
<h1>Hello from custom renderer!</h1>
|
|
88
|
+
<p>Current path: ${url.pathname}</p>
|
|
89
|
+
<p>API says: ${apiRes}</p>
|
|
90
|
+
</body>
|
|
91
|
+
</html>`,
|
|
92
|
+
{ headers: { "content-type": "text/html; charset=utf-8" } }
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Nitro auto-detects `renderer.ts` in your project root and uses it for all non-API routes. The renderer function receives the request URL and returns a `Response`.
|
|
98
|
+
|
|
99
|
+
Use `fetch` from `nitro` to call API routes without network overhead—these requests stay in-process.
|
|
100
|
+
|
|
101
|
+
## API Route
|
|
102
|
+
|
|
103
|
+
```ts [api/hello.ts]
|
|
104
|
+
import { defineHandler } from "nitro";
|
|
105
|
+
|
|
106
|
+
export default defineHandler(() => "Nitro is amazing!");
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Define API routes in the `api/` directory. When the renderer calls `fetch("/api/hello")`, this handler runs and returns its response.
|
|
110
|
+
|
|
111
|
+
## Learn More
|
|
112
|
+
|
|
113
|
+
- [Renderer](/docs/renderer)
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# Runtime Config
|
|
2
|
+
|
|
3
|
+
> Environment-aware configuration with runtime access.
|
|
4
|
+
|
|
5
|
+
<code-tree>
|
|
6
|
+
|
|
7
|
+
```ts [nitro.config.ts]
|
|
8
|
+
import { defineConfig } from "nitro";
|
|
9
|
+
|
|
10
|
+
export default defineConfig({
|
|
11
|
+
serverDir: "./",
|
|
12
|
+
runtimeConfig: {
|
|
13
|
+
apiKey: "",
|
|
14
|
+
},
|
|
15
|
+
});
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
```json [package.json]
|
|
19
|
+
{
|
|
20
|
+
"type": "module",
|
|
21
|
+
"scripts": {
|
|
22
|
+
"dev": "nitro dev",
|
|
23
|
+
"build": "nitro build"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"nitro": "latest"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
```ts [server.ts]
|
|
32
|
+
import { defineHandler } from "nitro";
|
|
33
|
+
import { useRuntimeConfig } from "nitro/runtime-config";
|
|
34
|
+
|
|
35
|
+
export default defineHandler((event) => {
|
|
36
|
+
const runtimeConfig = useRuntimeConfig();
|
|
37
|
+
return { runtimeConfig };
|
|
38
|
+
});
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
```json [tsconfig.json]
|
|
42
|
+
{
|
|
43
|
+
"extends": "nitro/tsconfig"
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
```ts [vite.config.ts]
|
|
48
|
+
import { defineConfig } from "vite";
|
|
49
|
+
import { nitro } from "nitro/vite";
|
|
50
|
+
|
|
51
|
+
export default defineConfig({ plugins: [nitro()] });
|
|
52
|
+
```
|
|
53
|
+
</code-tree>
|
|
54
|
+
|
|
55
|
+
Runtime config lets you define configuration values that can be overridden by environment variables at runtime.
|
|
56
|
+
|
|
57
|
+
## Define Config Schema
|
|
58
|
+
|
|
59
|
+
Declare your runtime config with default values in `nitro.config.ts`:
|
|
60
|
+
|
|
61
|
+
```ts [nitro.config.ts]
|
|
62
|
+
import { defineConfig } from "nitro";
|
|
63
|
+
|
|
64
|
+
export default defineConfig({
|
|
65
|
+
serverDir: "./",
|
|
66
|
+
runtimeConfig: {
|
|
67
|
+
apiKey: "",
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Access at Runtime
|
|
73
|
+
|
|
74
|
+
Use `useRuntimeConfig` to access configuration values in your handlers:
|
|
75
|
+
|
|
76
|
+
```ts [server.ts]
|
|
77
|
+
import { defineHandler } from "nitro";
|
|
78
|
+
import { useRuntimeConfig } from "nitro/runtime-config";
|
|
79
|
+
|
|
80
|
+
export default defineHandler((event) => {
|
|
81
|
+
const runtimeConfig = useRuntimeConfig();
|
|
82
|
+
return { runtimeConfig };
|
|
83
|
+
});
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Environment Variables
|
|
87
|
+
|
|
88
|
+
Override config values via environment variables prefixed with `NITRO_`:
|
|
89
|
+
|
|
90
|
+
```sh [.env]
|
|
91
|
+
# NEVER COMMIT SENSITIVE DATA. THIS IS ONLY FOR DEMO PURPOSES.
|
|
92
|
+
NITRO_API_KEY=secret-api-key
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Learn More
|
|
96
|
+
|
|
97
|
+
- [Configuration](/docs/configuration)
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# Server Fetch
|
|
2
|
+
|
|
3
|
+
> Internal server-to-server requests without network overhead.
|
|
4
|
+
|
|
5
|
+
<code-tree>
|
|
6
|
+
|
|
7
|
+
```ts [nitro.config.ts]
|
|
8
|
+
import { defineConfig, serverFetch } from "nitro";
|
|
9
|
+
|
|
10
|
+
export default defineConfig({
|
|
11
|
+
serverDir: "./",
|
|
12
|
+
hooks: {
|
|
13
|
+
"dev:start": async () => {
|
|
14
|
+
const res = await serverFetch("/hello");
|
|
15
|
+
const text = await res.text();
|
|
16
|
+
console.log("Fetched /hello in nitro module:", res.status, text);
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
```json [package.json]
|
|
23
|
+
{
|
|
24
|
+
"type": "module",
|
|
25
|
+
"scripts": {
|
|
26
|
+
"dev": "nitro dev",
|
|
27
|
+
"build": "nitro build"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"nitro": "latest"
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
```json [tsconfig.json]
|
|
36
|
+
{
|
|
37
|
+
"extends": "nitro/tsconfig"
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
```ts [vite.config.ts]
|
|
42
|
+
import { defineConfig } from "vite";
|
|
43
|
+
import { nitro } from "nitro/vite";
|
|
44
|
+
|
|
45
|
+
export default defineConfig({ plugins: [nitro()] });
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
```ts [routes/hello.ts]
|
|
49
|
+
import { defineHandler } from "nitro";
|
|
50
|
+
|
|
51
|
+
export default defineHandler(() => "Hello!");
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
```ts [routes/index.ts]
|
|
55
|
+
import { defineHandler } from "nitro";
|
|
56
|
+
import { fetch } from "nitro";
|
|
57
|
+
|
|
58
|
+
export default defineHandler(() => fetch("/hello"));
|
|
59
|
+
```
|
|
60
|
+
</code-tree>
|
|
61
|
+
|
|
62
|
+
When you need one route to call another, use Nitro's `fetch` function instead of the global fetch. It makes internal requests that stay in-process, avoiding network round-trips. The request never leaves the server.
|
|
63
|
+
|
|
64
|
+
## Main Route
|
|
65
|
+
|
|
66
|
+
```ts [routes/index.ts]
|
|
67
|
+
import { defineHandler } from "nitro";
|
|
68
|
+
import { fetch } from "nitro";
|
|
69
|
+
|
|
70
|
+
export default defineHandler(() => fetch("/hello"));
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
The index route imports `fetch` from `nitro` (not the global fetch) and calls the `/hello` route. This request is handled internally without going through the network stack.
|
|
74
|
+
|
|
75
|
+
## Internal API Route
|
|
76
|
+
|
|
77
|
+
```ts [routes/hello.ts]
|
|
78
|
+
import { defineHandler } from "nitro";
|
|
79
|
+
|
|
80
|
+
export default defineHandler(() => "Hello!");
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
A simple route that returns "Hello!". When the index route calls `fetch("/hello")`, this handler runs and its response is returned directly.
|
|
84
|
+
|
|
85
|
+
## Learn More
|
|
86
|
+
|
|
87
|
+
- [Routing](/docs/routing)
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
# Shiki
|
|
2
|
+
|
|
3
|
+
> Server-side syntax highlighting in Nitro with Shiki.
|
|
4
|
+
|
|
5
|
+
<code-tree>
|
|
6
|
+
|
|
7
|
+
```html [index.html]
|
|
8
|
+
<!doctype html>
|
|
9
|
+
<html lang="en">
|
|
10
|
+
<head>
|
|
11
|
+
<meta charset="utf-8" />
|
|
12
|
+
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
|
13
|
+
<title>Hello World Snippet</title>
|
|
14
|
+
<link rel="stylesheet" href="styles.css" />
|
|
15
|
+
</head>
|
|
16
|
+
<body>
|
|
17
|
+
<div class="card" role="region" aria-label="Code snippet">
|
|
18
|
+
<div class="label">JavaScript</div>
|
|
19
|
+
<script server>
|
|
20
|
+
const hl = (code) =>
|
|
21
|
+
serverFetch("/api/highlight", {
|
|
22
|
+
method: "POST",
|
|
23
|
+
body: code,
|
|
24
|
+
});
|
|
25
|
+
</script>
|
|
26
|
+
<pre><code>{{{ hl(`console.log("💚 Simple is beautiful!");`) }}}</code></pre>
|
|
27
|
+
</div>
|
|
28
|
+
</body>
|
|
29
|
+
</html>
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
```ts [nitro.config.ts]
|
|
33
|
+
import { defineConfig } from "nitro";
|
|
34
|
+
|
|
35
|
+
export default defineConfig({
|
|
36
|
+
serverDir: "./",
|
|
37
|
+
});
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
```json [package.json]
|
|
41
|
+
{
|
|
42
|
+
"type": "module",
|
|
43
|
+
"scripts": {
|
|
44
|
+
"dev": "vite dev",
|
|
45
|
+
"build": "vite build"
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"nitro": "latest",
|
|
49
|
+
"shiki": "latest"
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
```css [styles.css]
|
|
55
|
+
html,
|
|
56
|
+
body {
|
|
57
|
+
height: 100%;
|
|
58
|
+
margin: 0;
|
|
59
|
+
}
|
|
60
|
+
body {
|
|
61
|
+
display: flex;
|
|
62
|
+
align-items: center;
|
|
63
|
+
justify-content: center;
|
|
64
|
+
background: #f6f8fa;
|
|
65
|
+
font-family:
|
|
66
|
+
system-ui,
|
|
67
|
+
-apple-system,
|
|
68
|
+
"Segoe UI",
|
|
69
|
+
Roboto,
|
|
70
|
+
"Helvetica Neue",
|
|
71
|
+
Arial,
|
|
72
|
+
"Noto Sans",
|
|
73
|
+
"Liberation Sans",
|
|
74
|
+
sans-serif;
|
|
75
|
+
}
|
|
76
|
+
.card {
|
|
77
|
+
text-align: left;
|
|
78
|
+
background: #0b1220;
|
|
79
|
+
color: #e6edf3;
|
|
80
|
+
padding: 1rem;
|
|
81
|
+
border-radius: 8px;
|
|
82
|
+
box-shadow: 0 8px 24px rgba(2, 6, 23, 0.2);
|
|
83
|
+
max-width: 90%;
|
|
84
|
+
width: 520px;
|
|
85
|
+
}
|
|
86
|
+
.label {
|
|
87
|
+
font-size: 12px;
|
|
88
|
+
color: #9aa7b2;
|
|
89
|
+
margin-bottom: 8px;
|
|
90
|
+
}
|
|
91
|
+
pre {
|
|
92
|
+
margin: 0;
|
|
93
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, "Courier New", monospace;
|
|
94
|
+
font-size: 14px;
|
|
95
|
+
background: transparent;
|
|
96
|
+
white-space: pre;
|
|
97
|
+
overflow: auto;
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
```json [tsconfig.json]
|
|
102
|
+
{
|
|
103
|
+
"extends": "nitro/tsconfig"
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
```ts [vite.config.ts]
|
|
108
|
+
import { defineConfig } from "vite";
|
|
109
|
+
import { nitro } from "nitro/vite";
|
|
110
|
+
|
|
111
|
+
export default defineConfig({
|
|
112
|
+
plugins: [nitro()],
|
|
113
|
+
});
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
```ts [api/highlight.ts]
|
|
117
|
+
import { createHighlighterCore } from "shiki/core";
|
|
118
|
+
import { createOnigurumaEngine } from "shiki/engine/oniguruma";
|
|
119
|
+
|
|
120
|
+
const highlighter = await createHighlighterCore({
|
|
121
|
+
engine: createOnigurumaEngine(import("shiki/wasm")),
|
|
122
|
+
themes: [await import("shiki/themes/vitesse-dark.mjs")],
|
|
123
|
+
langs: [await import("shiki/langs/ts.mjs")],
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
export default async ({ req }: { req: Request }) => {
|
|
127
|
+
const code = await req.text();
|
|
128
|
+
const html = await highlighter.codeToHtml(code, {
|
|
129
|
+
lang: "ts",
|
|
130
|
+
theme: "vitesse-dark",
|
|
131
|
+
});
|
|
132
|
+
return new Response(html, {
|
|
133
|
+
headers: { "Content-Type": "text/html; charset=utf-8" },
|
|
134
|
+
});
|
|
135
|
+
};
|
|
136
|
+
```
|
|
137
|
+
</code-tree>
|
|
138
|
+
|
|
139
|
+
Use Shiki for syntax highlighting with TextMate grammars. This example highlights code on the server using Nitro's server scripts feature, which runs JavaScript inside HTML files before sending the response.
|
|
140
|
+
|
|
141
|
+
## API Route
|
|
142
|
+
|
|
143
|
+
```ts [api/highlight.ts]
|
|
144
|
+
import { createHighlighterCore } from "shiki/core";
|
|
145
|
+
import { createOnigurumaEngine } from "shiki/engine/oniguruma";
|
|
146
|
+
|
|
147
|
+
const highlighter = await createHighlighterCore({
|
|
148
|
+
engine: createOnigurumaEngine(import("shiki/wasm")),
|
|
149
|
+
themes: [await import("shiki/themes/vitesse-dark.mjs")],
|
|
150
|
+
langs: [await import("shiki/langs/ts.mjs")],
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
export default async ({ req }: { req: Request }) => {
|
|
154
|
+
const code = await req.text();
|
|
155
|
+
const html = await highlighter.codeToHtml(code, {
|
|
156
|
+
lang: "ts",
|
|
157
|
+
theme: "vitesse-dark",
|
|
158
|
+
});
|
|
159
|
+
return new Response(html, {
|
|
160
|
+
headers: { "Content-Type": "text/html; charset=utf-8" },
|
|
161
|
+
});
|
|
162
|
+
};
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Create a Shiki highlighter with the Vitesse Dark theme and TypeScript language support. When the API receives a POST request, it reads the code from the request body and returns highlighted HTML.
|
|
166
|
+
|
|
167
|
+
## Server-Side Rendering
|
|
168
|
+
|
|
169
|
+
```html [index.html]
|
|
170
|
+
<!doctype html>
|
|
171
|
+
<html lang="en">
|
|
172
|
+
<head>
|
|
173
|
+
<meta charset="utf-8" />
|
|
174
|
+
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
|
175
|
+
<title>Hello World Snippet</title>
|
|
176
|
+
<link rel="stylesheet" href="styles.css" />
|
|
177
|
+
</head>
|
|
178
|
+
<body>
|
|
179
|
+
<div class="card" role="region" aria-label="Code snippet">
|
|
180
|
+
<div class="label">JavaScript</div>
|
|
181
|
+
<script server>
|
|
182
|
+
const hl = (code) =>
|
|
183
|
+
serverFetch("/api/highlight", {
|
|
184
|
+
method: "POST",
|
|
185
|
+
body: code,
|
|
186
|
+
});
|
|
187
|
+
</script>
|
|
188
|
+
<pre><code>{{{ hl(`console.log("💚 Simple is beautiful!");`) }}}</code></pre>
|
|
189
|
+
</div>
|
|
190
|
+
</body>
|
|
191
|
+
</html>
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
The `<script server>` tag runs on the server before the HTML is sent. It defines a helper function that calls the highlight API using `serverFetch`. The triple-brace syntax `{{{ }}}` outputs the result without escaping, so the highlighted HTML renders correctly.
|
|
195
|
+
|
|
196
|
+
## Learn More
|
|
197
|
+
|
|
198
|
+
- [Shiki](https://shiki.style/)
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Auto Imports
|
|
2
|
+
|
|
3
|
+
> Automatic imports for utilities and composables.
|
|
4
|
+
|
|
5
|
+
<code-tree>
|
|
6
|
+
|
|
7
|
+
```ts [nitro.config.ts]
|
|
8
|
+
import { defineConfig } from "nitro";
|
|
9
|
+
|
|
10
|
+
export default defineConfig({
|
|
11
|
+
serverDir: true,
|
|
12
|
+
imports: {},
|
|
13
|
+
});
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
```json [package.json]
|
|
17
|
+
{
|
|
18
|
+
"type": "module",
|
|
19
|
+
"scripts": {
|
|
20
|
+
"dev": "nitro dev",
|
|
21
|
+
"build": "nitro build"
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"nitro": "latest"
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
```ts [server.ts]
|
|
30
|
+
import { defineHandler } from "nitro";
|
|
31
|
+
import { makeGreeting } from "./server/utils/hello.ts";
|
|
32
|
+
|
|
33
|
+
export default defineHandler(() => `<h1>${makeGreeting("Nitro")}</h1>`);
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
```json [tsconfig.json]
|
|
37
|
+
{
|
|
38
|
+
"include": [".nitro/types/nitro-imports.d.ts", "src"]
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
```ts [vite.config.ts]
|
|
43
|
+
import { defineConfig } from "vite";
|
|
44
|
+
import { nitro } from "nitro/vite";
|
|
45
|
+
|
|
46
|
+
export default defineConfig({ plugins: [nitro()] });
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
```ts [server/utils/hello.ts]
|
|
50
|
+
export function makeGreeting(name: string) {
|
|
51
|
+
return `Hello, ${name}!`;
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
</code-tree>
|
|
55
|
+
|
|
56
|
+
Functions exported from `server/utils/` are automatically available without explicit imports when auto-imports are enabled. Define a utility once and use it anywhere in your server code.
|
|
57
|
+
|
|
58
|
+
## Configuration
|
|
59
|
+
|
|
60
|
+
Enable auto-imports by setting `imports` in your config:
|
|
61
|
+
|
|
62
|
+
```ts [nitro.config.ts]
|
|
63
|
+
import { defineConfig } from "nitro";
|
|
64
|
+
|
|
65
|
+
export default defineConfig({
|
|
66
|
+
serverDir: true,
|
|
67
|
+
imports: {},
|
|
68
|
+
});
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Using Auto Imports
|
|
72
|
+
|
|
73
|
+
1. Create a utility file in `server/utils/`:
|
|
74
|
+
|
|
75
|
+
```ts [server/utils/hello.ts]
|
|
76
|
+
export function makeGreeting(name: string) {
|
|
77
|
+
return `Hello, ${name}!`;
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
2. The function is available without importing it:
|
|
82
|
+
|
|
83
|
+
```ts [server.ts]
|
|
84
|
+
import { defineHandler } from "nitro";
|
|
85
|
+
|
|
86
|
+
export default defineHandler(() => `<h1>${makeGreeting("Nitro")}</h1>`);
|
|
87
|
+
```
|
|
88
|
+
With this setup, any function exported from `server/utils/` becomes globally available. Nitro scans the directory and generates the necessary imports automatically.
|
|
89
|
+
|
|
90
|
+
## Learn More
|
|
91
|
+
|
|
92
|
+
- [Configuration](/docs/configuration)
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Virtual Routes
|
|
2
|
+
|
|
3
|
+
> Define routes programmatically using Nitro's virtual module system.
|
|
4
|
+
|
|
5
|
+
<code-tree>
|
|
6
|
+
|
|
7
|
+
```ts [nitro.config.ts]
|
|
8
|
+
import { defineConfig } from "nitro";
|
|
9
|
+
|
|
10
|
+
export default defineConfig({
|
|
11
|
+
routes: {
|
|
12
|
+
"/": "#virtual-route",
|
|
13
|
+
},
|
|
14
|
+
virtual: {
|
|
15
|
+
"#virtual-route": () =>
|
|
16
|
+
/* js */ `export default () => new Response("Hello from virtual entry!")`,
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
```json [package.json]
|
|
22
|
+
{
|
|
23
|
+
"type": "module",
|
|
24
|
+
"scripts": {
|
|
25
|
+
"build": "nitro build",
|
|
26
|
+
"dev": "nitro dev",
|
|
27
|
+
"preview": "node .output/server/index.mjs"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"nitro": "latest"
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
```json [tsconfig.json]
|
|
36
|
+
{
|
|
37
|
+
"extends": "nitro/tsconfig"
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
```ts [vite.config.ts]
|
|
42
|
+
import { defineConfig } from "vite";
|
|
43
|
+
import { nitro } from "nitro/vite";
|
|
44
|
+
|
|
45
|
+
export default defineConfig({ plugins: [nitro()] });
|
|
46
|
+
```
|
|
47
|
+
</code-tree>
|
|
48
|
+
|
|
49
|
+
Virtual routes let you define handlers as strings in your config instead of creating separate files. This is useful when generating routes dynamically, building plugins, or keeping simple routes inline.
|
|
50
|
+
|
|
51
|
+
## Configuration
|
|
52
|
+
|
|
53
|
+
```ts [nitro.config.ts]
|
|
54
|
+
import { defineConfig } from "nitro";
|
|
55
|
+
|
|
56
|
+
export default defineConfig({
|
|
57
|
+
routes: {
|
|
58
|
+
"/": "#virtual-route",
|
|
59
|
+
},
|
|
60
|
+
virtual: {
|
|
61
|
+
"#virtual-route": () =>
|
|
62
|
+
/* js */ `export default () => new Response("Hello from virtual entry!")`,
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
The `routes` option maps URL paths to virtual module identifiers (prefixed with `#`). The `virtual` option defines the module content as a string or function returning a string. At build time, Nitro resolves these virtual modules to actual handlers.
|
|
68
|
+
|
|
69
|
+
There are no route files in this project. The entire handler is defined inline in the config, and Nitro generates the route at build time.
|
|
70
|
+
|
|
71
|
+
## Learn More
|
|
72
|
+
|
|
73
|
+
- [Routing](/docs/routing)
|
|
74
|
+
- [Configuration](/docs/configuration)
|