@@ -8,7 +8,11 @@ import {
8
8
getDescriptor ,
9
9
setPrevDescriptor ,
10
10
} from './utils/descriptorCache'
11
- import { getResolvedScript , setResolvedScript } from './script'
11
+ import {
12
+ getResolvedScript ,
13
+ invalidateScript ,
14
+ setResolvedScript ,
15
+ } from './script'
12
16
import type { ResolvedOptions } from '.'
13
17
14
18
const debug = _debug ( 'vite:hmr' )
@@ -19,7 +23,7 @@ const directRequestRE = /(?:\?|&)direct\b/
19
23
* Vite-specific HMR handling
20
24
*/
21
25
export async function handleHotUpdate (
22
- { file, modules, read, server } : HmrContext ,
26
+ { file, modules, read } : HmrContext ,
23
27
options : ResolvedOptions ,
24
28
) : Promise < ModuleNode [ ] | void > {
25
29
const prevDescriptor = getDescriptor ( file , options , false )
@@ -35,31 +39,12 @@ export async function handleHotUpdate(
35
39
36
40
let needRerender = false
37
41
const affectedModules = new Set < ModuleNode | undefined > ( )
38
- const mainModule = modules
39
- . filter ( ( m ) => ! / t y p e = / . test ( m . url ) || / t y p e = s c r i p t / . test ( m . url ) )
40
- // #9341
41
- // We pick the module with the shortest URL in order to pick the module
42
- // with the lowest number of query parameters.
43
- . sort ( ( m1 , m2 ) => {
44
- return m1 . url . length - m2 . url . length
45
- } ) [ 0 ]
42
+ const mainModule = getMainModule ( modules )
46
43
const templateModule = modules . find ( ( m ) => / t y p e = t e m p l a t e / . test ( m . url ) )
47
44
48
45
const scriptChanged = hasScriptChanged ( prevDescriptor , descriptor )
49
46
if ( scriptChanged ) {
50
- let scriptModule : ModuleNode | undefined
51
- if (
52
- ( descriptor . scriptSetup ?. lang && ! descriptor . scriptSetup . src ) ||
53
- ( descriptor . script ?. lang && ! descriptor . script . src )
54
- ) {
55
- const scriptModuleRE = new RegExp (
56
- `type=script.*&lang\.${
57
- descriptor . scriptSetup ?. lang || descriptor . script ?. lang
58
- } $`,
59
- )
60
- scriptModule = modules . find ( ( m ) => scriptModuleRE . test ( m . url ) )
61
- }
62
- affectedModules . add ( scriptModule || mainModule )
47
+ affectedModules . add ( getScriptModule ( modules ) || mainModule )
63
48
}
64
49
65
50
if ( ! isEqualBlock ( descriptor . template , prevDescriptor . template ) ) {
@@ -218,3 +203,36 @@ function hasScriptChanged(prev: SFCDescriptor, next: SFCDescriptor): boolean {
218
203
219
204
return false
220
205
}
206
+
207
+ function getMainModule ( modules : ModuleNode [ ] ) {
208
+ return (
209
+ modules
210
+ . filter ( ( m ) => ! / t y p e = / . test ( m . url ) || / t y p e = s c r i p t / . test ( m . url ) )
211
+ // #9341
212
+ // We pick the module with the shortest URL in order to pick the module
213
+ // with the lowest number of query parameters.
214
+ . sort ( ( m1 , m2 ) => {
215
+ return m1 . url . length - m2 . url . length
216
+ } ) [ 0 ]
217
+ )
218
+ }
219
+
220
+ function getScriptModule ( modules : ModuleNode [ ] ) {
221
+ return modules . find ( ( m ) => / t y p e = s c r i p t .* & l a n g \. \w + $ / . test ( m . url ) )
222
+ }
223
+
224
+ export function handleTypeDepChange (
225
+ affectedComponents : Set < string > ,
226
+ { modules, server : { moduleGraph } } : HmrContext ,
227
+ ) : ModuleNode [ ] {
228
+ const affected = new Set < ModuleNode > ( )
229
+ for ( const file of affectedComponents ) {
230
+ invalidateScript ( file )
231
+ const mods = moduleGraph . getModulesByFile ( file )
232
+ if ( mods ) {
233
+ const arr = [ ...mods ]
234
+ affected . add ( getScriptModule ( arr ) || getMainModule ( arr ) )
235
+ }
236
+ }
237
+ return [ ...modules , ...affected ]
238
+ }
0 commit comments