Skip to content

Commit e2bb54e

Browse files
authored
fix: reset viteMetadata in watch mode (#342)
1 parent 40b5198 commit e2bb54e

File tree

2 files changed

+54
-19
lines changed

2 files changed

+54
-19
lines changed

packages/vite/src/node/build.ts

Lines changed: 52 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -602,7 +602,7 @@ async function buildEnvironment(
602602
const outDir = resolve(options.outDir)
603603

604604
// inject environment and ssr arg to plugin load/transform hooks
605-
const chunkMetadataMap = new Map<string, ChunkMetadata>()
605+
const chunkMetadataMap = new ChunkMetadataMap()
606606
const plugins = environment.plugins.map((p) =>
607607
injectEnvironmentToHooks(environment, chunkMetadataMap, p),
608608
)
@@ -859,6 +859,7 @@ async function buildEnvironment(
859859
watcher.on('event', (event) => {
860860
if (event.code === 'BUNDLE_START') {
861861
logger.info(colors.cyan(`\nbuild started...`))
862+
chunkMetadataMap.clearResetChunks()
862863
if (options.write) {
863864
prepareOutDir(resolvedOutDirs, emptyOutDir, environment)
864865
}
@@ -1200,9 +1201,51 @@ function isExternal(id: string, test: string | RegExp) {
12001201
}
12011202
}
12021203

1204+
export class ChunkMetadataMap {
1205+
private _inner = new Map<string, ChunkMetadata>()
1206+
private _resetChunks = new Set<string>()
1207+
1208+
private _getKey(chunk: RenderedChunk | OutputChunk): string {
1209+
return 'preliminaryFileName' in chunk
1210+
? chunk.preliminaryFileName
1211+
: chunk.fileName
1212+
}
1213+
1214+
private _getDefaultValue(chunk: RenderedChunk | OutputChunk): ChunkMetadata {
1215+
return {
1216+
importedAssets: new Set(),
1217+
importedCss: new Set(),
1218+
// NOTE: adding this as a workaround for now ideally we'd want to remove this workaround
1219+
// use shared `chunk.modules` object to allow mutation on js side plugins
1220+
__modules: chunk.modules,
1221+
}
1222+
}
1223+
1224+
get(chunk: RenderedChunk | OutputChunk): ChunkMetadata {
1225+
const key = this._getKey(chunk)
1226+
if (!this._inner.has(key)) {
1227+
this._inner.set(key, this._getDefaultValue(chunk))
1228+
}
1229+
return this._inner.get(key)!
1230+
}
1231+
1232+
// reset chunk metadata on the first RenderChunk call for watch mode
1233+
reset(chunk: RenderedChunk | OutputChunk): void {
1234+
const key = this._getKey(chunk)
1235+
if (this._resetChunks.has(key)) return
1236+
1237+
this._resetChunks.add(key)
1238+
this._inner.set(key, this._getDefaultValue(chunk))
1239+
}
1240+
1241+
clearResetChunks(): void {
1242+
this._resetChunks.clear()
1243+
}
1244+
}
1245+
12031246
export function injectEnvironmentToHooks(
12041247
environment: BuildEnvironment,
1205-
chunkMetadataMap: Map<string, ChunkMetadata>,
1248+
chunkMetadataMap: ChunkMetadataMap,
12061249
plugin: Plugin,
12071250
): Plugin {
12081251
const { resolveId, load, transform } = plugin
@@ -1319,7 +1362,7 @@ function wrapEnvironmentTransform(
13191362

13201363
function wrapEnvironmentHook<HookName extends keyof Plugin>(
13211364
environment: BuildEnvironment,
1322-
chunkMetadataMap: Map<string, ChunkMetadata>,
1365+
chunkMetadataMap: ChunkMetadataMap,
13231366
plugin: Plugin,
13241367
hookName: HookName,
13251368
): Plugin[HookName] {
@@ -1334,7 +1377,7 @@ function wrapEnvironmentHook<HookName extends keyof Plugin>(
13341377
...args: any[]
13351378
) {
13361379
if (hookName === 'renderChunk') {
1337-
injectChunkMetadata(chunkMetadataMap, args[1])
1380+
injectChunkMetadata(chunkMetadataMap, args[1], true)
13381381
}
13391382
if (hookName === 'augmentChunkHash') {
13401383
injectChunkMetadata(chunkMetadataMap, args[0])
@@ -1361,25 +1404,17 @@ function wrapEnvironmentHook<HookName extends keyof Plugin>(
13611404
}
13621405

13631406
function injectChunkMetadata(
1364-
chunkMetadataMap: Map<string, ChunkMetadata>,
1407+
chunkMetadataMap: ChunkMetadataMap,
13651408
chunk: RenderedChunk | OutputChunk,
1409+
resetChunkMetadata = false,
13661410
) {
1367-
const key =
1368-
'preliminaryFileName' in chunk ? chunk.preliminaryFileName : chunk.fileName
1369-
if (!chunkMetadataMap.has(key)) {
1370-
chunkMetadataMap.set(key, {
1371-
importedAssets: new Set(),
1372-
importedCss: new Set(),
1373-
// NOTE: adding this as a workaround for now ideally we'd want to remove this workaround
1374-
// use shared `chunk.modules` object
1375-
// to allow mutation on js side plugins
1376-
__modules: chunk.modules,
1377-
})
1411+
if (resetChunkMetadata) {
1412+
chunkMetadataMap.reset(chunk)
13781413
}
13791414
// define instead of assign to avoid detected as a change
13801415
// https://github.com/rolldown/rolldown/blob/f4c5ff27799f2b0152c689c398e61bc7d30429ff/packages/rolldown/src/utils/transform-to-rollup-output.ts#L87
13811416
Object.defineProperty(chunk, 'viteMetadata', {
1382-
value: chunkMetadataMap.get(key),
1417+
value: chunkMetadataMap.get(chunk),
13831418
enumerable: true,
13841419
})
13851420
Object.defineProperty(chunk, 'modules', {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import MagicString from 'magic-string'
33
import type { OutputChunk, RollupError } from 'rolldown'
44
import colors from 'picocolors'
55
import { type ImportSpecifier, init, parse } from 'es-module-lexer'
6-
import type { ChunkMetadata } from 'types/metadata'
76
import { webWorkerPostPlugin as nativeWebWorkerPostPlugin } from 'rolldown/experimental'
87
import type { ResolvedConfig } from '../config'
98
import { type Plugin, perEnvironmentPlugin } from '../plugin'
@@ -17,6 +16,7 @@ import {
1716
} from '../utils'
1817
import {
1918
BuildEnvironment,
19+
ChunkMetadataMap,
2020
createToImportMetaURLBasedRelativeRuntime,
2121
injectEnvironmentToHooks,
2222
onRollupLog,
@@ -94,7 +94,7 @@ async function bundleWorkerEntry(
9494
const workerEnvironment = new BuildEnvironment('client', workerConfig) // TODO: should this be 'worker'?
9595
await workerEnvironment.init()
9696

97-
const chunkMetadataMap = new Map<string, ChunkMetadata>()
97+
const chunkMetadataMap = new ChunkMetadataMap()
9898
const bundle = await rolldown({
9999
...rollupOptions,
100100
input,

0 commit comments

Comments
 (0)