diff --git a/packages/vite/src/node/plugins/importAnalysis.ts b/packages/vite/src/node/plugins/importAnalysis.ts index 119f0192cabb43..0d5a8bf42e771e 100644 --- a/packages/vite/src/node/plugins/importAnalysis.ts +++ b/packages/vite/src/node/plugins/importAnalysis.ts @@ -741,8 +741,9 @@ export function importAnalysisPlugin(config: ResolvedConfig): Plugin { // normalize and rewrite accepted urls const normalizedAcceptedUrls = new Set() for (const { url, start, end } of acceptedUrls) { + const isRelative = url[0] === '.' const [normalized] = await moduleGraph.resolveUrl( - toAbsoluteUrl(url), + isRelative ? toAbsoluteUrl(url) : url, ssr, ) normalizedAcceptedUrls.add(normalized) diff --git a/packages/vite/src/node/plugins/importMetaGlob.ts b/packages/vite/src/node/plugins/importMetaGlob.ts index 10fe5f9120bbd5..2d317023352d7e 100644 --- a/packages/vite/src/node/plugins/importMetaGlob.ts +++ b/packages/vite/src/node/plugins/importMetaGlob.ts @@ -354,7 +354,7 @@ export async function transformGlobImport( ): Promise { id = slash(id) root = slash(root) - const isVirtual = isVirtualModule(id) + const isVirtual = !isAbsolute(id) const dir = isVirtual ? undefined : dirname(id) const matches = await parseImportGlob( code, @@ -629,8 +629,3 @@ export function getCommonBase(globsResolved: string[]): null | string { return commonAncestor } - -export function isVirtualModule(id: string): boolean { - // https://vitejs.dev/guide/api-plugin.html#virtual-modules-convention - return id.startsWith('virtual:') || id[0] === '\0' || !id.includes('/') -} diff --git a/playground/hmr/__tests__/hmr.spec.ts b/playground/hmr/__tests__/hmr.spec.ts index a7fbbad80ae90e..fd05682f5808a2 100644 --- a/playground/hmr/__tests__/hmr.spec.ts +++ b/playground/hmr/__tests__/hmr.spec.ts @@ -9,6 +9,7 @@ import { removeFile, untilBrowserLogAfter, untilUpdated, + viteServer, viteTestUrl, } from '~utils' @@ -672,6 +673,14 @@ if (!isBuild) { expect(await btn.textContent()).toBe('Compteur 0') }) + test('virtual module in module graph', async () => { + const moduleGraph = viteServer.moduleGraph + const virtualId = Array.from(moduleGraph.idToModuleMap.keys()).filter( + (id: string) => id.includes('virtual'), + ) + expect(virtualId).toEqual(['\x00virtual:file', '/@id/__x00__virtual:file']) + }) + test('handle virtual module updates', async () => { await page.goto(viteTestUrl) const el = await page.$('.virtual') diff --git a/playground/hmr/hmr.ts b/playground/hmr/hmr.ts index 9748fdd1e8bc11..7a31477d52f556 100644 --- a/playground/hmr/hmr.ts +++ b/playground/hmr/hmr.ts @@ -42,6 +42,13 @@ if (import.meta.hot) { handleDep('multi deps', foo, nestedFoo) }) + import.meta.hot.accept( + ['virtual:file', '/@id/__x00__virtual:file'], + ([rawVirtualPath, acceptedVirtualPath]) => { + text('.virtual', acceptedVirtualPath.virtual) + }, + ) + import.meta.hot.dispose(() => { console.log(`foo was:`, foo) })