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,213 @@
|
|
|
1
|
+
# Migration Guide
|
|
2
|
+
|
|
3
|
+
> [!NOTE]
|
|
4
|
+
> This is a living document for migrating from Nitro 2 to 3. Please check it regularly while using the beta version.
|
|
5
|
+
|
|
6
|
+
Nitro v3 introduces intentional backward-incompatible changes. This guide helps you migrate from Nitro v2.
|
|
7
|
+
|
|
8
|
+
## `nitropack` is renamed to `nitro`
|
|
9
|
+
|
|
10
|
+
The NPM package [nitropack](https://www.npmjs.com/package/nitropack) (v2) has been renamed to [nitro](https://www.npmjs.com/package/nitro) (v3).
|
|
11
|
+
|
|
12
|
+
**Migration:** Update the `nitropack` dependency to `nitro` in `package.json`:
|
|
13
|
+
|
|
14
|
+
```diff [release channel]
|
|
15
|
+
{
|
|
16
|
+
"dependencies": {
|
|
17
|
+
-- "nitropack": "latest"
|
|
18
|
+
++ "nitro": "latest"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
```diff [nightly channel]
|
|
24
|
+
{
|
|
25
|
+
"dependencies": {
|
|
26
|
+
-- "nitropack": "latest"
|
|
27
|
+
++ "nitro": "npm:nitro-nightly"
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
**Migration:** Search your codebase and rename all instances of nitropack to nitro:
|
|
33
|
+
|
|
34
|
+
```diff
|
|
35
|
+
-- import { defineNitroConfig } from "nitropack/config"
|
|
36
|
+
++ import { defineConfig } from "nitro"
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## nitro/runtime
|
|
40
|
+
|
|
41
|
+
Runtime utils had been moved to individual `nitro/*` subpath exports. Refer to docs for usage.
|
|
42
|
+
|
|
43
|
+
```diff
|
|
44
|
+
-- import { useStorage } from "nitropack/runtime/storage"
|
|
45
|
+
++ import { useStorage } from "nitro/storage"
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Minimum Supported Node.js Version: 20
|
|
49
|
+
|
|
50
|
+
Nitro now requires a minimum Node.js version of 20, as Node.js 18 reaches end-of-life in [April 2025](https://nodejs.org/en/about/previous-releases).
|
|
51
|
+
|
|
52
|
+
Please upgrade to the [latest LTS](https://nodejs.org/en/download) version (>= 20).
|
|
53
|
+
|
|
54
|
+
**Migration:**
|
|
55
|
+
|
|
56
|
+
- Check your local Node.js version using `node --version` and update if necessary.
|
|
57
|
+
- If you use a CI/CD system for deployment, ensure that your pipeline is running Node.js 20 or higher.
|
|
58
|
+
- If your hosting provider manages the Node.js runtime, make sure it's set to version 20, 22, or later.
|
|
59
|
+
|
|
60
|
+
## Type Imports
|
|
61
|
+
Nitro types are now only exported from `nitro/types`.
|
|
62
|
+
|
|
63
|
+
**Migration:** Import types from nitro/types instead of nitro:
|
|
64
|
+
|
|
65
|
+
```diff
|
|
66
|
+
-- import { NitroRuntimeConfig } from "nitropack"
|
|
67
|
+
++ import { NitroRuntimeConfig } from "nitro/types"
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## App Config Support Removed
|
|
71
|
+
|
|
72
|
+
Nitro v2 supported a bundled app config that allowed defining configurations in `app.config.ts` and accessing them at runtime via `useAppConfig()`.
|
|
73
|
+
|
|
74
|
+
This feature had been removed.
|
|
75
|
+
|
|
76
|
+
**Migration:**
|
|
77
|
+
|
|
78
|
+
Use a regular `.ts` file in your server directory and import it directly.
|
|
79
|
+
|
|
80
|
+
## Preset updates
|
|
81
|
+
|
|
82
|
+
Nitro presets have been updated for the latest compatibility.
|
|
83
|
+
|
|
84
|
+
Some (legacy) presets have been removed or renamed.
|
|
85
|
+
|
|
86
|
+
| Old Preset | New Preset |
|
|
87
|
+
| --- | --- |
|
|
88
|
+
| `node` | `node_middleware` (export changed to `middleware`) |
|
|
89
|
+
| `cloudflare`, `cloudflare_worker`, `cloudflare_module_legacy` | `cloudflare_module` |
|
|
90
|
+
| `deno-server-legacy` | `deno_server` with Deno v2 |
|
|
91
|
+
| `netlify-builder` | `netlify` or `netlify_edge` |
|
|
92
|
+
| `vercel-edge` | `vercel` with Fluid compute enabled |
|
|
93
|
+
| `azure`, `azure_functions` | `azure_swa` |
|
|
94
|
+
| `firebase` | `firebase_app_hosting` |
|
|
95
|
+
| `iis` | `iis_handler` |
|
|
96
|
+
| `deno` | `deno_deploy` |
|
|
97
|
+
| `edgio` | Discontinued |
|
|
98
|
+
| `cli` | Removed due to lack of use |
|
|
99
|
+
| `service_worker` | Removed due to instability |
|
|
100
|
+
|
|
101
|
+
## Cloudflare Bindings Access
|
|
102
|
+
|
|
103
|
+
In Nitro v2, Cloudflare environment variables and bindings were accessible via `event.context.cloudflare.env`.
|
|
104
|
+
|
|
105
|
+
In Nitro v3, the Cloudflare runtime context is attached to the request's runtime object instead.
|
|
106
|
+
|
|
107
|
+
**Migration:**
|
|
108
|
+
|
|
109
|
+
```diff
|
|
110
|
+
-- const { cloudflare } = event.context
|
|
111
|
+
-- const binding = cloudflare.env.MY_BINDING
|
|
112
|
+
++ const { env } = event.req.runtime.cloudflare
|
|
113
|
+
++ const binding = env.MY_BINDING
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Changed nitro subpath imports
|
|
117
|
+
|
|
118
|
+
Nitro v2 introduced multiple subpath exports, some of which have been removed or updated:
|
|
119
|
+
|
|
120
|
+
- `nitro/rollup`, `nitropack/core` (use `nitro/builder`)
|
|
121
|
+
- `nitropack/runtime/*` (use `nitro/*`)
|
|
122
|
+
- `nitropack/kit` (removed)
|
|
123
|
+
- `nitropack/presets` (removed)
|
|
124
|
+
An experimental `nitropack/kit` was introduced but has now been removed. A standalone Nitro Kit package may be introduced in the future with clearer objectives.
|
|
125
|
+
|
|
126
|
+
**Migration:**
|
|
127
|
+
|
|
128
|
+
- Use `NitroModule` from `nitro/types` instead of `defineNitroModule` from the kit.
|
|
129
|
+
- Prefer built-in Nitro presets (external presets are only for evaluation purposes).
|
|
130
|
+
|
|
131
|
+
## H3 v2
|
|
132
|
+
Nitro v3 upgrades to [H3 v2](https://h3.dev), which includes API changes. All H3 utilities are imported from `nitro/h3`.
|
|
133
|
+
|
|
134
|
+
### Web Standards
|
|
135
|
+
|
|
136
|
+
H3 v2 is rewritten based on web standard primitives ([`URL`](https://developer.mozilla.org/en-US/docs/Web/API/URL), [`Headers`](https://developer.mozilla.org/en-US/docs/Web/API/Headers), [`Request`](https://developer.mozilla.org/en-US/docs/Web/API/Request), and [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response)).
|
|
137
|
+
|
|
138
|
+
Access to `event.node.{req,res}` is only available in Node.js runtime. `event.web` is renamed to `event.req` (instance of web [`Request`](https://developer.mozilla.org/en-US/docs/Web/API/Request)).
|
|
139
|
+
|
|
140
|
+
### Response Handling
|
|
141
|
+
|
|
142
|
+
You should always explicitly **return** the response body or **throw** an error:
|
|
143
|
+
|
|
144
|
+
```diff
|
|
145
|
+
-- import { send, sendRedirect, sendStream } from "nitro/h3"
|
|
146
|
+
-- send(event, value)
|
|
147
|
+
-- sendStream(event, stream)
|
|
148
|
+
-- sendRedirect(event, location, code)
|
|
149
|
+
++ import { redirect } from "nitro/h3"
|
|
150
|
+
++ return value
|
|
151
|
+
++ return stream
|
|
152
|
+
++ return redirect(event, location, code)
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Other changes:
|
|
156
|
+
|
|
157
|
+
- `sendError(event, error)` → `throw createError(error)`
|
|
158
|
+
- `sendNoContent(event)` → `return noContent(event)`
|
|
159
|
+
- `sendProxy(event, target)` → `return proxy(event, target)`
|
|
160
|
+
|
|
161
|
+
### Request Body
|
|
162
|
+
Most body utilities can be replaced with native `event.req` methods:
|
|
163
|
+
|
|
164
|
+
```diff
|
|
165
|
+
-- import { readBody, readRawBody, readFormData } from "nitro/h3"
|
|
166
|
+
++ // Use native Request methods
|
|
167
|
+
++ const json = await event.req.json()
|
|
168
|
+
++ const text = await event.req.text()
|
|
169
|
+
++ const formData = await event.req.formData()
|
|
170
|
+
++ const stream = event.req.body
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### Headers
|
|
174
|
+
|
|
175
|
+
H3 now uses standard web [`Headers`](https://developer.mozilla.org/en-US/docs/Web/API/Headers). Header values are always plain `string` (no `null`, `undefined`, or `string[]`).
|
|
176
|
+
|
|
177
|
+
```diff
|
|
178
|
+
-- import { getHeader, setHeader, getResponseStatus } from "nitro/h3"
|
|
179
|
+
-- getHeader(event, "x-foo")
|
|
180
|
+
-- setHeader(event, "x-foo", "bar")
|
|
181
|
+
++ event.req.headers.get("x-foo")
|
|
182
|
+
++ event.res.headers.set("x-foo", "bar")
|
|
183
|
+
++ event.res.status // instead of getResponseStatus(event)
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### Handler Utils
|
|
187
|
+
|
|
188
|
+
```diff
|
|
189
|
+
-- import { eventHandler, defineEventHandler } from "nitro/h3"
|
|
190
|
+
++ import { defineHandler } from "nitro"
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
- `lazyEventHandler` → `defineLazyEventHandler`
|
|
194
|
+
- `useBase` → `withBase`
|
|
195
|
+
|
|
196
|
+
### Error Utils
|
|
197
|
+
|
|
198
|
+
```diff
|
|
199
|
+
-- import { createError, isError } from "nitro/h3"
|
|
200
|
+
++ import { HTTPError } from "nitro"
|
|
201
|
+
++ throw new HTTPError({ status: 404, message: "Not found" })
|
|
202
|
+
++ HTTPError.isError(error)
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### Node.js Utils
|
|
206
|
+
|
|
207
|
+
```diff
|
|
208
|
+
-- import { defineNodeListener, fromNodeMiddleware, toNodeListener } from "nitro/h3"
|
|
209
|
+
++ import { defineNodeHandler, fromNodeHandler, toNodeHandler } from "nitro/h3"
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
## Optional Hooks
|
|
213
|
+
If you were using `useNitroApp().hooks` outside of Nitro plugins before, it might be undefined. Use new `useNitroHooks()` to guarantee having an instance.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Nightly Channel
|
|
2
|
+
|
|
3
|
+
> Nitro has a nightly release channel that automatically releases for every commit to `main` branch to try latest changes.
|
|
4
|
+
|
|
5
|
+
You can opt-in to the nightly release channel by updating your `package.json`:
|
|
6
|
+
|
|
7
|
+
```json
|
|
8
|
+
{
|
|
9
|
+
"devDependencies": {
|
|
10
|
+
"nitro": "npm:nitro-nightly@latest"
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Remove the lockfile (`package-lock.json`, `yarn.lock`, `pnpm-lock.yaml`, `bun.lock`, or `bun.lockb`) and reinstall the dependencies.
|
|
16
|
+
|
|
17
|
+
<important>
|
|
18
|
+
|
|
19
|
+
When using **Bun as package manager** in a mono-repo, you need to make sure nitro package is properly hoisted.
|
|
20
|
+
|
|
21
|
+
```toml [bunfig.toml]
|
|
22
|
+
[install]
|
|
23
|
+
publicHoistPattern = ["nitro*"]
|
|
24
|
+
```
|
|
25
|
+
</important>
|
|
26
|
+
|
|
27
|
+
<important>
|
|
28
|
+
|
|
29
|
+
Avoid using `<npm|pnpm|yarn|bun|deno> install nitro-nightly`; it does not install correctly.
|
|
30
|
+
If you encounter issues, delete your `node_modules` and lock files, then follow the steps above.
|
|
31
|
+
</important>
|
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
# Nitro Renderer
|
|
2
|
+
|
|
3
|
+
> Use a renderer to handle all unmatched routes with custom HTML or a templating system.
|
|
4
|
+
|
|
5
|
+
The renderer is a special handler in Nitro that catches all routes that don't match any specific API or route handler. It's commonly used for server-side rendering (SSR), serving single-page applications (SPAs), or creating custom HTML responses.
|
|
6
|
+
|
|
7
|
+
## Configuration
|
|
8
|
+
|
|
9
|
+
The renderer is configured using the `renderer` option in your Nitro config:
|
|
10
|
+
|
|
11
|
+
```ts [nitro.config.ts]
|
|
12
|
+
import { defineConfig } from "nitro";
|
|
13
|
+
|
|
14
|
+
export default defineConfig({
|
|
15
|
+
renderer: {
|
|
16
|
+
template: './index.html', // Path to HTML template file
|
|
17
|
+
handler: './renderer.ts', // Path to custom renderer handler
|
|
18
|
+
static: false, // Treat template as static HTML (no rendu processing)
|
|
19
|
+
}
|
|
20
|
+
})
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
| Option | Type | Description |
|
|
24
|
+
| --- | --- | --- |
|
|
25
|
+
| `template` | `string` | Path to an HTML file used as the renderer template. |
|
|
26
|
+
| `handler` | `string` | Path to a custom renderer handler module. |
|
|
27
|
+
| `static` | `boolean` | When `true`, skips rendu template processing and serves the HTML as-is. Auto-detected based on template syntax when not set. |
|
|
28
|
+
|
|
29
|
+
Set `renderer: false` in the config to explicitly disable the renderer entirely (including auto-detection of `index.html`).
|
|
30
|
+
|
|
31
|
+
## HTML template
|
|
32
|
+
|
|
33
|
+
### Auto-detected `index.html`
|
|
34
|
+
|
|
35
|
+
By default, Nitro automatically looks for an `index.html` file in your project src dir.
|
|
36
|
+
|
|
37
|
+
If found, Nitro will use it as the renderer template and serve it for all unmatched routes.
|
|
38
|
+
|
|
39
|
+
<code-group>
|
|
40
|
+
|
|
41
|
+
```html [index.html]
|
|
42
|
+
<!DOCTYPE html>
|
|
43
|
+
<html lang="en">
|
|
44
|
+
<head>
|
|
45
|
+
<meta charset="UTF-8" />
|
|
46
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
47
|
+
<title>My Vite + Nitro App</title>
|
|
48
|
+
</head>
|
|
49
|
+
<body>
|
|
50
|
+
<div id="app"></div>
|
|
51
|
+
<script type="module" src="/src/main.ts"></script>
|
|
52
|
+
</body>
|
|
53
|
+
</html>
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
```ts [routes/api/hello.ts]
|
|
57
|
+
import { defineHandler } from "nitro";
|
|
58
|
+
|
|
59
|
+
export default defineHandler((event) => {
|
|
60
|
+
return { hello: "API" };
|
|
61
|
+
});
|
|
62
|
+
```
|
|
63
|
+
</code-group>
|
|
64
|
+
|
|
65
|
+
<tip>
|
|
66
|
+
|
|
67
|
+
When `index.html` is detected, Nitro will automatically log in the terminal: `Using index.html as renderer template.`
|
|
68
|
+
</tip>
|
|
69
|
+
|
|
70
|
+
With this setup:
|
|
71
|
+
|
|
72
|
+
- `/api/hello` → Handled by your API routes
|
|
73
|
+
- `/about`, `/contact`, etc. → Served with `index.html`
|
|
74
|
+
|
|
75
|
+
### Custom HTML file
|
|
76
|
+
You can specify a custom HTML template file using the `renderer.template` option in your Nitro configuration.
|
|
77
|
+
|
|
78
|
+
<code-group>
|
|
79
|
+
|
|
80
|
+
```ts [nitro.config.ts]
|
|
81
|
+
import { defineConfig } from "nitro";
|
|
82
|
+
|
|
83
|
+
export default defineConfig({
|
|
84
|
+
renderer: {
|
|
85
|
+
template: './app.html'
|
|
86
|
+
}
|
|
87
|
+
})
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
```html [app.html]
|
|
91
|
+
<!DOCTYPE html>
|
|
92
|
+
<html lang="en">
|
|
93
|
+
<head>
|
|
94
|
+
<meta charset="UTF-8" />
|
|
95
|
+
<title>Custom Template</title>
|
|
96
|
+
</head>
|
|
97
|
+
<body>
|
|
98
|
+
<div id="root">Loading...</div>
|
|
99
|
+
<script type="module" src="/src/main.js"></script>
|
|
100
|
+
</body>
|
|
101
|
+
</html>
|
|
102
|
+
```
|
|
103
|
+
</code-group>
|
|
104
|
+
|
|
105
|
+
### Static templates
|
|
106
|
+
|
|
107
|
+
By default, Nitro auto-detects whether your HTML template contains [rendu](#hypertext-preprocessor-experimental) syntax. If it does, the template is processed dynamically on each request. If it doesn't, it's served as static HTML.
|
|
108
|
+
|
|
109
|
+
You can override this behavior with the `static` option:
|
|
110
|
+
|
|
111
|
+
```ts [nitro.config.ts]
|
|
112
|
+
import { defineConfig } from "nitro";
|
|
113
|
+
|
|
114
|
+
export default defineConfig({
|
|
115
|
+
renderer: {
|
|
116
|
+
template: './index.html',
|
|
117
|
+
static: true // Force static serving, skip template processing
|
|
118
|
+
}
|
|
119
|
+
})
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
In production, static templates are inlined into the server bundle and served directly for optimal performance.
|
|
123
|
+
|
|
124
|
+
### Hypertext Preprocessor (experimental)
|
|
125
|
+
|
|
126
|
+
Nitro uses [rendu](https://github.com/h3js/rendu) Hypertext Preprocessor, which provides a simple and powerful way to create dynamic HTML templates with JavaScript expressions.
|
|
127
|
+
|
|
128
|
+
#### Output expressions
|
|
129
|
+
|
|
130
|
+
- `{{ expression }}` — HTML-escaped output
|
|
131
|
+
- `{{{ expression }}}` or `<?= expression ?>` — raw (unescaped) output
|
|
132
|
+
|
|
133
|
+
```html
|
|
134
|
+
<h1>Hello {{ $URL.pathname }}</h1>
|
|
135
|
+
<div>{{{ '<strong>raw html</strong>' }}}</div>
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
#### Control flow
|
|
139
|
+
Use `<? ... ?>` for JavaScript control flow:
|
|
140
|
+
|
|
141
|
+
```html
|
|
142
|
+
<? if ($METHOD === 'POST') { ?>
|
|
143
|
+
<p>Form submitted!</p>
|
|
144
|
+
<? } else { ?>
|
|
145
|
+
<form method="POST">
|
|
146
|
+
<button type="submit">Submit</button>
|
|
147
|
+
</form>
|
|
148
|
+
<? } ?>
|
|
149
|
+
|
|
150
|
+
<ul>
|
|
151
|
+
<? for (const item of ['a', 'b', 'c']) { ?>
|
|
152
|
+
<li>{{ item }}</li>
|
|
153
|
+
<? } ?>
|
|
154
|
+
</ul>
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
#### Server scripts
|
|
158
|
+
|
|
159
|
+
Use `<script server>` to execute JavaScript on the server:
|
|
160
|
+
|
|
161
|
+
```html
|
|
162
|
+
<script server>
|
|
163
|
+
const data = await fetch('https://api.example.com/data').then(r => r.json());
|
|
164
|
+
</script>
|
|
165
|
+
<pre>{{ JSON.stringify(data) }}</pre>
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
#### Streaming content
|
|
169
|
+
|
|
170
|
+
Use the `echo()` function for streaming content. It accepts strings, functions, Promises, Response objects, or ReadableStreams:
|
|
171
|
+
|
|
172
|
+
```html
|
|
173
|
+
<script server>
|
|
174
|
+
echo("Loading...");
|
|
175
|
+
echo(async () => fetch("https://api.example.com/data"));
|
|
176
|
+
</script>
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
#### Global variables
|
|
180
|
+
|
|
181
|
+
Access request context within templates:
|
|
182
|
+
|
|
183
|
+
| Variable | Description |
|
|
184
|
+
| --- | --- |
|
|
185
|
+
| `$REQUEST` | The incoming `Request` object |
|
|
186
|
+
| `$METHOD` | HTTP method (`GET`, `POST`, etc.) |
|
|
187
|
+
| `$URL` | Request `URL` object |
|
|
188
|
+
| `$HEADERS` | Request headers |
|
|
189
|
+
| `$RESPONSE` | Response configuration object |
|
|
190
|
+
| `$COOKIES` | Read-only object containing request cookies |
|
|
191
|
+
|
|
192
|
+
#### Built-in functions
|
|
193
|
+
|
|
194
|
+
| Function | Description |
|
|
195
|
+
| --- | --- |
|
|
196
|
+
| `htmlspecialchars(str)` | Escape HTML characters (automatically applied in `{{ }}` syntax) |
|
|
197
|
+
| `setCookie(name, value, options?)` | Set a cookie in the response |
|
|
198
|
+
| `redirect(url)` | Redirect the user to another URL |
|
|
199
|
+
| `echo(content)` | Stream content to the response |
|
|
200
|
+
|
|
201
|
+
```html [index.html]
|
|
202
|
+
<!DOCTYPE html>
|
|
203
|
+
<html lang="en">
|
|
204
|
+
<head>
|
|
205
|
+
<meta charset="UTF-8" />
|
|
206
|
+
<title>Dynamic template</title>
|
|
207
|
+
</head>
|
|
208
|
+
<body>
|
|
209
|
+
<h1>Hello {{ $REQUEST.url }}</h1>
|
|
210
|
+
<p>Welcome, <?= $COOKIES["user"] || "Guest" ?>!</p>
|
|
211
|
+
<script server>
|
|
212
|
+
setCookie("visited", "true", { maxAge: 3600 });
|
|
213
|
+
</script>
|
|
214
|
+
</body>
|
|
215
|
+
</html>
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
<read-more></read-more>
|
|
219
|
+
|
|
220
|
+
## Custom renderer handler
|
|
221
|
+
|
|
222
|
+
For more complex scenarios, you can create a custom renderer handler that programmatically generates responses.
|
|
223
|
+
|
|
224
|
+
The handler is a default export function that receives an H3 event object. You can access the incoming `Request` via `event.req`:
|
|
225
|
+
|
|
226
|
+
```ts [renderer.ts]
|
|
227
|
+
export default function renderer({ req }: { req: Request }) {
|
|
228
|
+
const url = new URL(req.url);
|
|
229
|
+
return new Response(
|
|
230
|
+
/* html */ `<!DOCTYPE html>
|
|
231
|
+
<html>
|
|
232
|
+
<head>
|
|
233
|
+
<title>Custom Renderer</title>
|
|
234
|
+
</head>
|
|
235
|
+
<body>
|
|
236
|
+
<h1>Hello from custom renderer!</h1>
|
|
237
|
+
<p>Current path: ${url.pathname}</p>
|
|
238
|
+
</body>
|
|
239
|
+
</html>`,
|
|
240
|
+
{ headers: { "content-type": "text/html; charset=utf-8" } }
|
|
241
|
+
);
|
|
242
|
+
}
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
Then, specify the renderer entry in the Nitro config:
|
|
246
|
+
|
|
247
|
+
```ts [nitro.config.ts]
|
|
248
|
+
import { defineConfig } from "nitro";
|
|
249
|
+
|
|
250
|
+
export default defineConfig({
|
|
251
|
+
renderer: {
|
|
252
|
+
handler: './renderer.ts'
|
|
253
|
+
}
|
|
254
|
+
})
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
<note>
|
|
258
|
+
|
|
259
|
+
When `renderer.handler` is set, it takes full control of rendering. The `renderer.template` option is ignored.
|
|
260
|
+
</note>
|
|
261
|
+
|
|
262
|
+
## Renderer priority
|
|
263
|
+
|
|
264
|
+
The renderer always acts as a catch-all route (`/**`) and has the **lowest priority**. This means:
|
|
265
|
+
|
|
266
|
+
1. Specific API routes are matched first (e.g., `/api/users`)
|
|
267
|
+
2. Specific server routes are matched next (e.g., `/about`)
|
|
268
|
+
3. The renderer catches everything else
|
|
269
|
+
|
|
270
|
+
```md
|
|
271
|
+
api/
|
|
272
|
+
users.ts → /api/users (matched first)
|
|
273
|
+
routes/
|
|
274
|
+
about.ts → /about (matched second)
|
|
275
|
+
renderer.ts → /** (catches all other routes)
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
<warning>
|
|
279
|
+
|
|
280
|
+
If you define a catch-all route (`[...].ts`) in your routes, Nitro will warn you that the renderer will override it. Use more specific routes or different HTTP methods to avoid conflicts.
|
|
281
|
+
</warning>
|
|
282
|
+
|
|
283
|
+
<read-more></read-more>
|
|
284
|
+
|
|
285
|
+
## Vite integration
|
|
286
|
+
|
|
287
|
+
When using Nitro with Vite, the renderer integrates with Vite's build pipeline and dev server.
|
|
288
|
+
|
|
289
|
+
### Development mode
|
|
290
|
+
|
|
291
|
+
In development, the renderer template is read from disk on each request, so changes to `index.html` are reflected immediately without restarting the server. Vite's `transformIndexHtml` hook is applied to inject HMR client scripts and other dev-time transforms.
|
|
292
|
+
|
|
293
|
+
### SSR with `<!--ssr-outlet-->`
|
|
294
|
+
|
|
295
|
+
When using Vite environments with an `ssr` service, you can add an `<!--ssr-outlet-->` comment to your `index.html`. Nitro will replace it with the output from your SSR entry during rendering:
|
|
296
|
+
|
|
297
|
+
```html [index.html]
|
|
298
|
+
<!DOCTYPE html>
|
|
299
|
+
<html lang="en">
|
|
300
|
+
<head>
|
|
301
|
+
<meta charset="UTF-8" />
|
|
302
|
+
<title>SSR App</title>
|
|
303
|
+
</head>
|
|
304
|
+
<body>
|
|
305
|
+
<div id="app"><!--ssr-outlet--></div>
|
|
306
|
+
<script type="module" src="/src/main.ts"></script>
|
|
307
|
+
</body>
|
|
308
|
+
</html>
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
### Production build
|
|
312
|
+
|
|
313
|
+
During production builds, Vite processes the `index.html` through its build pipeline (resolving scripts, CSS, and other assets), then Nitro inlines the transformed HTML into the server bundle.
|
|
314
|
+
|
|
315
|
+
## Use Cases
|
|
316
|
+
|
|
317
|
+
### Single-Page Application (SPA)
|
|
318
|
+
|
|
319
|
+
Serve your SPA's `index.html` for all routes to enable client-side routing:
|
|
320
|
+
|
|
321
|
+
> [!TIP]
|
|
322
|
+
> This is the default behavior of Nitro when used with Vite.
|