From 42ecf3759e20529f32433142eab02f84943d0bac Mon Sep 17 00:00:00 2001 From: Tim MacDonald Date: Thu, 22 Sep 2022 19:05:29 +1000 Subject: [PATCH] feat: include duplicate assets in the manifest (#9928) --- packages/vite/src/node/plugins/asset.ts | 18 +++++++++++++++++- packages/vite/src/node/plugins/manifest.ts | 6 ++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/packages/vite/src/node/plugins/asset.ts b/packages/vite/src/node/plugins/asset.ts index 94c34a40f8d22e..db2f9d7a7cb613 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, @@ -20,6 +21,11 @@ import { FS_PREFIX } from '../constants' export const assetUrlRE = /__VITE_ASSET__([a-z\d]{8})__(?:\$_(.*?)__)?/g +export const duplicateAssets = new WeakMap< + ResolvedConfig, + Map +>() + const rawRE = /(\?|&)raw(?:&|$)/ const urlRE = /(\?|&)url(?:&|$)/ @@ -129,6 +135,7 @@ export function assetPlugin(config: ResolvedConfig): Plugin { buildStart() { assetCache.set(config, new Map()) emittedHashMap.set(config, new Set()) + duplicateAssets.set(config, new Map()) }, resolveId(id) { @@ -470,8 +477,9 @@ 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)) { - const name = normalizePath(path.relative(config.root, file)) pluginContext.emitFile({ name, fileName, @@ -479,6 +487,14 @@ async function fileToBuiltUrl( source: content }) emittedSet.add(contentHash) + } else { + duplicates.set(name, { + name, + fileName: map.get(contentHash)!, + type: 'asset', + source: content, + isAsset: true + }) } url = `__VITE_ASSET__${contentHash}__${postfix ? `$_${postfix}__` : ``}` // TODO_BASE diff --git a/packages/vite/src/node/plugins/manifest.ts b/packages/vite/src/node/plugins/manifest.ts index e342102946904a..a584daadc940e0 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 @@ -122,6 +123,11 @@ export function manifestPlugin(config: ResolvedConfig): Plugin { } } + duplicateAssets.get(config)!.forEach((asset) => { + const chunk = createAsset(asset) + manifest[asset.name!] = chunk + }) + outputCount++ const output = config.build.rollupOptions?.output const outputLength = Array.isArray(output) ? output.length : 1