diff --git a/.changeset/deep-sails-peel.md b/.changeset/deep-sails-peel.md new file mode 100644 index 000000000..46c2ac521 --- /dev/null +++ b/.changeset/deep-sails-peel.md @@ -0,0 +1,5 @@ +--- +"@solidjs/start": patch +--- + +Fixed shared chunk css not being server rendered in production (Vite 8 regression). diff --git a/apps/fixtures/css/vite.config.ts b/apps/fixtures/css/vite.config.ts index 50b7117d0..95f97e4d8 100644 --- a/apps/fixtures/css/vite.config.ts +++ b/apps/fixtures/css/vite.config.ts @@ -13,13 +13,14 @@ export default defineConfig({ * Creates a shared chunk with two components. Needed for the "SharedChunk" test! * The vite manifest behaves differently for such shared chunks. * More info: packages/start/src/config/lazy.ts - * - * TODO: When switching to Rolldown, migrate this to advancedChunks - * https://vite.dev/guide/rolldown.html#manualchunks-to-advancedchunks */ - manualChunks(id) { - if (!id.includes("src/components/sharedChunk")) return; - return "shared"; + codeSplitting: { + groups: [ + { + name: "shared-css", + test: "src/components/sharedChunk", + }, + ], }, }, }, diff --git a/packages/start/src/config/lazy.ts b/packages/start/src/config/lazy.ts index 54df99467..3c041474f 100644 --- a/packages/start/src/config/lazy.ts +++ b/packages/start/src/config/lazy.ts @@ -73,12 +73,16 @@ const lazy = (): PluginOption => { if (this.environment.name !== VITE_ENVIRONMENTS.client) return; for (const chunk of Object.values(bundle)) { - if (chunk.type !== "chunk" || !chunk.isDynamicEntry || chunk.facadeModuleId) continue; + if (chunk.type !== "chunk" || chunk.facadeModuleId) continue; + if (!chunk.viteMetadata?.importedCss.size) continue; + + const moduleIds = chunk.moduleIds.filter(id => !id.endsWith("css")); + if (moduleIds.length <= 1) continue; // Has to follow Vites implementation: // https://github.com/vitejs/vite/blob/4be37a8389c67873880f826b01fe40137e1c29a7/packages/vite/src/node/plugins/manifest.ts#L179 const chunkName = `_${basename(chunk.fileName)}`; - for (const id of chunk.moduleIds) { + for (const id of moduleIds) { sharedChunkNames[id] = chunkName; } }