diff --git a/examples/vite-ssr-preact/vite.config.mjs b/examples/vite-ssr-preact/vite.config.mjs index 3a99a9944d..51e1c2b0c8 100644 --- a/examples/vite-ssr-preact/vite.config.mjs +++ b/examples/vite-ssr-preact/vite.config.mjs @@ -4,13 +4,4 @@ import preact from "@preact/preset-vite"; export default defineConfig({ plugins: [nitro(), preact()], - environments: { - client: { - build: { - rollupOptions: { - input: "./src/entry-client.tsx", - }, - }, - }, - }, }); diff --git a/examples/vite-ssr-react/vite.config.mjs b/examples/vite-ssr-react/vite.config.mjs index 10a770d2b5..6b1cb80cdd 100644 --- a/examples/vite-ssr-react/vite.config.mjs +++ b/examples/vite-ssr-react/vite.config.mjs @@ -4,9 +4,4 @@ import react from "@vitejs/plugin-react"; export default defineConfig({ plugins: [nitro(), react()], - environments: { - client: { - build: { rollupOptions: { input: "./src/entry-client.tsx" } }, - }, - }, }); diff --git a/examples/vite-ssr-solid/vite.config.mjs b/examples/vite-ssr-solid/vite.config.mjs index 23fdc5dbd4..752821ffb9 100644 --- a/examples/vite-ssr-solid/vite.config.mjs +++ b/examples/vite-ssr-solid/vite.config.mjs @@ -5,12 +5,4 @@ import { nitro } from "nitro/vite"; export default defineConfig({ plugins: [solid({ ssr: true }), nitro()], esbuild: { jsx: "preserve", jsxImportSource: "solid-js" }, - environments: { - ssr: { - build: { rollupOptions: { input: "./src/entry-server.tsx" } }, - }, - client: { - build: { rollupOptions: { input: "./src/entry-client.tsx" } }, - }, - }, }); diff --git a/examples/vite-ssr-vue-router/vite.config.mjs b/examples/vite-ssr-vue-router/vite.config.mjs index 577118e51f..10faaf0ad1 100644 --- a/examples/vite-ssr-vue-router/vite.config.mjs +++ b/examples/vite-ssr-vue-router/vite.config.mjs @@ -5,10 +5,6 @@ import { nitro } from "nitro/vite"; export default defineConfig((_env) => ({ plugins: [patchVueExclude(vue(), /\?assets/), devtoolsJson(), nitro()], - environments: { - client: { build: { rollupOptions: { input: "./app/entry-client.ts" } } }, - ssr: { build: { rollupOptions: { input: "./app/entry-server.ts" } } }, - }, })); // Workaround https://github.com/vitejs/vite-plugin-vue/issues/677 diff --git a/src/build/vite/plugin.ts b/src/build/vite/plugin.ts index bb820a298d..62803e85f0 100644 --- a/src/build/vite/plugin.ts +++ b/src/build/vite/plugin.ts @@ -96,17 +96,50 @@ function nitroEnv(ctx: NitroPluginContext): VitePlugin { ...createServiceEnvironments(ctx), nitro: createNitroEnvironment(ctx), }; - environments.client = { - consumer: userConfig.environments?.client?.consumer ?? "client", - build: { - rollupOptions: { - input: - userConfig.environments?.client?.build?.rollupOptions?.input ?? - useNitro(ctx).options.renderer?.template, - }, - }, - }; - debug("[env] Environments:", Object.keys(environments).join(", ")); + + let clientEntry: string | undefined; + let clientEntryConfigured = !!getEntry( + userConfig.environments?.client?.build?.rolldownOptions?.input || + userConfig.environments?.client?.build?.rollupOptions?.input + ); + if (!clientEntryConfigured) { + const rendererTemplate = useNitro(ctx).options.renderer?.template; + if (rendererTemplate) { + // Use Nitro renderer template as client entry + clientEntry = rendererTemplate; + ctx.nitro!.logger.info( + `Using Nitro renderer template \`${prettyPath(rendererTemplate)}\` as vite client entry.` + ); + } else { + // Auto-detect client entry + clientEntry = resolveModulePath("./entry-client", { + try: true, + extensions: DEFAULT_EXTENSIONS, + from: ["app", "src", ""].flatMap((d) => + [ctx.nitro!.options.rootDir, ...ctx.nitro!.options.scanDirs].map( + (s) => join(s, d) + "/" + ) + ), + }); + if (clientEntry) { + ctx.nitro!.logger.info(`Using \`${prettyPath(clientEntry)}\` as vite client entry.`); + } + } + } + if (clientEntry) { + environments.client = { + consumer: userConfig.environments?.client?.consumer ?? "client", + build: clientEntryConfigured + ? undefined + : { + rollupOptions: { + input: clientEntry ? { index: clientEntry } : undefined, + }, + }, + }; + debug("[env] Environments:", Object.keys(environments).join(", ")); + } + return { environments, }; @@ -380,7 +413,10 @@ async function setupNitroContext( ctx.nitro!.logger.info(`Using \`${prettyPath(ssrEntry)}\` as vite ssr entry.`); } } else { - let ssrEntry = getEntry(userConfig.environments.ssr.build?.rollupOptions?.input); + let ssrEntry = getEntry( + userConfig.environments.ssr.build?.rolldownOptions?.input || + userConfig.environments.ssr.build?.rollupOptions?.input + ); if (typeof ssrEntry === "string") { ssrEntry = resolveModulePath(ssrEntry, {