@@ -108,6 +108,18 @@ const resolveRelativeRouteFilePath = (
108108
109109let 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+
111123const 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