Skip to content

Commit 20a8a15

Browse files
authored
fix: unify css collecting order (#11671)
1 parent 1c2e941 commit 20a8a15

File tree

1 file changed

+28
-9
lines changed
  • packages/vite/src/node/plugins

1 file changed

+28
-9
lines changed

packages/vite/src/node/plugins/css.ts

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import glob from 'fast-glob'
66
import postcssrc from 'postcss-load-config'
77
import type {
88
ExistingRawSourceMap,
9-
NormalizedOutputOptions,
109
OutputChunk,
1110
RenderedChunk,
1211
RollupError,
@@ -376,8 +375,8 @@ export function cssPostPlugin(config: ResolvedConfig): Plugin {
376375

377376
// when there are multiple rollup outputs and extracting CSS, only emit once,
378377
// since output formats have no effect on the generated CSS.
379-
let outputToExtractedCSSMap: Map<NormalizedOutputOptions, string>
380378
let hasEmitted = false
379+
let chunkCSSMap: Map<string, string>
381380

382381
const rollupOptionsOutput = config.build.rollupOptions.output
383382
const assetFileNames = (
@@ -407,8 +406,8 @@ export function cssPostPlugin(config: ResolvedConfig): Plugin {
407406
renderStart() {
408407
// Ensure new caches for every build (i.e. rebuilding in watch mode)
409408
pureCssChunks = new Set<RenderedChunk>()
410-
outputToExtractedCSSMap = new Map<NormalizedOutputOptions, string>()
411409
hasEmitted = false
410+
chunkCSSMap = new Map()
412411
emitTasks = []
413412
},
414413

@@ -700,10 +699,7 @@ export function cssPostPlugin(config: ResolvedConfig): Plugin {
700699
chunkCSS = resolveAssetUrlsInCss(chunkCSS, cssBundleName)
701700
// finalizeCss is called for the aggregated chunk in generateBundle
702701

703-
outputToExtractedCSSMap.set(
704-
opts,
705-
(outputToExtractedCSSMap.get(opts) || '') + chunkCSS,
706-
)
702+
chunkCSSMap.set(chunk.fileName, chunkCSS)
707703
}
708704
return null
709705
},
@@ -785,8 +781,31 @@ export function cssPostPlugin(config: ResolvedConfig): Plugin {
785781
})
786782
}
787783

788-
let extractedCss = outputToExtractedCSSMap.get(opts)
789-
if (extractedCss && !hasEmitted) {
784+
function extractCss() {
785+
let css = ''
786+
const collected = new Set<OutputChunk>()
787+
const prelimaryNameToChunkMap = new Map(
788+
Object.values(bundle)
789+
.filter((chunk): chunk is OutputChunk => chunk.type === 'chunk')
790+
.map((chunk) => [chunk.preliminaryFileName, chunk]),
791+
)
792+
793+
function collect(fileName: string) {
794+
const chunk = bundle[fileName]
795+
if (!chunk || chunk.type !== 'chunk' || collected.has(chunk)) return
796+
collected.add(chunk)
797+
798+
chunk.imports.forEach(collect)
799+
css += chunkCSSMap.get(chunk.preliminaryFileName) ?? ''
800+
}
801+
802+
for (const chunkName of chunkCSSMap.keys())
803+
collect(prelimaryNameToChunkMap.get(chunkName)?.fileName ?? '')
804+
805+
return css
806+
}
807+
let extractedCss = !hasEmitted && extractCss()
808+
if (extractedCss) {
790809
hasEmitted = true
791810
extractedCss = await finalizeCss(extractedCss, true, config)
792811
this.emitFile({

0 commit comments

Comments
 (0)