From 85c047bf4b6734ae9e9e8fa4617c99efc7e4a78e Mon Sep 17 00:00:00 2001 From: Romuald Brillout Date: Thu, 20 May 2021 17:47:51 +0200 Subject: [PATCH] fix: properly handle HMR for files with more than one glob import (fix #3496) --- .../vite/src/node/plugins/importAnalysis.ts | 11 ++++++++--- packages/vite/src/node/server/hmr.ts | 17 ++++++++++------- packages/vite/src/node/server/index.ts | 6 ++++-- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/packages/vite/src/node/plugins/importAnalysis.ts b/packages/vite/src/node/plugins/importAnalysis.ts index 469495a620d880..a1ad68c49104bd 100644 --- a/packages/vite/src/node/plugins/importAnalysis.ts +++ b/packages/vite/src/node/plugins/importAnalysis.ts @@ -300,11 +300,16 @@ export function importAnalysisPlugin(config: ResolvedConfig): Plugin { str().prepend(importsString) str().overwrite(expStart, endIndex, exp) imports.forEach((url) => importedUrls.add(url.replace(base, '/'))) - server._globImporters[importerModule.file!] = { - module: importerModule, + if (!(importerModule.file! in server._globImporters)) { + server._globImporters[importerModule.file!] = { + module: importerModule, + importGlobs: [] + } + } + server._globImporters[importerModule.file!].importGlobs.push({ base, pattern - } + }) } continue } diff --git a/packages/vite/src/node/server/hmr.ts b/packages/vite/src/node/server/hmr.ts index da9222cf4b139e..5854751232a044 100644 --- a/packages/vite/src/node/server/hmr.ts +++ b/packages/vite/src/node/server/hmr.ts @@ -177,13 +177,16 @@ export async function handleFileAddUnlink( delete server._globImporters[file] } else { for (const i in server._globImporters) { - const { module, base, pattern } = server._globImporters[i] - const relative = path.relative(base, file) - if (match(relative, pattern)) { - modules.push(module) - // We use `onFileChange` to invalidate `module.file` so that subsequent `ssrLoadModule()` - // calls get fresh glob import results with(out) the newly added(/removed) `file`. - server.moduleGraph.onFileChange(module.file!) + const { module, importGlobs } = server._globImporters[i] + for (const { base, pattern } of importGlobs) { + const relative = path.relative(base, file) + if (match(relative, pattern)) { + modules.push(module) + // We use `onFileChange` to invalidate `module.file` so that subsequent `ssrLoadModule()` + // calls get fresh glob import results with(out) the newly added(/removed) `file`. + server.moduleGraph.onFileChange(module.file!) + break + } } } } diff --git a/packages/vite/src/node/server/index.ts b/packages/vite/src/node/server/index.ts index 316d7af4618b7d..a48f05b8d7baaa 100644 --- a/packages/vite/src/node/server/index.ts +++ b/packages/vite/src/node/server/index.ts @@ -273,9 +273,11 @@ export interface ViteDevServer { _globImporters: Record< string, { - base: string - pattern: string module: ModuleNode + importGlobs: { + base: string + pattern: string + }[] } > /**