From a02eb2c7f45d3c8e0e74c0c475b7ef75c8ec18cc Mon Sep 17 00:00:00 2001 From: Alec Larson <1925840+aleclarson@users.noreply.github.com> Date: Sat, 23 Jan 2021 12:58:58 -0500 Subject: [PATCH 1/3] feat: add `resolveBuiltUrl` hook For rewriting the public URLs of static assets. --- packages/vite/src/node/plugin.ts | 10 ++++++++ packages/vite/src/node/plugins/asset.ts | 33 +++++++++++++++++++++---- 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/packages/vite/src/node/plugin.ts b/packages/vite/src/node/plugin.ts index 012c32e0fa6dfb..0bbd517e9728fb 100644 --- a/packages/vite/src/node/plugin.ts +++ b/packages/vite/src/node/plugin.ts @@ -114,6 +114,16 @@ export interface Plugin extends RollupPlugin { ctx: HmrContext ): Array | void | Promise | void> + /** + * Resolve an asset's public URL. This hook can call `this.emitFile` and + * return `__VITE_ASSET__${emitFileResult}__` to be replaced by Vite + * later in the build. + */ + resolveBuiltUrl?( + this: PluginContext, + url: string + ): Promise | string | null | undefined + /** * extend hooks with ssr flag */ diff --git a/packages/vite/src/node/plugins/asset.ts b/packages/vite/src/node/plugins/asset.ts index 950f7e86c59696..50dec6adc72b22 100644 --- a/packages/vite/src/node/plugins/asset.ts +++ b/packages/vite/src/node/plugins/asset.ts @@ -128,15 +128,16 @@ export function checkPublicFile( } } -export function fileToUrl( +export async function fileToUrl( id: string, config: ResolvedConfig, ctx: PluginContext -): string | Promise { +): Promise { if (config.command === 'serve') { return fileToDevUrl(id, config) } else { - return fileToBuiltUrl(id, config, ctx) + const builtUrl = await resolveBuiltUrl(id, config, ctx) + return builtUrl || fileToBuiltUrl(id, config, ctx) } } @@ -252,19 +253,41 @@ export async function urlToBuiltUrl( url: string, importer: string, config: ResolvedConfig, - pluginContext: PluginContext + ctx: PluginContext ): Promise { + const builtUrl = await resolveBuiltUrl(url, config, ctx) + if (builtUrl) { + return builtUrl + } + if (checkPublicFile(url, config)) { return config.base + url.slice(1) } + const file = url.startsWith('/') ? path.join(config.root, url) : path.join(path.dirname(importer), url) + return fileToBuiltUrl( file, config, - pluginContext, + ctx, // skip public check since we just did it above true ) } + +async function resolveBuiltUrl( + url: string, + config: ResolvedConfig, + ctx: PluginContext +) { + for (const { resolveBuiltUrl } of config.plugins) { + if (resolveBuiltUrl) { + const result = await resolveBuiltUrl.call(ctx, url) + if (result) { + return result + } + } + } +} From f325977d0863629914dba217fea348e1a230fdd1 Mon Sep 17 00:00:00 2001 From: Alec Larson <1925840+aleclarson@users.noreply.github.com> Date: Sat, 17 Apr 2021 12:32:18 -0400 Subject: [PATCH 2/3] fix: let `resolveBuiltUrl` return a __VITE_ASSET__ reference --- packages/vite/src/node/plugins/asset.ts | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/packages/vite/src/node/plugins/asset.ts b/packages/vite/src/node/plugins/asset.ts index 50dec6adc72b22..28cbb89151652d 100644 --- a/packages/vite/src/node/plugins/asset.ts +++ b/packages/vite/src/node/plugins/asset.ts @@ -284,9 +284,19 @@ async function resolveBuiltUrl( ) { for (const { resolveBuiltUrl } of config.plugins) { if (resolveBuiltUrl) { - const result = await resolveBuiltUrl.call(ctx, url) - if (result) { - return result + const builtUrl = await resolveBuiltUrl.call(ctx, url) + if (builtUrl) { + const match = builtUrl.match(/^__VITE_ASSET__(.+?)__/) + if (match) { + let map = assetHashToFilenameMap.get(config) + if (!map) { + map = new Map() + assetHashToFilenameMap.set(config, map) + } + const contentHash = match[1] + map.set(contentHash, ctx.getFileName(contentHash)) + } + return builtUrl } } } From 51042f1d182d12658886bd3f633d8255cdb33512 Mon Sep 17 00:00:00 2001 From: Shinigami Date: Tue, 20 Apr 2021 18:35:41 +0200 Subject: [PATCH 3/3] chore: add explicit module boundary type --- 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 28cbb89151652d..a6b9a6f1bf1f41 100644 --- a/packages/vite/src/node/plugins/asset.ts +++ b/packages/vite/src/node/plugins/asset.ts @@ -281,7 +281,7 @@ async function resolveBuiltUrl( url: string, config: ResolvedConfig, ctx: PluginContext -) { +): Promise { for (const { resolveBuiltUrl } of config.plugins) { if (resolveBuiltUrl) { const builtUrl = await resolveBuiltUrl.call(ctx, url)