Skip to content

Commit 82cef66

Browse files
committed
fix(remix-dev/vite): invalidate route manifest on route exports hot update
1 parent c043a66 commit 82cef66

1 file changed

Lines changed: 34 additions & 15 deletions

File tree

‎packages/remix-dev/vite/plugin.ts‎

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,18 @@ const resolveRelativeRouteFilePath = (
108108

109109
let vmods = [serverEntryId, serverManifestId, browserManifestId];
110110

111+
const invalidateVirtualModules = (viteDevServer: Vite.ViteDevServer) => {
112+
vmods.forEach((vmod) => {
113+
let mod = viteDevServer.moduleGraph.getModuleById(
114+
VirtualModule.resolve(vmod)
115+
);
116+
117+
if (mod) {
118+
viteDevServer.moduleGraph.invalidateModule(mod);
119+
}
120+
});
121+
};
122+
111123
const getHash = (source: BinaryLike, maxLength?: number): string => {
112124
let hash = createHash("sha256").update(source).digest("hex");
113125
return typeof maxLength === "number" ? hash.slice(0, maxLength) : hash;
@@ -745,16 +757,7 @@ export const remixVitePlugin: RemixVitePlugin = (options = {}) => {
745757
) {
746758
previousPluginConfig = pluginConfig;
747759

748-
// Invalidate all virtual modules
749-
vmods.forEach((vmod) => {
750-
let mod = viteDevServer.moduleGraph.getModuleById(
751-
VirtualModule.resolve(vmod)
752-
);
753-
754-
if (mod) {
755-
viteDevServer.moduleGraph.invalidateModule(mod);
756-
}
757-
});
760+
invalidateVirtualModules(viteDevServer);
758761
}
759762

760763
next();
@@ -1092,15 +1095,31 @@ export const remixVitePlugin: RemixVitePlugin = (options = {}) => {
10921095
// Update the config cache any time there is a file change
10931096
cachedPluginConfig = pluginConfig;
10941097
let route = getRoute(pluginConfig, file);
1098+
let hotData = { route: null as any };
1099+
1100+
if (route) {
1101+
// invalidate manifest on route exports change
1102+
let mod = await server.ssrLoadModule(serverManifestId);
1103+
let manifest = mod.default as Manifest;
1104+
let metadata = manifest.routes[route.id];
1105+
let newMetadata = await getRouteMetadata(
1106+
pluginConfig,
1107+
viteChildCompiler,
1108+
route
1109+
);
1110+
if (
1111+
(["hasLoader", "hasAction", "hasErrorBoundary"] as const).some(
1112+
(key) => metadata[key] !== newMetadata[key]
1113+
)
1114+
) {
1115+
invalidateVirtualModules(server);
1116+
}
1117+
}
10951118

10961119
server.ws.send({
10971120
type: "custom",
10981121
event: "remix:hmr",
1099-
data: {
1100-
route: route
1101-
? await getRouteMetadata(pluginConfig, viteChildCompiler, route)
1102-
: null,
1103-
},
1122+
data: hotData,
11041123
});
11051124

11061125
return modules;

0 commit comments

Comments
 (0)