Skip to content

Commit 1d1d196

Browse files
refactor(remix-dev/vite): move server bundle ID to build context (#8582)
1 parent a8fb7d8 commit 1d1d196

File tree

2 files changed

+64
-42
lines changed

2 files changed

+64
-42
lines changed

packages/remix-dev/vite/build.ts

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@ import {
99
type BuildManifest,
1010
type ServerBundlesBuildManifest,
1111
configRouteToBranchRoute,
12-
getServerBuildDirectory,
12+
getServerBuildRootDirectory,
1313
} from "./plugin";
1414
import type { ConfigRoute, RouteManifest } from "../config/routes";
1515
import invariant from "../invariant";
1616
import { preloadViteEsm } from "./import-vite-esm-sync";
1717

18-
async function extractConfig({
18+
async function resolveViteConfig({
1919
configFile,
2020
mode,
2121
root,
@@ -35,6 +35,10 @@ async function extractConfig({
3535
"production" // default NODE_ENV
3636
);
3737

38+
return viteConfig;
39+
}
40+
41+
async function extractRemixConfig(viteConfig: Vite.ResolvedConfig) {
3842
let remixConfig = viteConfig[
3943
"__remixPluginResolvedConfig" as keyof typeof viteConfig
4044
] as ResolvedVitePluginConfig | undefined;
@@ -43,7 +47,7 @@ async function extractConfig({
4347
process.exit(1);
4448
}
4549

46-
return { remixConfig, viteConfig };
50+
return remixConfig;
4751
}
4852

4953
function getAddressableRoutes(routes: RouteManifest): ConfigRoute[] {
@@ -110,7 +114,7 @@ async function getServerBuilds(remixConfig: ResolvedVitePluginConfig): Promise<{
110114
rootDirectory,
111115
appDirectory,
112116
} = remixConfig;
113-
let serverBuildDirectory = getServerBuildDirectory(remixConfig);
117+
let serverBuildRootDirectory = getServerBuildRootDirectory(remixConfig);
114118
if (!serverBundles) {
115119
return {
116120
serverBuilds: [{ ssr: true }],
@@ -160,7 +164,7 @@ async function getServerBuilds(remixConfig: ResolvedVitePluginConfig): Promise<{
160164

161165
let relativeServerBundleDirectory = path.relative(
162166
rootDirectory,
163-
path.join(serverBuildDirectory, serverBundleId)
167+
path.join(serverBuildRootDirectory, serverBundleId)
164168
);
165169
let serverBuildConfig = serverBundleBuildConfigById.get(serverBundleId);
166170
if (!serverBuildConfig) {
@@ -198,21 +202,21 @@ async function getServerBuilds(remixConfig: ResolvedVitePluginConfig): Promise<{
198202
};
199203
}
200204

201-
async function cleanServerBuildDirectory(
205+
async function cleanServerBuildRootDirectory(
202206
viteConfig: Vite.ResolvedConfig,
203207
remixConfig: ResolvedVitePluginConfig
204208
) {
205-
let serverBuildDirectory = getServerBuildDirectory(remixConfig);
209+
let serverBuildRootDirectory = getServerBuildRootDirectory(remixConfig);
206210
let isWithinRoot = () => {
207211
let relativePath = path.relative(
208212
remixConfig.rootDirectory,
209-
serverBuildDirectory
213+
serverBuildRootDirectory
210214
);
211215
return !relativePath.startsWith("..") && !path.isAbsolute(relativePath);
212216
};
213217

214218
if (viteConfig.build.emptyOutDir ?? isWithinRoot()) {
215-
await fse.remove(serverBuildDirectory);
219+
await fse.remove(serverBuildRootDirectory);
216220
}
217221
}
218222

@@ -245,11 +249,8 @@ export async function build(
245249
// so it can be accessed synchronously via `importViteEsmSync`
246250
await preloadViteEsm();
247251

248-
let { remixConfig, viteConfig } = await extractConfig({
249-
configFile,
250-
mode,
251-
root,
252-
});
252+
let viteConfig = await resolveViteConfig({ configFile, mode, root });
253+
let remixConfig = await extractRemixConfig(viteConfig);
253254

254255
let vite = await import("vite");
255256

@@ -275,7 +276,7 @@ export async function build(
275276
// output directories, we need to clean the root server build directory
276277
// ourselves rather than relying on Vite to do it, otherwise you can end up
277278
// with stale server bundle directories in your build output
278-
await cleanServerBuildDirectory(viteConfig, remixConfig);
279+
await cleanServerBuildRootDirectory(viteConfig, remixConfig);
279280

280281
// Run the Vite client build first
281282
await viteBuild({ ssr: false });

packages/remix-dev/vite/plugin.ts

Lines changed: 48 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,6 @@ export type ResolvedVitePluginConfig = Pick<
197197
buildDirectory: string;
198198
manifest: boolean;
199199
serverBuildFile: string;
200-
serverBundleId?: string;
201200
serverBundles?: ServerBundlesFunction;
202201
ssr: boolean;
203202
};
@@ -207,6 +206,18 @@ export type ServerBundleBuildConfig = {
207206
serverBundleId: string;
208207
};
209208

209+
type BuildContext =
210+
| {
211+
isSsrBuild: false;
212+
getBrowserManifest?: never;
213+
serverBundleId?: never;
214+
}
215+
| {
216+
isSsrBuild: true;
217+
getBrowserManifest: () => Promise<BrowserManifest>;
218+
serverBundleId: string | undefined;
219+
};
220+
210221
let serverBuildId = VirtualModule.id("server-build");
211222
let serverManifestId = VirtualModule.id("server-manifest");
212223
let browserManifestId = VirtualModule.id("browser-manifest");
@@ -405,15 +416,20 @@ const getServerBundleBuildConfig = (
405416
return viteUserConfig.__remixServerBundleBuildConfig as ServerBundleBuildConfig;
406417
};
407418

408-
export let getServerBuildDirectory = (remixConfig: ResolvedVitePluginConfig) =>
419+
let getServerBuildDirectory = (
420+
remixConfig: ResolvedVitePluginConfig,
421+
{ serverBundleId }: Pick<BuildContext, "serverBundleId">
422+
) =>
409423
path.join(
410424
remixConfig.buildDirectory,
411425
"server",
412-
...(typeof remixConfig.serverBundleId === "string"
413-
? [remixConfig.serverBundleId]
414-
: [])
426+
...(typeof serverBundleId === "string" ? [serverBundleId] : [])
415427
);
416428

429+
export let getServerBuildRootDirectory = (
430+
remixConfig: ResolvedVitePluginConfig
431+
) => getServerBuildDirectory(remixConfig, { serverBundleId: undefined });
432+
417433
let getClientBuildDirectory = (remixConfig: ResolvedVitePluginConfig) =>
418434
path.join(remixConfig.buildDirectory, "client");
419435

@@ -424,9 +440,7 @@ export const remixVitePlugin: RemixVitePlugin = (remixUserConfig = {}) => {
424440
let viteConfig: Vite.ResolvedConfig | undefined;
425441

426442
let cssModulesManifest: Record<string, string> = {};
427-
let ssrBuildContext:
428-
| { isSsrBuild: false }
429-
| { isSsrBuild: true; getBrowserManifest: () => Promise<BrowserManifest> };
443+
let buildContext: BuildContext;
430444

431445
let viteChildCompiler: Vite.ViteDevServer | null = null;
432446

@@ -507,10 +521,8 @@ export const remixVitePlugin: RemixVitePlugin = (remixUserConfig = {}) => {
507521

508522
// For server bundle builds, override the relevant config. This lets us run
509523
// multiple server builds with each one targeting a subset of routes.
510-
let serverBundleId: string | undefined = undefined;
511524
if (serverBundleBuildConfig) {
512525
routes = serverBundleBuildConfig.routes;
513-
serverBundleId = serverBundleBuildConfig.serverBundleId;
514526
}
515527

516528
let resolvedRemixConfig: ResolvedVitePluginConfig = {
@@ -525,7 +537,6 @@ export const remixVitePlugin: RemixVitePlugin = (remixUserConfig = {}) => {
525537
rootDirectory,
526538
routes,
527539
serverBuildFile,
528-
serverBundleId,
529540
serverBundles,
530541
serverModuleFormat,
531542
ssr,
@@ -534,6 +545,22 @@ export const remixVitePlugin: RemixVitePlugin = (remixUserConfig = {}) => {
534545
return resolvedRemixConfig;
535546
};
536547

548+
let resolveBuildContext = (viteConfigEnv: Vite.ConfigEnv): BuildContext => {
549+
let buildContext: BuildContext =
550+
viteConfigEnv.isSsrBuild && viteCommand === "build"
551+
? {
552+
isSsrBuild: true,
553+
getBrowserManifest: createBrowserManifestForBuild,
554+
serverBundleId:
555+
getServerBundleBuildConfig(viteUserConfig)?.serverBundleId,
556+
}
557+
: {
558+
isSsrBuild: false,
559+
};
560+
561+
return buildContext;
562+
};
563+
537564
let getServerEntry = async () => {
538565
return `
539566
import * as entryServer from ${JSON.stringify(
@@ -708,6 +735,7 @@ export const remixVitePlugin: RemixVitePlugin = (remixUserConfig = {}) => {
708735
viteCommand = viteConfigEnv.command;
709736

710737
remixConfig = await resolvePluginConfig();
738+
buildContext = resolveBuildContext(viteConfigEnv);
711739

712740
Object.assign(
713741
process.env,
@@ -796,7 +824,7 @@ export const remixVitePlugin: RemixVitePlugin = (remixUserConfig = {}) => {
796824
ssrEmitAssets: true,
797825
copyPublicDir: false, // Assets in the public directory are only used by the client
798826
manifest: true, // We need the manifest to detect SSR-only assets
799-
outDir: getServerBuildDirectory(remixConfig),
827+
outDir: getServerBuildDirectory(remixConfig, buildContext),
800828
rollupOptions: {
801829
...viteUserConfig.build?.rollupOptions,
802830
preserveEntrySignatures: "exports-only",
@@ -816,16 +844,6 @@ export const remixVitePlugin: RemixVitePlugin = (remixUserConfig = {}) => {
816844

817845
viteConfig = resolvedViteConfig;
818846

819-
ssrBuildContext =
820-
viteConfig.build.ssr && viteCommand === "build"
821-
? {
822-
isSsrBuild: true,
823-
getBrowserManifest: createBrowserManifestForBuild,
824-
}
825-
: {
826-
isSsrBuild: false,
827-
};
828-
829847
// We load the same Vite config file again for the child compiler so
830848
// that both parent and child compiler's plugins have independent state.
831849
// If we re-used the `viteUserConfig.plugins` array for the child
@@ -846,7 +864,7 @@ export const remixVitePlugin: RemixVitePlugin = (remixUserConfig = {}) => {
846864
{
847865
command: viteConfig.command,
848866
mode: viteConfig.mode,
849-
isSsrBuild: ssrBuildContext.isSsrBuild,
867+
isSsrBuild: buildContext.isSsrBuild,
850868
},
851869
viteConfig.configFile
852870
);
@@ -1010,15 +1028,18 @@ export const remixVitePlugin: RemixVitePlugin = (remixUserConfig = {}) => {
10101028
// After the SSR build is finished, we inspect the Vite manifest for
10111029
// the SSR build and move server-only assets to client assets directory
10121030
async handler() {
1013-
if (!ssrBuildContext.isSsrBuild) {
1031+
if (!buildContext.isSsrBuild) {
10141032
return;
10151033
}
10161034

10171035
invariant(viteConfig);
10181036

10191037
let { serverBuildFile, rootDirectory } = remixConfig;
1020-
let serverBuildDirectory = getServerBuildDirectory(remixConfig);
10211038
let clientBuildDirectory = getClientBuildDirectory(remixConfig);
1039+
let serverBuildDirectory = getServerBuildDirectory(
1040+
remixConfig,
1041+
buildContext
1042+
);
10221043

10231044
let ssrViteManifest = await loadViteManifest(serverBuildDirectory);
10241045
let clientViteManifest = await loadViteManifest(clientBuildDirectory);
@@ -1105,8 +1126,8 @@ export const remixVitePlugin: RemixVitePlugin = (remixUserConfig = {}) => {
11051126
return await getServerEntry();
11061127
}
11071128
case VirtualModule.resolve(serverManifestId): {
1108-
let browserManifest = ssrBuildContext.isSsrBuild
1109-
? await ssrBuildContext.getBrowserManifest()
1129+
let browserManifest = buildContext.isSsrBuild
1130+
? await buildContext.getBrowserManifest()
11101131
: await getBrowserManifestForDev();
11111132

11121133
return `export default ${jsesc(browserManifest, { es6: true })};`;

0 commit comments

Comments
 (0)