diff --git a/packages/vite/src/node/server/__tests__/moduleGraph.spec.ts b/packages/vite/src/node/server/__tests__/moduleGraph.spec.ts index afaea5c151e949..2285d2fa4fa8b9 100644 --- a/packages/vite/src/node/server/__tests__/moduleGraph.spec.ts +++ b/packages/vite/src/node/server/__tests__/moduleGraph.spec.ts @@ -1,14 +1,10 @@ -import { beforeEach, describe, expect, it } from 'vitest' +import { describe, expect, it } from 'vitest' import { ModuleGraph } from '../moduleGraph' -let moduleGraph: ModuleGraph describe('moduleGraph', () => { describe('invalidateModule', () => { - beforeEach(() => { - moduleGraph = new ModuleGraph((id) => Promise.resolve({ id })) - }) - it('removes an ssrError', async () => { + const moduleGraph = new ModuleGraph(async (url) => ({ id: url })) const entryUrl = '/x.js' const entryModule = await moduleGraph.ensureEntryFromUrl(entryUrl, false) @@ -18,5 +14,21 @@ describe('moduleGraph', () => { moduleGraph.invalidateModule(entryModule) expect(entryModule.ssrError).toBe(null) }) + + it('ensureEntryFromUrl should based on resolvedId', async () => { + const moduleGraph = new ModuleGraph(async (url) => { + if (url === '/xx.js') { + return { id: '/x.js' } + } else { + return { id: url } + } + }) + const meta = { vite: 'test' } + + const mod1 = await moduleGraph.ensureEntryFromUrl('/x.js', false) + mod1.meta = meta + const mod2 = await moduleGraph.ensureEntryFromUrl('/xx.js', false) + expect(mod2.meta).to.equal(meta) + }) }) }) diff --git a/packages/vite/src/node/server/moduleGraph.ts b/packages/vite/src/node/server/moduleGraph.ts index 4bbd79cd5cc2f6..b9d928b589e00b 100644 --- a/packages/vite/src/node/server/moduleGraph.ts +++ b/packages/vite/src/node/server/moduleGraph.ts @@ -185,7 +185,7 @@ export class ModuleGraph { setIsSelfAccepting = true ): Promise { const [url, resolvedId, meta] = await this.resolveUrl(rawUrl, ssr) - let mod = this.urlToModuleMap.get(url) + let mod = this.idToModuleMap.get(resolvedId) if (!mod) { mod = new ModuleNode(url, setIsSelfAccepting) if (meta) mod.meta = meta @@ -200,6 +200,11 @@ export class ModuleGraph { } fileMappedModules.add(mod) } + // multiple urls can map to the same module and id, make sure we register + // the url to the existing module in that case + else if (!this.urlToModuleMap.has(url)) { + this.urlToModuleMap.set(url, mod) + } return mod }