Skip to content

Commit c3f2b85

Browse files
committed
refactor: avoid direct mutate chunk at metadata plugin
1 parent c469a78 commit c3f2b85

File tree

7 files changed

+41
-24
lines changed

7 files changed

+41
-24
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import {
3131
import { DEFAULT_ASSETS_INLINE_LIMIT, FS_PREFIX } from '../constants'
3232
import type { ModuleGraph } from '../server/moduleGraph'
3333
import { cleanUrl, withTrailingSlash } from '../../shared/utils'
34+
import { getChunkMetadata } from './metadata'
3435

3536
// referenceId is base64url but replaces - with $
3637
export const assetUrlRE = /__VITE_ASSET__([\w$]+)__(?:\$_(.*?)__)?/g
@@ -89,7 +90,7 @@ export function renderAssetUrlInJS(
8990
s ||= new MagicString(code)
9091
const [full, referenceId, postfix = ''] = match
9192
const file = ctx.getFileName(referenceId)
92-
chunk.viteMetadata!.importedAssets.add(cleanUrl(file))
93+
getChunkMetadata(chunk.fileName)!.importedAssets.add(cleanUrl(file))
9394
const filename = file + postfix
9495
const replacement = toOutputFilePathInJS(
9596
filename,

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

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ import {
8383
} from './asset'
8484
import type { ESBuildOptions } from './esbuild'
8585
import { getChunkOriginalFileName } from './manifest'
86+
import { getChunkMetadata } from './metadata'
8687

8788
const decoder = new TextDecoder()
8889
// const debug = createDebugger('vite:css')
@@ -600,7 +601,7 @@ export function cssPostPlugin(config: ResolvedConfig): Plugin {
600601
// replace asset url references with resolved url.
601602
chunkCSS = chunkCSS.replace(assetUrlRE, (_, fileHash, postfix = '') => {
602603
const filename = this.getFileName(fileHash) + postfix
603-
chunk.viteMetadata!.importedAssets.add(cleanUrl(filename))
604+
getChunkMetadata(chunk.fileName)!.importedAssets.add(cleanUrl(filename))
604605
return encodeURIPath(
605606
toOutputFilePathInCss(
606607
filename,
@@ -771,7 +772,7 @@ export function cssPostPlugin(config: ResolvedConfig): Plugin {
771772
generatedAssets
772773
.get(config)!
773774
.set(referenceId, { originalName: originalFilename, isEntry })
774-
chunk.viteMetadata!.importedCss.add(this.getFileName(referenceId))
775+
getChunkMetadata(chunk.fileName)!.importedCss.add(this.getFileName(referenceId))
775776
} else if (!config.build.ssr) {
776777
// legacy build and inline css
777778

@@ -831,9 +832,9 @@ export function cssPostPlugin(config: ResolvedConfig): Plugin {
831832
},
832833

833834
augmentChunkHash(chunk) {
834-
if (chunk.viteMetadata?.importedCss.size) {
835+
if (getChunkMetadata(chunk.fileName)?.importedCss.size) {
835836
let hash = ''
836-
for (const id of chunk.viteMetadata.importedCss) {
837+
for (const id of getChunkMetadata(chunk.fileName)!.importedCss) {
837838
hash += id
838839
}
839840
return hash
@@ -924,14 +925,12 @@ export function cssPostPlugin(config: ResolvedConfig): Plugin {
924925
// chunks instead.
925926
chunk.imports = chunk.imports.filter((file) => {
926927
if (pureCssChunkNames.includes(file)) {
927-
const { importedCss, importedAssets } = (
928-
bundle[file] as OutputChunk
929-
).viteMetadata!
928+
const { importedCss, importedAssets } = getChunkMetadata((bundle[file] as OutputChunk).fileName)!
930929
importedCss.forEach((file) =>
931-
chunk.viteMetadata!.importedCss.add(file),
930+
getChunkMetadata(chunk.fileName)!.importedCss.add(file),
932931
)
933932
importedAssets.forEach((file) =>
934-
chunk.viteMetadata!.importedAssets.add(file),
933+
getChunkMetadata(chunk.fileName)!.importedAssets.add(file),
935934
)
936935
chunkImportsPureCssChunk = true
937936
return false

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import {
3939
} from './asset'
4040
import { isCSSRequest } from './css'
4141
import { modulePreloadPolyfillId } from './modulePreloadPolyfill'
42+
import { getChunkMetadata } from './metadata'
4243

4344
interface ScriptAssetsUrl {
4445
start: number
@@ -758,7 +759,7 @@ export function buildHtmlPlugin(config: ResolvedConfig): Plugin {
758759
})
759760
}
760761

761-
chunk.viteMetadata!.importedCss.forEach((file) => {
762+
getChunkMetadata(chunk.fileName)!.importedCss.forEach((file) => {
762763
if (!seen.has(file)) {
763764
seen.add(file)
764765
tags.push({
@@ -906,7 +907,7 @@ export function buildHtmlPlugin(config: ResolvedConfig): Plugin {
906907
result = result.replace(assetUrlRE, (_, fileHash, postfix = '') => {
907908
const file = this.getFileName(fileHash)
908909
if (chunk) {
909-
chunk.viteMetadata!.importedAssets.add(cleanUrl(file))
910+
getChunkMetadata(chunk.fileName)!.importedAssets.add(cleanUrl(file))
910911
}
911912
return encodeURIPath(toOutputAssetFilePath(file)) + postfix
912913
})

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { toOutputFilePathInJS } from '../build'
2020
import { genSourceMapUrl } from '../server/sourcemap'
2121
import { removedPureCssFilesCache } from './css'
2222
import { createParseErrorInfo } from './importAnalysis'
23+
import { getChunkMetadata } from './metadata'
2324

2425
type FileDep = {
2526
url: string
@@ -542,7 +543,7 @@ export function buildImportAnalysisPlugin(config: ResolvedConfig): Plugin {
542543
chunk.imports.forEach(addDeps)
543544
// Ensure that the css imported by current chunk is loaded after the dependencies.
544545
// So the style of current chunk won't be overwritten unexpectedly.
545-
chunk.viteMetadata!.importedCss.forEach((file) => {
546+
getChunkMetadata(chunk.fileName)!.importedCss.forEach((file) => {
546547
deps.add(file)
547548
})
548549
}
@@ -551,8 +552,8 @@ export function buildImportAnalysisPlugin(config: ResolvedConfig): Plugin {
551552
removedPureCssFilesCache.get(config)!
552553
const chunk = removedPureCssFiles.get(filename)
553554
if (chunk) {
554-
if (chunk.viteMetadata!.importedCss.size) {
555-
chunk.viteMetadata!.importedCss.forEach((file) => {
555+
if (getChunkMetadata(chunk.fileName)!.importedCss.size) {
556+
getChunkMetadata(chunk.fileName)!.importedCss.forEach((file) => {
556557
deps.add(file)
557558
})
558559
hasRemovedPureCssChunk = true

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import type { Plugin } from '../plugin'
1010
import { normalizePath, sortObjectKeys } from '../utils'
1111
import { generatedAssets } from './asset'
1212
import type { GeneratedAssetMeta } from './asset'
13+
import { getChunkMetadata } from './metadata'
1314

1415
const endsWithJSRE = /\.[cm]?js$/
1516

@@ -88,11 +89,11 @@ export function manifestPlugin(config: ResolvedConfig): Plugin {
8889
}
8990
}
9091

91-
if (chunk.viteMetadata?.importedCss.size) {
92-
manifestChunk.css = [...chunk.viteMetadata.importedCss]
92+
if (getChunkMetadata(chunk.fileName)?.importedCss.size) {
93+
manifestChunk.css = [...getChunkMetadata(chunk.fileName)!.importedCss]
9394
}
94-
if (chunk.viteMetadata?.importedAssets.size) {
95-
manifestChunk.assets = [...chunk.viteMetadata.importedAssets]
95+
if (getChunkMetadata(chunk.fileName)?.importedAssets.size) {
96+
manifestChunk.assets = [...getChunkMetadata(chunk.fileName)!.importedAssets]
9697
}
9798

9899
return manifestChunk
Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
import type { Plugin } from '../plugin'
22

3+
interface ChunkMetadata {
4+
importedAssets: Set<string>
5+
importedCss: Set<string>
6+
}
7+
8+
const chunkMetadataMap = new Map<string, ChunkMetadata>()
9+
310
/**
411
* Prepares the rendered chunks to contain additional metadata during build.
512
*/
@@ -8,11 +15,17 @@ export function metadataPlugin(): Plugin {
815
name: 'vite:build-metadata',
916

1017
async renderChunk(_code, chunk) {
11-
chunk.viteMetadata = {
18+
// Since the chunk come from rust side, mutate it directly will not sync back to rust side.
19+
// The next usage will lost the metadata
20+
chunkMetadataMap.set(chunk.fileName, {
1221
importedAssets: new Set(),
1322
importedCss: new Set(),
14-
}
23+
})
1524
return null
1625
},
1726
}
1827
}
28+
29+
export function getChunkMetadata(fileName: string): ChunkMetadata | undefined {
30+
return chunkMetadataMap.get(fileName)
31+
}

packages/vite/src/node/ssr/ssrManifestPlugin.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
numberToPos,
1616
sortObjectKeys,
1717
} from '../utils'
18+
import { getChunkMetadata } from '../plugins/metadata'
1819

1920
export function ssrManifestPlugin(config: ResolvedConfig): Plugin {
2021
// module id => preload assets mapping
@@ -35,11 +36,11 @@ export function ssrManifestPlugin(config: ResolvedConfig): Plugin {
3536
mappedChunks.push(joinUrlSegments(base, chunk.fileName))
3637
// <link> tags for entry chunks are already generated in static HTML,
3738
// so we only need to record info for non-entry chunks.
38-
chunk.viteMetadata!.importedCss.forEach((file) => {
39+
getChunkMetadata(chunk.fileName)!.importedCss.forEach((file) => {
3940
mappedChunks.push(joinUrlSegments(base, file))
4041
})
4142
}
42-
chunk.viteMetadata!.importedAssets.forEach((file) => {
43+
getChunkMetadata(chunk.fileName)!.importedAssets.forEach((file) => {
4344
mappedChunks.push(joinUrlSegments(base, file))
4445
})
4546
}
@@ -77,7 +78,7 @@ export function ssrManifestPlugin(config: ResolvedConfig): Plugin {
7778
analyzed.add(filename)
7879
const chunk = bundle[filename] as OutputChunk | undefined
7980
if (chunk) {
80-
chunk.viteMetadata!.importedCss.forEach((file) => {
81+
getChunkMetadata(chunk.fileName)!.importedCss.forEach((file) => {
8182
deps.push(joinUrlSegments(base, file)) // TODO:base
8283
})
8384
chunk.imports.forEach(addDeps)

0 commit comments

Comments
 (0)