Skip to content

Commit 55b487d

Browse files
authored
fix: isolate chunk.viteMetadata values for each build (#74)
1 parent 6ff7d2e commit 55b487d

File tree

11 files changed

+81
-71
lines changed

11 files changed

+81
-71
lines changed

packages/vite/src/node/build.ts

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ import type {
77
InternalModuleFormat,
88
LoggingFunction,
99
ModuleFormat,
10+
OutputBundle,
11+
OutputChunk,
1012
OutputOptions,
13+
RenderedChunk,
1114
RolldownPlugin,
1215
RollupBuild,
1316
RollupError,
@@ -24,6 +27,7 @@ import {
2427
import type { RollupCommonJSOptions } from 'dep-types/commonjs'
2528
import type { RollupDynamicImportVarsOptions } from 'dep-types/dynamicImportVars'
2629
import type { TransformOptions } from 'esbuild'
30+
import type { ChunkMetadata } from 'types/metadata'
2731
import { withTrailingSlash } from '../shared/utils'
2832
import {
2933
DEFAULT_ASSETS_INLINE_LIMIT,
@@ -623,8 +627,9 @@ async function buildEnvironment(
623627
const outDir = resolve(options.outDir)
624628

625629
// inject environment and ssr arg to plugin load/transform hooks
630+
const chunkMetadataMap = new Map<string, ChunkMetadata>()
626631
const plugins = environment.plugins.map((p) =>
627-
injectEnvironmentToHooks(environment, p),
632+
injectEnvironmentToHooks(environment, chunkMetadataMap, p),
628633
)
629634

630635
const rollupOptions: RollupOptions = {
@@ -1132,6 +1137,7 @@ function isExternal(id: string, test: string | RegExp) {
11321137

11331138
export function injectEnvironmentToHooks(
11341139
environment: BuildEnvironment,
1140+
chunkMetadataMap: Map<string, ChunkMetadata>,
11351141
plugin: Plugin,
11361142
): Plugin {
11371143
const { resolveId, load, transform } = plugin
@@ -1155,7 +1161,12 @@ export function injectEnvironmentToHooks(
11551161
break
11561162
default:
11571163
if (ROLLUP_HOOKS.includes(hook)) {
1158-
;(clone as any)[hook] = wrapEnvironmentHook(environment, clone[hook])
1164+
;(clone as any)[hook] = wrapEnvironmentHook(
1165+
environment,
1166+
chunkMetadataMap,
1167+
plugin,
1168+
hook,
1169+
)
11591170
}
11601171
break
11611172
}
@@ -1243,8 +1254,11 @@ function wrapEnvironmentTransform(
12431254

12441255
function wrapEnvironmentHook<HookName extends keyof Plugin>(
12451256
environment: BuildEnvironment,
1246-
hook?: Plugin[HookName],
1257+
chunkMetadataMap: Map<string, ChunkMetadata>,
1258+
plugin: Plugin,
1259+
hookName: HookName,
12471260
): Plugin[HookName] {
1261+
const hook = plugin[hookName]
12481262
if (!hook) return
12491263

12501264
const fn = getHookHandler(hook)
@@ -1254,6 +1268,20 @@ function wrapEnvironmentHook<HookName extends keyof Plugin>(
12541268
this: PluginContext,
12551269
...args: any[]
12561270
) {
1271+
if (hookName === 'renderChunk') {
1272+
injectChunkMetadata(chunkMetadataMap, args[1])
1273+
}
1274+
if (hookName === 'augmentChunkHash') {
1275+
injectChunkMetadata(chunkMetadataMap, args[0])
1276+
}
1277+
if (hookName === 'generateBundle') {
1278+
const bundle = args[1] as OutputBundle
1279+
for (const chunk of Object.values(bundle)) {
1280+
if (chunk.type === 'chunk') {
1281+
injectChunkMetadata(chunkMetadataMap, chunk)
1282+
}
1283+
}
1284+
}
12571285
return fn.call(injectEnvironmentInContext(this, environment), ...args)
12581286
}
12591287

@@ -1267,6 +1295,21 @@ function wrapEnvironmentHook<HookName extends keyof Plugin>(
12671295
}
12681296
}
12691297

1298+
function injectChunkMetadata(
1299+
chunkMetadataMap: Map<string, ChunkMetadata>,
1300+
chunk: RenderedChunk | OutputChunk,
1301+
) {
1302+
const key =
1303+
'preliminaryFileName' in chunk ? chunk.preliminaryFileName : chunk.fileName
1304+
if (!chunkMetadataMap.has(key)) {
1305+
chunkMetadataMap.set(key, {
1306+
importedAssets: new Set(),
1307+
importedCss: new Set(),
1308+
})
1309+
}
1310+
chunk.viteMetadata = chunkMetadataMap.get(key)
1311+
}
1312+
12701313
function injectEnvironmentInContext<Context extends MinimalPluginContext>(
12711314
context: Context,
12721315
environment: BuildEnvironment,

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ import {
3030
withTrailingSlash,
3131
} from '../../shared/utils'
3232
import type { Environment } from '../environment'
33-
import { getChunkMetadata } from './metadata'
3433

3534
// referenceId is base64url but replaces - with $
3635
export const assetUrlRE = /__VITE_ASSET__([\w$]+)__(?:\$_(.*?)__)?/g
@@ -97,7 +96,7 @@ export function renderAssetUrlInJS(
9796
s ||= new MagicString(code)
9897
const [full, referenceId, postfix = ''] = match
9998
const file = pluginContext.getFileName(referenceId)
100-
getChunkMetadata(chunk)!.importedAssets.add(cleanUrl(file))
99+
chunk.viteMetadata!.importedAssets.add(cleanUrl(file))
101100
const filename = file + postfix
102101
const replacement = toOutputFilePathInJS(
103102
environment,

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

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,6 @@ import {
103103
} from './asset'
104104
import type { ESBuildOptions } from './esbuild'
105105
import { getChunkOriginalFileName } from './manifest'
106-
import { getChunkMetadata } from './metadata'
107106

108107
const decoder = new TextDecoder()
109108
// const debug = createDebugger('vite:css')
@@ -691,7 +690,7 @@ export function cssPostPlugin(config: ResolvedConfig): RolldownPlugin {
691690
// replace asset url references with resolved url.
692691
chunkCSS = chunkCSS.replace(assetUrlRE, (_, fileHash, postfix = '') => {
693692
const filename = this.getFileName(fileHash) + postfix
694-
getChunkMetadata(chunk)!.importedAssets.add(cleanUrl(filename))
693+
chunk.viteMetadata!.importedAssets.add(cleanUrl(filename))
695694
return encodeURIPath(
696695
toOutputFilePathInCss(
697696
filename,
@@ -803,7 +802,7 @@ export function cssPostPlugin(config: ResolvedConfig): RolldownPlugin {
803802
generatedAssets.set(referenceId, { originalFileName })
804803

805804
const filename = this.getFileName(referenceId)
806-
getChunkMetadata(chunk)!.importedAssets.add(cleanUrl(filename))
805+
chunk.viteMetadata!.importedAssets.add(cleanUrl(filename))
807806
const replacement = toOutputFilePathInJS(
808807
this.environment,
809808
filename,
@@ -859,9 +858,7 @@ export function cssPostPlugin(config: ResolvedConfig): RolldownPlugin {
859858
source: chunkCSS,
860859
})
861860
generatedAssets.set(referenceId, { originalFileName, isEntry })
862-
getChunkMetadata(chunk)!.importedCss.add(
863-
this.getFileName(referenceId),
864-
)
861+
chunk.viteMetadata!.importedCss.add(this.getFileName(referenceId))
865862
} else if (this.environment.config.consumer === 'client') {
866863
// legacy build and inline css
867864

@@ -916,9 +913,9 @@ export function cssPostPlugin(config: ResolvedConfig): RolldownPlugin {
916913
},
917914

918915
augmentChunkHash(chunk) {
919-
if (getChunkMetadata(chunk)?.importedCss.size) {
916+
if (chunk.viteMetadata?.importedCss.size) {
920917
let hash = ''
921-
for (const id of getChunkMetadata(chunk)!.importedCss) {
918+
for (const id of chunk.viteMetadata.importedCss) {
922919
hash += id
923920
}
924921
return hash
@@ -1012,14 +1009,14 @@ export function cssPostPlugin(config: ResolvedConfig): RolldownPlugin {
10121009
// chunks instead.
10131010
chunk.imports = chunk.imports.filter((file) => {
10141011
if (pureCssChunkNames.includes(file)) {
1015-
const { importedCss, importedAssets } = getChunkMetadata(
1016-
bundle[file] as OutputChunk,
1017-
)!
1012+
const { importedCss, importedAssets } = (
1013+
bundle[file] as OutputChunk
1014+
).viteMetadata!
10181015
importedCss.forEach((file) =>
1019-
getChunkMetadata(chunk)!.importedCss.add(file),
1016+
chunk.viteMetadata!.importedCss.add(file),
10201017
)
10211018
importedAssets.forEach((file) =>
1022-
getChunkMetadata(chunk)!.importedAssets.add(file),
1019+
chunk.viteMetadata!.importedAssets.add(file),
10231020
)
10241021
chunkImportsPureCssChunk = true
10251022
return false

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ import {
4343
} from './asset'
4444
import { cssBundleNameCache, isCSSRequest } from './css'
4545
import { modulePreloadPolyfillId } from './modulePreloadPolyfill'
46-
import { getChunkMetadata } from './metadata'
4746

4847
interface ScriptAssetsUrl {
4948
start: number
@@ -818,7 +817,7 @@ export function buildHtmlPlugin(config: ResolvedConfig): RolldownPlugin {
818817
})
819818
}
820819

821-
getChunkMetadata(chunk)!.importedCss.forEach((file) => {
820+
chunk.viteMetadata!.importedCss.forEach((file) => {
822821
if (!seen.has(file)) {
823822
seen.add(file)
824823
tags.push({
@@ -973,7 +972,7 @@ export function buildHtmlPlugin(config: ResolvedConfig): RolldownPlugin {
973972
result = result.replace(assetUrlRE, (_, fileHash, postfix = '') => {
974973
const file = this.getFileName(fileHash)
975974
if (chunk) {
976-
getChunkMetadata(chunk)!.importedAssets.add(cleanUrl(file))
975+
chunk.viteMetadata!.importedAssets.add(cleanUrl(file))
977976
}
978977
return encodeURIPath(toOutputAssetFilePath(file)) + postfix
979978
})

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import { genSourceMapUrl } from '../server/sourcemap'
2222
import type { PartialEnvironment } from '../baseEnvironment'
2323
import { removedPureCssFilesCache } from './css'
2424
import { createParseErrorInfo } from './importAnalysis'
25-
import { getChunkMetadata } from './metadata'
2625

2726
type FileDep = {
2827
url: string
@@ -560,7 +559,7 @@ export function buildImportAnalysisPlugin(config: ResolvedConfig): [Plugin] {
560559
chunk.imports.forEach(addDeps)
561560
// Ensure that the css imported by current chunk is loaded after the dependencies.
562561
// So the style of current chunk won't be overwritten unexpectedly.
563-
getChunkMetadata(chunk)!.importedCss.forEach((file) => {
562+
chunk.viteMetadata!.importedCss.forEach((file) => {
564563
deps.add(file)
565564
})
566565
}
@@ -569,8 +568,8 @@ export function buildImportAnalysisPlugin(config: ResolvedConfig): [Plugin] {
569568
removedPureCssFilesCache.get(config)!
570569
const chunk = removedPureCssFiles.get(filename)
571570
if (chunk) {
572-
if (getChunkMetadata(chunk)!.importedCss.size) {
573-
getChunkMetadata(chunk)!.importedCss.forEach((file) => {
571+
if (chunk.viteMetadata!.importedCss.size) {
572+
chunk.viteMetadata!.importedCss.forEach((file) => {
574573
deps.add(file)
575574
})
576575
hasRemovedPureCssChunk = true

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ import { preAliasPlugin } from './preAlias'
3434
import { definePlugin } from './define'
3535
import { workerImportMetaUrlPlugin } from './workerImportMetaUrl'
3636
import { assetImportMetaUrlPlugin } from './assetImportMetaUrl'
37-
import { metadataPlugin } from './metadata'
3837
import { dynamicImportVarsPlugin } from './dynamicImportVars'
3938
import { importGlobPlugin } from './importMetaGlob'
4039
import { oxcPlugin } from './oxc'
@@ -60,7 +59,6 @@ export async function resolvePlugins(
6059

6160
return [
6261
depOptimizationEnabled ? optimizedDepsPlugin() : null,
63-
isBuild ? metadataPlugin() : null,
6462
!isWorker ? watchPackageDataPlugin(config.packageCache) : null,
6563
!isBuild ? preAliasPlugin(config) : null,
6664
enableNativePlugin

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import type {
88
import type { Plugin } from '../plugin'
99
import { normalizePath, sortObjectKeys } from '../utils'
1010
import { perEnvironmentState } from '../environment'
11-
import { getChunkMetadata } from './metadata'
1211
import { generatedAssetsMap } from './asset'
1312

1413
const endsWithJSRE = /\.[cm]?js$/
@@ -108,11 +107,11 @@ export function manifestPlugin(): Plugin {
108107
}
109108
}
110109

111-
if (getChunkMetadata(chunk)?.importedCss.size) {
112-
manifestChunk.css = [...getChunkMetadata(chunk)!.importedCss]
110+
if (chunk.viteMetadata?.importedCss.size) {
111+
manifestChunk.css = [...chunk.viteMetadata.importedCss]
113112
}
114-
if (getChunkMetadata(chunk)?.importedAssets.size) {
115-
manifestChunk.assets = [...getChunkMetadata(chunk)!.importedAssets]
113+
if (chunk.viteMetadata?.importedAssets.size) {
114+
manifestChunk.assets = [...chunk.viteMetadata.importedAssets]
116115
}
117116

118117
return manifestChunk

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

Lines changed: 0 additions & 34 deletions
This file was deleted.

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import path from 'node:path'
22
import MagicString from 'magic-string'
33
import type { OutputChunk, RolldownPlugin, RollupError } from 'rolldown'
4+
import type { ChunkMetadata } from 'types/metadata'
45
import type { ResolvedConfig } from '../config'
56
import type { Plugin } from '../plugin'
67
import { ENV_ENTRY, ENV_PUBLIC_PATH } from '../constants'
@@ -77,11 +78,12 @@ async function bundleWorkerEntry(
7778
const workerEnvironment = new BuildEnvironment('client', workerConfig) // TODO: should this be 'worker'?
7879
await workerEnvironment.init()
7980

81+
const chunkMetadataMap = new Map<string, ChunkMetadata>()
8082
const bundle = await rolldown({
8183
...rollupOptions,
8284
input,
8385
plugins: workerEnvironment.plugins.map((p) =>
84-
injectEnvironmentToHooks(workerEnvironment, p),
86+
injectEnvironmentToHooks(workerEnvironment, chunkMetadataMap, p),
8587
),
8688
onwarn(warning, warn) {
8789
onRollupWarning(warning, warn, workerEnvironment)

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

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

2019
export function ssrManifestPlugin(): Plugin {
2120
// module id => preload assets mapping
@@ -45,11 +44,11 @@ export function ssrManifestPlugin(): Plugin {
4544
mappedChunks.push(joinUrlSegments(base, chunk.fileName))
4645
// <link> tags for entry chunks are already generated in static HTML,
4746
// so we only need to record info for non-entry chunks.
48-
getChunkMetadata(chunk)!.importedCss.forEach((file) => {
47+
chunk.viteMetadata!.importedCss.forEach((file) => {
4948
mappedChunks.push(joinUrlSegments(base, file))
5049
})
5150
}
52-
getChunkMetadata(chunk)!.importedAssets.forEach((file) => {
51+
chunk.viteMetadata!.importedAssets.forEach((file) => {
5352
mappedChunks.push(joinUrlSegments(base, file))
5453
})
5554
}
@@ -87,7 +86,7 @@ export function ssrManifestPlugin(): Plugin {
8786
analyzed.add(filename)
8887
const chunk = bundle[filename] as OutputChunk | undefined
8988
if (chunk) {
90-
getChunkMetadata(chunk)!.importedCss.forEach((file) => {
89+
chunk.viteMetadata!.importedCss.forEach((file) => {
9190
deps.push(joinUrlSegments(base, file))
9291
})
9392
chunk.imports.forEach(addDeps)

0 commit comments

Comments
 (0)