createNitro(config, opts) creates the main context with:
options: NitroOptions— Resolved configurationhooks: Hookable<NitroHooks>— Build lifecycle hooksvfs: Map<string, { render }>— Virtual file systemrouting: { routes, routeRules, globalMiddleware, routedMiddleware }scannedHandlers: NitroEventHandler[]unimport?: Unimport— Auto-imports (optional)logger: ConsolaInstanceupdateConfig(config)— Hot-reload configclose()— Cleanup
Setup flow:
- Load options via
loadOptions() - Install modules via
installModules() - Init routing via
initNitroRouting() - Scan handlers/plugins/tasks via
scanAndSyncOptions() - Prepare unimport for auto-imports
- Setup hooks
src/builder.ts— Main public API:createNitro(),build(),createDevServer(),prerender(),copyPublicAssets(),prepare(),writeTypes(),runTask(),listTasks()src/vite.ts— Vite plugin export fromsrc/build/vite/plugin.ts
Builder dispatch (build/build.ts): delegates to rollup, rolldown, or vite based on nitro.options.builder.
Builder selection (resolved in config/resolvers/builder.ts):
- Check
NITRO_BUILDER/NITRO_VITE_BUILDERenv vars - Auto-detect available packages
- Fallback: rolldown → vite → rollup
Base config (build/config.ts):
- Extensions:
.ts,.mjs,.js,.json,.node,.tsx,.jsx - Import.meta replacements (
import.meta.dev,import.meta.preset, etc.) - Unenv aliases for polyfills
- External dependency patterns
Plugins (build/plugins.ts):
- Virtual modules — renders from
build/virtual/ - Auto imports — Unimport plugin
- WASM loader — unwasm
- Server main injection —
globalThis.__server_main__ - Raw imports —
?rawsuffix - Route meta — OpenAPI metadata
- Replace plugin — variable substitution
- Externals plugin — Node.js native resolution
- Sourcemap minify (optional)
Virtual modules (build/virtual/, 14 templates):
All prefixed #nitro/virtual/<name>:
routing.ts— Compiled router matcherplugins.ts— Plugin registryerror-handler.ts— Error handlerpublic-assets.ts— Public asset metadataserver-assets.ts— Server asset metadataruntime-config.ts— Runtime config objectdatabase.ts— Database setupstorage.ts— Storage backendstasks.ts— Task registrypolyfills.ts— Env polyfillsfeature-flags.ts— Feature detectionrouting-meta.ts— Route metadata (OpenAPI)renderer-template.ts— SSR renderer_all.ts— Aggregator
Loader (config/loader.ts): loadOptions(config, opts)
- Merge with defaults (
NitroDefaults) - Load c12 config files (
nitro.config.ts,package.json.nitro, etc.) - Resolve preset
- Run config resolvers sequentially
Resolvers (config/resolvers/):
compatibility, tsconfig, paths, imports, route-rules, database, export-conditions, runtime-config, open-api, url, assets, storage, error, unenv, builder
Defaults (config/defaults.ts): All NitroConfig defaults.
Internal (runtime/internal/):
app.ts— NitroApp creation, H3 app setupcache.ts— Response cachingcontext.ts— Async contextroute-rule-handlers.ts— Nitro's rule handlers for the compiled matcher: acachehandler bound to Nitro's cache runtime. The built-ins (headers, redirect, proxy, cors) and rule matching/normalization live inh3/rules.static.ts— Static file servingtask.ts— Task executionplugin.ts— Plugin helpersruntime-config.ts— Config getter
Public exports: runtime/app.ts (defineConfig()), runtime/nitro.ts (serverFetch()), runtime/cache.ts, runtime/task.ts, runtime/storage.ts, etc.
dev/server.ts—NitroDevServer: Worker management viaenv-runner, restart on failure (max 3 retries), WebSocket support, VFS debug endpoint (/_vfs/**)dev/app.ts—NitroDevApp: H3 app with error handling, static serving with compression, dev proxy
prerender/prerender.ts— Main flow: parse routes → build prerenderer (preset:nitro-prerender) → execute in parallel → link crawling → write to disk → compressprerender/utils.ts—extractLinks(),matchesIgnorePattern(),formatPrerenderRoute()
Scanning: Discovers routes, middleware, plugins, tasks, modules from filesystem.
Route file conventions:
routes/index.ts→GET /routes/users/[id].ts→GET /users/:idroutes/users/[...slug].ts→GET /users/**:slugapi/users.post.ts→POST /api/users.dev/.prod/.prerendersuffixes for environment filtering
Router (Router class): Based on rou3, compiles to optimized string matcher, supports method routing + env conditions.
Several deployment-target presets (+ internal _nitro/_static); see .agents/presets.md. Structure per preset:
presets/<name>/
├── preset.ts # defineNitroPreset()
├── runtime/ # Runtime entry (bundled)
├── types.ts # Types (optional)
├── utils.ts # Build-time utils (optional)
└── unenv/ # Env overrides (optional)
Key presets: standard, node (server/middleware/cluster), cloudflare (pages/workers), vercel, netlify, aws-lambda, deno, firebase, azure, bun, winterjs
Resolution: presets/_resolve.ts handles aliases, dev/prod, compat dates, static hosting.
Uses citty with lazy-loaded commands: dev, build, deploy, preview, prepare, task, docs.
| Library | Purpose |
|---|---|
h3 |
HTTP framework |
rou3 |
Route matching |
c12 |
Config loading |
citty |
CLI framework |
hookable |
Hook system |
unimport |
Auto-imports |
unstorage |
Storage abstraction |
unenv |
Runtime polyfills |
defu |
Config merging |
pathe |
Path operations |
consola |
Logging |
env-runner |
Worker management |