diff --git a/packages/vite/src/node/plugins/importAnalysis.ts b/packages/vite/src/node/plugins/importAnalysis.ts index 3559a8d5fdbc34..ae4a7b556d00c2 100644 --- a/packages/vite/src/node/plugins/importAnalysis.ts +++ b/packages/vite/src/node/plugins/importAnalysis.ts @@ -21,7 +21,8 @@ import { debugHmr, handlePrunedModules, lexAcceptedHmrDeps, - lexAcceptedHmrExports + lexAcceptedHmrExports, + normalizeHmrUrl } from '../server/hmr' import { cleanUrl, @@ -629,7 +630,7 @@ export function importAnalysisPlugin(config: ResolvedConfig): Plugin { str().prepend( `import { createHotContext as __vite__createHotContext } from "${clientPublicPath}";` + `import.meta.hot = __vite__createHotContext(${JSON.stringify( - importerModule.url + normalizeHmrUrl(importerModule.url) )});` ) } diff --git a/packages/vite/src/node/server/hmr.ts b/packages/vite/src/node/server/hmr.ts index 3493d370ab0b65..e5d93fad8629de 100644 --- a/packages/vite/src/node/server/hmr.ts +++ b/packages/vite/src/node/server/hmr.ts @@ -5,7 +5,7 @@ import colors from 'picocolors' import type { Update } from 'types/hmrPayload' import type { RollupError } from 'rollup' import { CLIENT_DIR } from '../constants' -import { createDebugger, normalizePath, unique } from '../utils' +import { createDebugger, normalizePath, unique, wrapId } from '../utils' import type { ViteDevServer } from '..' import { isCSSRequest } from '../plugins/css' import { getAffectedGlobModules } from '../plugins/importMetaGlob' @@ -154,12 +154,12 @@ export function updateModules( ...[...boundaries].map(({ boundary, acceptedVia }) => ({ type: `${boundary.type}-update` as const, timestamp, - path: boundary.url, + path: normalizeHmrUrl(boundary.url), explicitImportRequired: boundary.type === 'js' ? isExplicitImportRequired(acceptedVia.url) : undefined, - acceptedPath: acceptedVia.url + acceptedPath: normalizeHmrUrl(acceptedVia.url) })) ) } @@ -484,6 +484,13 @@ export function lexAcceptedHmrExports( return urls.size > 0 } +export function normalizeHmrUrl(url: string): string { + if (!url.startsWith('.') && !url.startsWith('/')) { + url = wrapId(url) + } + return url +} + function error(pos: number) { const err = new Error( `import.meta.hot.accept() can only accept string literals or an ` +