Skip to content

Commit 67b43f2

Browse files
feat(vite): auto-register server consumer environments as services (#3928)
1 parent 1c2f1c0 commit 67b43f2

2 files changed

Lines changed: 55 additions & 23 deletions

File tree

examples/vite-rsc/vite.config.ts

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,14 @@ import react from "@vitejs/plugin-react";
66

77
export default defineConfig({
88
plugins: [
9-
nitro({
10-
experimental: {
11-
vite: {
12-
services: {
13-
ssr: { entry: "./app/framework/entry.ssr.tsx" },
14-
rsc: { entry: "./app/framework/entry.rsc.tsx" },
15-
},
16-
},
9+
nitro(),
10+
rsc({
11+
serverHandler: false,
12+
entries: {
13+
ssr: "./app/framework/entry.ssr.tsx",
14+
rsc: "./app/framework/entry.rsc.tsx",
1715
},
1816
}),
19-
rsc({ serverHandler: false }),
2017
react(),
2118
],
2219

src/build/vite/plugin.ts

Lines changed: 49 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import {
1616
getEnvRunner,
1717
createNitroEnvironment,
1818
createServiceEnvironments,
19+
createServiceEnvironment,
1920
} from "./env.ts";
2021
import { configureViteDevServer } from "./dev.ts";
2122
import { runtimeDir } from "nitro/meta";
@@ -115,6 +116,54 @@ function nitroEnv(ctx: NitroPluginContext): VitePlugin {
115116
);
116117
config.build!.emptyOutDir = false;
117118
config.build!.outDir = useNitro(ctx).options.output.publicDir;
119+
return;
120+
}
121+
122+
// Skip if already registered as a service
123+
if (name === "nitro" || ctx.services[name]) {
124+
return;
125+
}
126+
127+
// Auto-register server consumer environments as services
128+
const entry = getEntry(
129+
config.build?.rolldownOptions?.input ||
130+
config.build?.rollupOptions?.input
131+
);
132+
if (typeof entry !== "string") {
133+
return;
134+
}
135+
136+
// Resolve and register as a service
137+
const resolvedEntry =
138+
resolveModulePath(entry, {
139+
from: [ctx.nitro!.options.rootDir, ...ctx.nitro!.options.scanDirs],
140+
extensions: DEFAULT_EXTENSIONS,
141+
suffixes: ["", "/index"],
142+
try: true,
143+
}) || entry;
144+
145+
ctx.services[name] = { entry: resolvedEntry };
146+
debug(
147+
`[env] Auto-detected service "${name}" with entry: ${resolvedEntry}`
148+
);
149+
150+
// Return service environment configuration to merge
151+
return createServiceEnvironment(ctx, name, { entry: resolvedEntry });
152+
},
153+
154+
configResolved() {
155+
// Setup default SSR renderer after all environments are configured
156+
if (
157+
!ctx.nitro!.options.renderer?.handler &&
158+
!ctx.nitro!.options.renderer?.template &&
159+
ctx.services.ssr?.entry
160+
) {
161+
ctx.nitro!.options.renderer ??= {};
162+
ctx.nitro!.options.renderer.handler = resolve(
163+
runtimeDir,
164+
"internal/vite/ssr-renderer"
165+
);
166+
ctx.nitro!.routing.sync();
118167
}
119168
},
120169
};
@@ -369,20 +418,6 @@ async function setupNitroContext(
369418
ctx.nitro.options.serverEntry = false;
370419
}
371420

372-
// Default SSR renderer
373-
if (
374-
!ctx.nitro.options.renderer?.handler &&
375-
!ctx.nitro.options.renderer?.template &&
376-
ctx.services.ssr?.entry
377-
) {
378-
ctx.nitro.options.renderer ??= {};
379-
ctx.nitro.options.renderer.handler = resolve(
380-
runtimeDir,
381-
"internal/vite/ssr-renderer"
382-
);
383-
ctx.nitro!.routing.sync();
384-
}
385-
386421
// Determine default Vite dist directory
387422
const publicDistDir = (ctx._publicDistDir =
388423
userConfig.build?.outDir ||

0 commit comments

Comments
 (0)