diff --git a/.changeset/neat-dogs-brake.md b/.changeset/neat-dogs-brake.md new file mode 100644 index 00000000000..171a4224103 --- /dev/null +++ b/.changeset/neat-dogs-brake.md @@ -0,0 +1,5 @@ +--- +"@remix-run/dev": minor +--- + +Add support for Vite 6 (CSS loading related parts) diff --git a/contributors.yml b/contributors.yml index 2da7576d437..1cf5b18466a 100644 --- a/contributors.yml +++ b/contributors.yml @@ -595,6 +595,7 @@ - sambostock - sandstone991 - sandulat +- sapphi-red - sarahse - sathvik-k - sbernheim4 diff --git a/packages/remix-dev/vite/styles.ts b/packages/remix-dev/vite/styles.ts index f2910da5f89..c96787f4523 100644 --- a/packages/remix-dev/vite/styles.ts +++ b/packages/remix-dev/vite/styles.ts @@ -5,6 +5,7 @@ import { type ModuleNode, type ViteDevServer } from "vite"; import { type RemixConfig as ResolvedRemixConfig } from "../config"; import { resolveFileUrl } from "./resolve-file-url"; +import { importViteEsmSync } from "./import-vite-esm-sync"; type ServerRouteManifest = ServerBuild["routes"]; type ServerRoute = ServerRouteManifest[string]; @@ -48,6 +49,9 @@ export const isCssUrlWithoutSideEffects = (url: string) => { return false; }; +const injectQuery = (url: string, query: string) => + url.includes("?") ? url.replace("?", `?${query}&`) : `${url}?${query}`; + const getStylesForFiles = async ({ viteDevServer, rootDirectory, @@ -59,6 +63,9 @@ const getStylesForFiles = async ({ cssModulesManifest: Record; files: string[]; }): Promise => { + let vite = importViteEsmSync(); + let viteMajor = +vite.version.split(".", 1)[0]; + let styles: Record = {}; let deps = new Set(); @@ -103,7 +110,16 @@ const getStylesForFiles = async ({ try { let css = isCssModulesFile(dep.file) ? cssModulesManifest[dep.file] - : (await viteDevServer.ssrLoadModule(dep.url)).default; + : ( + await viteDevServer.ssrLoadModule( + // Vite v6 does not expose default export for CSS in client environment + // to align with non-SSR environment + // Keep using the url without inline query for v5 + // as the HMR code was relying on the implicit + // SSR-client module graph relationship + viteMajor >= 6 ? injectQuery(dep.url, "inline") : dep.url + ) + ).default; if (css === undefined) { throw new Error();