From 68c87fde49bcf3d91efa1b0a817d3fea2af9fa90 Mon Sep 17 00:00:00 2001 From: Tim MacDonald Date: Wed, 31 Aug 2022 16:52:21 +1000 Subject: [PATCH 1/6] fix: include duplicate assets in the bundle --- packages/vite/src/node/plugins/asset.ts | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/packages/vite/src/node/plugins/asset.ts b/packages/vite/src/node/plugins/asset.ts index 94c34a40f8d22e..fa5d53d2f40ea0 100644 --- a/packages/vite/src/node/plugins/asset.ts +++ b/packages/vite/src/node/plugins/asset.ts @@ -5,6 +5,7 @@ import { Buffer } from 'node:buffer' import * as mrmime from 'mrmime' import type { NormalizedOutputOptions, + OutputAsset, OutputOptions, PluginContext, PreRenderedAsset, @@ -25,6 +26,8 @@ const urlRE = /(\?|&)url(?:&|$)/ const assetCache = new WeakMap>() +const duplicateAssets: OutputAsset[] = [] + const assetHashToFilenameMap = new WeakMap< ResolvedConfig, Map @@ -182,6 +185,10 @@ export function assetPlugin(config: ResolvedConfig): Plugin { }, generateBundle(_, bundle) { + duplicateAssets.forEach((asset) => { + bundle[asset.name!] = asset + }) + // do not emit assets for SSR build if (config.command === 'build' && config.build.ssr) { for (const file in bundle) { @@ -470,8 +477,8 @@ async function fileToBuiltUrl( map.set(contentHash, fileName) } const emittedSet = emittedHashMap.get(config)! + const name = normalizePath(path.relative(config.root, file)) if (!emittedSet.has(contentHash)) { - const name = normalizePath(path.relative(config.root, file)) pluginContext.emitFile({ name, fileName, @@ -479,6 +486,14 @@ async function fileToBuiltUrl( source: content }) emittedSet.add(contentHash) + } else { + duplicateAssets.push({ + name, + fileName, + type: 'asset', + source: content, + isAsset: true + }) } url = `__VITE_ASSET__${contentHash}__${postfix ? `$_${postfix}__` : ``}` // TODO_BASE From 7757787a1f5763bcb756b155020f916f642d788c Mon Sep 17 00:00:00 2001 From: Tim MacDonald Date: Fri, 2 Sep 2022 11:59:55 +1000 Subject: [PATCH 2/6] fix: wrong filename in manifest --- packages/vite/src/node/plugins/asset.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vite/src/node/plugins/asset.ts b/packages/vite/src/node/plugins/asset.ts index fa5d53d2f40ea0..dd91984fe0dcd4 100644 --- a/packages/vite/src/node/plugins/asset.ts +++ b/packages/vite/src/node/plugins/asset.ts @@ -489,7 +489,7 @@ async function fileToBuiltUrl( } else { duplicateAssets.push({ name, - fileName, + fileName: map.get(contentHash)!, type: 'asset', source: content, isAsset: true From 9f0ba413105e5d8a1b441a3063828e1b525d030f Mon Sep 17 00:00:00 2001 From: Tim MacDonald Date: Fri, 2 Sep 2022 12:11:54 +1000 Subject: [PATCH 3/6] chore: relocate to manifest only side-effects --- packages/vite/src/node/plugins/asset.ts | 8 ++------ packages/vite/src/node/plugins/manifest.ts | 8 ++++++++ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/packages/vite/src/node/plugins/asset.ts b/packages/vite/src/node/plugins/asset.ts index dd91984fe0dcd4..70f791e4310c06 100644 --- a/packages/vite/src/node/plugins/asset.ts +++ b/packages/vite/src/node/plugins/asset.ts @@ -21,13 +21,13 @@ import { FS_PREFIX } from '../constants' export const assetUrlRE = /__VITE_ASSET__([a-z\d]{8})__(?:\$_(.*?)__)?/g +export const duplicateAssets: OutputAsset[] = [] + const rawRE = /(\?|&)raw(?:&|$)/ const urlRE = /(\?|&)url(?:&|$)/ const assetCache = new WeakMap>() -const duplicateAssets: OutputAsset[] = [] - const assetHashToFilenameMap = new WeakMap< ResolvedConfig, Map @@ -185,10 +185,6 @@ export function assetPlugin(config: ResolvedConfig): Plugin { }, generateBundle(_, bundle) { - duplicateAssets.forEach((asset) => { - bundle[asset.name!] = asset - }) - // do not emit assets for SSR build if (config.command === 'build' && config.build.ssr) { for (const file in bundle) { diff --git a/packages/vite/src/node/plugins/manifest.ts b/packages/vite/src/node/plugins/manifest.ts index e342102946904a..1f9cf7f7eb2e11 100644 --- a/packages/vite/src/node/plugins/manifest.ts +++ b/packages/vite/src/node/plugins/manifest.ts @@ -4,6 +4,7 @@ import type { ResolvedConfig } from '..' import type { Plugin } from '../plugin' import { normalizePath } from '../utils' import { cssEntryFilesCache } from './css' +import { duplicateAssets } from './asset' export type Manifest = Record @@ -16,6 +17,7 @@ export interface ManifestChunk { isDynamicEntry?: boolean imports?: string[] dynamicImports?: string[] + isDuplicate?: true } export function manifestPlugin(config: ResolvedConfig): Plugin { @@ -122,6 +124,12 @@ export function manifestPlugin(config: ResolvedConfig): Plugin { } } + duplicateAssets.forEach((asset) => { + const chunk = createAsset(asset) + chunk.isDuplicate = true + manifest[asset.name!] = chunk + }) + outputCount++ const output = config.build.rollupOptions?.output const outputLength = Array.isArray(output) ? output.length : 1 From 60d024d44049e412867158cf31ac9ac8cc05ae98 Mon Sep 17 00:00:00 2001 From: Tim MacDonald Date: Mon, 5 Sep 2022 10:42:35 +1000 Subject: [PATCH 4/6] chore: remove isDuplicate manifest key --- packages/vite/src/node/plugins/manifest.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/vite/src/node/plugins/manifest.ts b/packages/vite/src/node/plugins/manifest.ts index 1f9cf7f7eb2e11..e8df6719b30fcc 100644 --- a/packages/vite/src/node/plugins/manifest.ts +++ b/packages/vite/src/node/plugins/manifest.ts @@ -17,7 +17,6 @@ export interface ManifestChunk { isDynamicEntry?: boolean imports?: string[] dynamicImports?: string[] - isDuplicate?: true } export function manifestPlugin(config: ResolvedConfig): Plugin { @@ -126,7 +125,6 @@ export function manifestPlugin(config: ResolvedConfig): Plugin { duplicateAssets.forEach((asset) => { const chunk = createAsset(asset) - chunk.isDuplicate = true manifest[asset.name!] = chunk }) From 12e45482ebc61dff79a90c4b5e49445b935403b0 Mon Sep 17 00:00:00 2001 From: Tim MacDonald Date: Mon, 5 Sep 2022 10:47:37 +1000 Subject: [PATCH 5/6] chore: make duplicates weakmap --- packages/vite/src/node/plugins/asset.ts | 6 ++++-- packages/vite/src/node/plugins/manifest.ts | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/vite/src/node/plugins/asset.ts b/packages/vite/src/node/plugins/asset.ts index 70f791e4310c06..d4b69d100ed4a7 100644 --- a/packages/vite/src/node/plugins/asset.ts +++ b/packages/vite/src/node/plugins/asset.ts @@ -21,7 +21,7 @@ import { FS_PREFIX } from '../constants' export const assetUrlRE = /__VITE_ASSET__([a-z\d]{8})__(?:\$_(.*?)__)?/g -export const duplicateAssets: OutputAsset[] = [] +export const duplicateAssets = new WeakMap() const rawRE = /(\?|&)raw(?:&|$)/ const urlRE = /(\?|&)url(?:&|$)/ @@ -132,6 +132,7 @@ export function assetPlugin(config: ResolvedConfig): Plugin { buildStart() { assetCache.set(config, new Map()) emittedHashMap.set(config, new Set()) + duplicateAssets.set(config, []) }, resolveId(id) { @@ -473,6 +474,7 @@ async function fileToBuiltUrl( map.set(contentHash, fileName) } const emittedSet = emittedHashMap.get(config)! + const duplicates = duplicateAssets.get(config)! const name = normalizePath(path.relative(config.root, file)) if (!emittedSet.has(contentHash)) { pluginContext.emitFile({ @@ -483,7 +485,7 @@ async function fileToBuiltUrl( }) emittedSet.add(contentHash) } else { - duplicateAssets.push({ + duplicates.push({ name, fileName: map.get(contentHash)!, type: 'asset', diff --git a/packages/vite/src/node/plugins/manifest.ts b/packages/vite/src/node/plugins/manifest.ts index e8df6719b30fcc..a584daadc940e0 100644 --- a/packages/vite/src/node/plugins/manifest.ts +++ b/packages/vite/src/node/plugins/manifest.ts @@ -123,7 +123,7 @@ export function manifestPlugin(config: ResolvedConfig): Plugin { } } - duplicateAssets.forEach((asset) => { + duplicateAssets.get(config)!.forEach((asset) => { const chunk = createAsset(asset) manifest[asset.name!] = chunk }) From ffd0befb1028d16ccaca034d0869b418da99be33 Mon Sep 17 00:00:00 2001 From: Tim MacDonald Date: Tue, 6 Sep 2022 09:18:07 +1000 Subject: [PATCH 6/6] chore: refactor array to map --- packages/vite/src/node/plugins/asset.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/vite/src/node/plugins/asset.ts b/packages/vite/src/node/plugins/asset.ts index d4b69d100ed4a7..db2f9d7a7cb613 100644 --- a/packages/vite/src/node/plugins/asset.ts +++ b/packages/vite/src/node/plugins/asset.ts @@ -21,7 +21,10 @@ import { FS_PREFIX } from '../constants' export const assetUrlRE = /__VITE_ASSET__([a-z\d]{8})__(?:\$_(.*?)__)?/g -export const duplicateAssets = new WeakMap() +export const duplicateAssets = new WeakMap< + ResolvedConfig, + Map +>() const rawRE = /(\?|&)raw(?:&|$)/ const urlRE = /(\?|&)url(?:&|$)/ @@ -132,7 +135,7 @@ export function assetPlugin(config: ResolvedConfig): Plugin { buildStart() { assetCache.set(config, new Map()) emittedHashMap.set(config, new Set()) - duplicateAssets.set(config, []) + duplicateAssets.set(config, new Map()) }, resolveId(id) { @@ -485,7 +488,7 @@ async function fileToBuiltUrl( }) emittedSet.add(contentHash) } else { - duplicates.push({ + duplicates.set(name, { name, fileName: map.get(contentHash)!, type: 'asset',