Skip to content

Commit f2957c8

Browse files
authored
refactor: use originalFileNames/names (#18240)
1 parent 8cc8e51 commit f2957c8

File tree

8 files changed

+225
-183
lines changed

8 files changed

+225
-183
lines changed

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@
6969
"playwright-chromium": "^1.48.1",
7070
"prettier": "3.3.3",
7171
"rimraf": "^5.0.10",
72-
"rollup": "^4.22.5",
72+
"rollup": "^4.23.0",
7373
"rollup-plugin-esbuild": "^6.1.1",
7474
"simple-git-hooks": "^2.11.1",
7575
"tslib": "^2.8.0",

packages/vite/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@
8787
"dependencies": {
8888
"esbuild": "^0.24.0",
8989
"postcss": "^8.4.47",
90-
"rollup": "^4.22.5"
90+
"rollup": "^4.23.0"
9191
},
9292
"optionalDependencies": {
9393
"fsevents": "~2.3.3"

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

+3-14
Original file line numberDiff line numberDiff line change
@@ -38,17 +38,8 @@ const jsSourceMapRE = /\.[cm]?js\.map$/
3838

3939
const assetCache = new WeakMap<Environment, Map<string, string>>()
4040

41-
// chunk.name is the basename for the asset ignoring the directory structure
42-
// For the manifest, we need to preserve the original file path and isEntry
43-
// for CSS assets. We keep a map from referenceId to this information.
44-
export interface GeneratedAssetMeta {
45-
originalFileName: string
46-
isEntry?: boolean
47-
}
48-
export const generatedAssetsMap = new WeakMap<
49-
Environment,
50-
Map<string, GeneratedAssetMeta>
51-
>()
41+
/** a set of referenceId for entry CSS assets for each environment */
42+
export const cssEntriesMap = new WeakMap<Environment, Set<string>>()
5243

5344
// add own dictionary entry by directly assigning mrmime
5445
export function registerCustomMime(): void {
@@ -146,7 +137,7 @@ export function assetPlugin(config: ResolvedConfig): Plugin {
146137

147138
buildStart() {
148139
assetCache.set(this.environment, new Map())
149-
generatedAssetsMap.set(this.environment, new Map())
140+
cssEntriesMap.set(this.environment, new Set())
150141
},
151142

152143
resolveId(id) {
@@ -384,8 +375,6 @@ async function fileToBuiltUrl(
384375
originalFileName,
385376
source: content,
386377
})
387-
generatedAssetsMap.get(environment)!.set(referenceId, { originalFileName })
388-
389378
url = `__VITE_ASSET__${referenceId}__${postfix ? `$_${postfix}__` : ``}`
390379
}
391380

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

+6-5
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,9 @@ import type { DevEnvironment } from '..'
8383
import { addToHTMLProxyTransformResult } from './html'
8484
import {
8585
assetUrlRE,
86+
cssEntriesMap,
8687
fileToDevUrl,
8788
fileToUrl,
88-
generatedAssetsMap,
8989
publicAssetUrlCache,
9090
publicAssetUrlRE,
9191
publicFileToBuiltUrl,
@@ -447,7 +447,9 @@ export function cssPostPlugin(config: ResolvedConfig): Plugin {
447447
assetFileNames({
448448
type: 'asset',
449449
name: cssAssetName,
450+
names: [cssAssetName],
450451
originalFileName: null,
452+
originalFileNames: [],
451453
source: '/* vite internal call, ignore */',
452454
}),
453455
)
@@ -576,8 +578,6 @@ export function cssPostPlugin(config: ResolvedConfig): Plugin {
576578
},
577579

578580
async renderChunk(code, chunk, opts) {
579-
const generatedAssets = generatedAssetsMap.get(this.environment)!
580-
581581
let chunkCSS = ''
582582
// the chunk is empty if it's a dynamic entry chunk that only contains a CSS import
583583
const isJsChunkEmpty = code === '' && !chunk.isEntry
@@ -736,7 +736,6 @@ export function cssPostPlugin(config: ResolvedConfig): Plugin {
736736
originalFileName,
737737
source: content,
738738
})
739-
generatedAssets.set(referenceId, { originalFileName })
740739

741740
const filename = this.getFileName(referenceId)
742741
chunk.viteMetadata!.importedAssets.add(cleanUrl(filename))
@@ -794,7 +793,9 @@ export function cssPostPlugin(config: ResolvedConfig): Plugin {
794793
originalFileName,
795794
source: chunkCSS,
796795
})
797-
generatedAssets.set(referenceId, { originalFileName, isEntry })
796+
if (isEntry) {
797+
cssEntriesMap.get(this.environment)!.add(referenceId)
798+
}
798799
chunk.viteMetadata!.importedCss.add(this.getFileName(referenceId))
799800
} else if (this.environment.config.consumer === 'client') {
800801
// legacy build and inline css

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -869,7 +869,8 @@ export function buildHtmlPlugin(config: ResolvedConfig): Plugin {
869869
// inject css link when cssCodeSplit is false
870870
if (!this.environment.config.build.cssCodeSplit) {
871871
const cssChunk = Object.values(bundle).find(
872-
(chunk) => chunk.type === 'asset' && chunk.name === 'style.css',
872+
(chunk) =>
873+
chunk.type === 'asset' && chunk.names.includes('style.css'),
873874
) as OutputAsset | undefined
874875
if (cssChunk) {
875876
result = injectToHead(result, [

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

+20-27
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import type {
88
import type { Plugin } from '../plugin'
99
import { normalizePath, sortObjectKeys } from '../utils'
1010
import { usePerEnvironmentState } from '../environment'
11-
import { generatedAssetsMap } from './asset'
11+
import { cssEntriesMap } from './asset'
1212

1313
const endsWithJSRE = /\.[cm]?js$/
1414

@@ -127,18 +127,15 @@ export function manifestPlugin(): Plugin {
127127
return manifestChunk
128128
}
129129

130-
const assets = generatedAssetsMap.get(this.environment)!
131-
const entryCssAssetFileNames = new Set()
132-
for (const [id, asset] of assets.entries()) {
133-
if (asset.isEntry) {
134-
try {
135-
const fileName = this.getFileName(id)
136-
entryCssAssetFileNames.add(fileName)
137-
} catch {
138-
// The asset was generated as part of a different output option.
139-
// It was already handled during the previous run of this plugin.
140-
assets.delete(id)
141-
}
130+
const entryCssReferenceIds = cssEntriesMap.get(this.environment)!
131+
const entryCssAssetFileNames = new Set(entryCssReferenceIds)
132+
for (const id of entryCssReferenceIds) {
133+
try {
134+
const fileName = this.getFileName(id)
135+
entryCssAssetFileNames.add(fileName)
136+
} catch {
137+
// The asset was generated as part of a different output option.
138+
// It was already handled during the previous run of this plugin.
142139
}
143140
}
144141

@@ -148,28 +145,24 @@ export function manifestPlugin(): Plugin {
148145
const chunk = bundle[file]
149146
if (chunk.type === 'chunk') {
150147
manifest[getChunkName(chunk)] = createChunk(chunk)
151-
} else if (chunk.type === 'asset' && typeof chunk.name === 'string') {
148+
} else if (chunk.type === 'asset' && chunk.names.length > 0) {
152149
// Add every unique asset to the manifest, keyed by its original name
153-
const src = chunk.originalFileName ?? chunk.name
150+
const src =
151+
chunk.originalFileNames.length > 0
152+
? chunk.originalFileNames[0]
153+
: chunk.names[0]
154154
const isEntry = entryCssAssetFileNames.has(chunk.fileName)
155155
const asset = createAsset(chunk, src, isEntry)
156156

157157
// If JS chunk and asset chunk are both generated from the same source file,
158158
// prioritize JS chunk as it contains more information
159159
const file = manifest[src]?.file
160-
if (file && endsWithJSRE.test(file)) continue
161-
162-
manifest[src] = asset
163-
fileNameToAsset.set(chunk.fileName, asset)
164-
}
165-
}
160+
if (!(file && endsWithJSRE.test(file))) {
161+
manifest[src] = asset
162+
fileNameToAsset.set(chunk.fileName, asset)
163+
}
166164

167-
// Add deduplicated assets to the manifest
168-
for (const [referenceId, { originalFileName }] of assets.entries()) {
169-
if (!manifest[originalFileName]) {
170-
const fileName = this.getFileName(referenceId)
171-
const asset = fileNameToAsset.get(fileName)
172-
if (asset) {
165+
for (const originalFileName of chunk.originalFileNames.slice(1)) {
173166
manifest[originalFileName] = asset
174167
}
175168
}

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

+7-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ import { fileToUrl } from './asset'
2323

2424
type WorkerBundleAsset = {
2525
fileName: string
26+
/** @deprecated */
2627
originalFileName: string | null
28+
originalFileNames: string[]
2729
source: string | Uint8Array
2830
}
2931

@@ -122,6 +124,7 @@ async function bundleWorkerEntry(
122124
saveEmitWorkerAsset(config, {
123125
fileName: outputChunk.fileName,
124126
originalFileName: null,
127+
originalFileNames: [],
125128
source: outputChunk.code,
126129
})
127130
}
@@ -159,6 +162,7 @@ function emitSourcemapForWorkerEntry(
159162
saveEmitWorkerAsset(config, {
160163
fileName: mapFileName,
161164
originalFileName: null,
165+
originalFileNames: [],
162166
source: data,
163167
})
164168
}
@@ -193,6 +197,7 @@ export async function workerFileToUrl(
193197
saveEmitWorkerAsset(config, {
194198
fileName,
195199
originalFileName: null,
200+
originalFileNames: [],
196201
source: outputChunk.code,
197202
})
198203
workerMap.bundle.set(id, fileName)
@@ -468,8 +473,9 @@ export function webWorkerPlugin(config: ResolvedConfig): Plugin {
468473
this.emitFile({
469474
type: 'asset',
470475
fileName: asset.fileName,
471-
originalFileName: asset.originalFileName,
472476
source: asset.source,
477+
// NOTE: fileName is already generated when bundling the worker
478+
// so no need to pass originalFileNames/names
473479
})
474480
})
475481
workerMap.assets.clear()

0 commit comments

Comments
 (0)