Skip to content

Commit a159767

Browse files
committed
refactor: avoid direct mutate chunk at metadata plugin
1 parent 584fd7b commit a159767

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')
@@ -598,7 +599,7 @@ export function cssPostPlugin(config: ResolvedConfig): Plugin {
598599
// replace asset url references with resolved url.
599600
chunkCSS = chunkCSS.replace(assetUrlRE, (_, fileHash, postfix = '') => {
600601
const filename = this.getFileName(fileHash) + postfix
601-
chunk.viteMetadata!.importedAssets.add(cleanUrl(filename))
602+
getChunkMetadata(chunk.fileName)!.importedAssets.add(cleanUrl(filename))
602603
return encodeURIPath(
603604
toOutputFilePathInCss(
604605
filename,
@@ -767,7 +768,7 @@ export function cssPostPlugin(config: ResolvedConfig): Plugin {
767768
generatedAssets
768769
.get(config)!
769770
.set(referenceId, { originalName: originalFilename, isEntry })
770-
chunk.viteMetadata!.importedCss.add(this.getFileName(referenceId))
771+
getChunkMetadata(chunk.fileName)!.importedCss.add(this.getFileName(referenceId))
771772
} else if (!config.build.ssr) {
772773
// legacy build and inline css
773774

@@ -827,9 +828,9 @@ export function cssPostPlugin(config: ResolvedConfig): Plugin {
827828
},
828829

829830
augmentChunkHash(chunk) {
830-
if (chunk.viteMetadata?.importedCss.size) {
831+
if (getChunkMetadata(chunk.fileName)?.importedCss.size) {
831832
let hash = ''
832-
for (const id of chunk.viteMetadata.importedCss) {
833+
for (const id of getChunkMetadata(chunk.fileName)!.importedCss) {
833834
hash += id
834835
}
835836
return hash
@@ -920,14 +921,12 @@ export function cssPostPlugin(config: ResolvedConfig): Plugin {
920921
// chunks instead.
921922
chunk.imports = chunk.imports.filter((file) => {
922923
if (pureCssChunkNames.includes(file)) {
923-
const { importedCss, importedAssets } = (
924-
bundle[file] as OutputChunk
925-
).viteMetadata!
924+
const { importedCss, importedAssets } = getChunkMetadata((bundle[file] as OutputChunk).fileName)!
926925
importedCss.forEach((file) =>
927-
chunk.viteMetadata!.importedCss.add(file),
926+
getChunkMetadata(chunk.fileName)!.importedCss.add(file),
928927
)
929928
importedAssets.forEach((file) =>
930-
chunk.viteMetadata!.importedAssets.add(file),
929+
getChunkMetadata(chunk.fileName)!.importedAssets.add(file),
931930
)
932931
chunkImportsPureCssChunk = true
933932
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)