Skip to content

Commit f1ecdb4

Browse files
committed
refactor(hmr): move import.meta.glob related code to plugin
1 parent c8c2f7b commit f1ecdb4

File tree

3 files changed

+38
-47
lines changed

3 files changed

+38
-47
lines changed

packages/vite/src/node/plugins/importMetaGlob.ts

Lines changed: 35 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,12 @@ import fg from 'fast-glob'
2121
import { stringifyQuery } from 'ufo'
2222
import type { GeneralImportGlobOptions } from 'types/importGlob'
2323
import type { Plugin } from '../plugin'
24-
import type { ViteDevServer } from '../server'
2524
import type { EnvironmentModuleNode } from '../server/moduleGraph'
2625
import type { ResolvedConfig } from '../config'
2726
import { evalValue, normalizePath, transformStableResult } from '../utils'
2827
import type { Logger } from '../logger'
2928
import { slash } from '../../shared/utils'
29+
import type { Environment } from '../environment'
3030

3131
const { isMatch, scan } = micromatch
3232

@@ -44,43 +44,16 @@ interface ParsedGeneralImportGlobOptions extends GeneralImportGlobOptions {
4444
query?: string
4545
}
4646

47-
export function getAffectedGlobModules(
48-
file: string,
49-
server: ViteDevServer,
50-
): EnvironmentModuleNode[] {
51-
const modules: EnvironmentModuleNode[] = []
52-
// TODO: properly support other runtimes. Changing _importGlobMap breaks VitePress
53-
// https://github.com/vuejs/vitepress/blob/28989df83446923a9e7c8ada345b0778119ed66f/src/node/plugins/staticDataPlugin.ts#L128
54-
for (const [id, allGlobs] of server._importGlobMap!) {
55-
// (glob1 || glob2) && !glob3 && !glob4...
56-
if (
57-
allGlobs.some(
58-
({ affirmed, negated }) =>
59-
(!affirmed.length || affirmed.some((glob) => isMatch(file, glob))) &&
60-
(!negated.length || negated.every((glob) => isMatch(file, glob))),
61-
)
62-
) {
63-
const mod = server.environments.client.moduleGraph.getModuleById(id)
64-
65-
if (mod) {
66-
if (mod.file) {
67-
server.environments.client.moduleGraph.onFileChange(mod.file)
68-
}
69-
modules.push(mod)
70-
}
71-
}
72-
}
73-
return modules
74-
}
75-
7647
export function importGlobPlugin(config: ResolvedConfig): Plugin {
77-
let server: ViteDevServer | undefined
48+
const importGlobMaps = new Map<
49+
Environment,
50+
Map<string, { affirmed: string[]; negated: string[] }[]>
51+
>()
7852

7953
return {
8054
name: 'vite:import-glob',
81-
configureServer(_server) {
82-
server = _server
83-
server._importGlobMap.clear()
55+
configureServer() {
56+
importGlobMaps.clear()
8457
},
8558
async transform(code, id, options) {
8659
if (!code.includes('import.meta.glob')) return
@@ -94,9 +67,12 @@ export function importGlobPlugin(config: ResolvedConfig): Plugin {
9467
config.logger,
9568
)
9669
if (result) {
97-
if (server) {
70+
if (this.environment) {
9871
const allGlobs = result.matches.map((i) => i.globsResolved)
99-
server._importGlobMap.set(
72+
if (!importGlobMaps.has(this.environment)) {
73+
importGlobMaps.set(this.environment, new Map())
74+
}
75+
importGlobMaps.get(this.environment)!.set(
10076
id,
10177
allGlobs.map((globs) => {
10278
const affirmed: string[] = []
@@ -112,6 +88,29 @@ export function importGlobPlugin(config: ResolvedConfig): Plugin {
11288
return transformStableResult(result.s, id, config)
11389
}
11490
},
91+
hotUpdate({ type, file, modules: oldModules, environment }) {
92+
if (type === 'update') return
93+
94+
const importGlobMap = importGlobMaps.get(environment)
95+
if (!importGlobMap) return
96+
97+
const modules: EnvironmentModuleNode[] = []
98+
for (const [id, allGlobs] of importGlobMap) {
99+
// (glob1 || glob2) && !glob3 && !glob4...
100+
if (
101+
allGlobs.some(
102+
({ affirmed, negated }) =>
103+
(!affirmed.length ||
104+
affirmed.some((glob) => isMatch(file, glob))) &&
105+
(!negated.length || negated.every((glob) => isMatch(file, glob))),
106+
)
107+
) {
108+
const mod = environment.moduleGraph.getModuleById(id)
109+
if (mod) modules.push(mod)
110+
}
111+
}
112+
return modules.length > 0 ? [...oldModules, ...modules] : undefined
113+
},
115114
}
116115
}
117116

packages/vite/src/node/server/hmr.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import { createDebugger, normalizePath } from '../utils'
1111
import type { InferCustomEventPayload, ViteDevServer } from '..'
1212
import { getHookHandler } from '../plugins'
1313
import { isCSSRequest } from '../plugins/css'
14-
import { getAffectedGlobModules } from '../plugins/importMetaGlob'
1514
import { isExplicitImportRequired } from '../plugins/importAnalysis'
1615
import { getEnvFilesForMode } from '../env'
1716
import { withTrailingSlash, wrapId } from '../../shared/utils'
@@ -42,6 +41,7 @@ export interface HmrOptions {
4241
}
4342

4443
export interface HotUpdateContext {
44+
type: 'create' | 'update' | 'delete'
4545
file: string
4646
timestamp: number
4747
modules: Array<EnvironmentModuleNode>
@@ -238,15 +238,11 @@ export async function handleHMRUpdate(
238238

239239
async function applyHMR(environment: DevEnvironment) {
240240
const mods = environment.moduleGraph.getModulesByFile(file) || new Set()
241-
if (type === 'create' || type === 'delete') {
242-
for (const mod of getAffectedGlobModules(file, server)) {
243-
mods.add(mod)
244-
}
245-
}
246241

247242
// check if any plugin wants to perform custom HMR handling
248243
const timestamp = Date.now()
249244
const hotContext: HotUpdateContext = {
245+
type,
250246
file,
251247
timestamp,
252248
modules: [...mods],
@@ -276,6 +272,7 @@ export async function handleHMRUpdate(
276272
modules: hotContext.modules.map((mod) =>
277273
server.moduleGraph.getBackwardCompatibleModuleNode(mod),
278274
),
275+
type: undefined,
279276
} as HmrContext
280277
const filteredModules = await getHookHandler(plugin.handleHotUpdate!)(
281278
hmrContext,

packages/vite/src/node/server/index.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -379,10 +379,6 @@ export interface ViteDevServer {
379379
* @internal
380380
*/
381381
_setInternalServer(server: ViteDevServer): void
382-
/**
383-
* @internal
384-
*/
385-
_importGlobMap: Map<string, { affirmed: string[]; negated: string[] }[]>
386382
/**
387383
* @internal
388384
*/
@@ -739,7 +735,6 @@ export async function _createServer(
739735
server = _server
740736
},
741737
_restartPromise: null,
742-
_importGlobMap: new Map(),
743738
_forceOptimizeOnRestart: false,
744739
_pendingRequests: new Map(),
745740
_safeModulesPath: new Set(),

0 commit comments

Comments
 (0)