@@ -62,16 +62,15 @@ function prepareSlideInfo(data: SlideInfo): SlideInfoExtended {
62
62
}
63
63
}
64
64
65
- export function createSlidesLoader ( { data, entry, clientRoot, themeRoots, userRoot } : ResolvedSlidevOptions , pluginOptions : SlidevPluginOptions ) : Plugin [ ] {
65
+ export function createSlidesLoader ( { data, entry, clientRoot, themeRoots, userRoot } : ResolvedSlidevOptions , pluginOptions : SlidevPluginOptions , VuePlugin : Plugin ) : Plugin [ ] {
66
66
const slidePrefix = '/@slidev/slides/'
67
- const hmrNextModuleIds : string [ ] = [ ]
67
+ const hmrPages = new Set < number > ( )
68
68
69
69
const entryId = slash ( entry )
70
70
71
71
return [
72
72
{
73
73
name : 'slidev:loader' ,
74
-
75
74
configureServer ( server ) {
76
75
server . watcher . add ( entry )
77
76
@@ -90,7 +89,7 @@ export function createSlidesLoader({ data, entry, clientRoot, themeRoots, userRo
90
89
const body = await getBodyJson ( req )
91
90
Object . assign ( data . slides [ idx ] , body )
92
91
93
- hmrNextModuleIds . push ( ` ${ slidePrefix } ${ idx + 1 } .md` )
92
+ hmrPages . add ( idx )
94
93
95
94
server . ws . send ( {
96
95
type : 'custom' ,
@@ -117,11 +116,7 @@ export function createSlidesLoader({ data, entry, clientRoot, themeRoots, userRo
117
116
118
117
const newData = await parser . load ( entry )
119
118
120
- const moduleIds : ( string | false ) [ ] = [
121
- ...hmrNextModuleIds ,
122
- ]
123
-
124
- hmrNextModuleIds . length = 0
119
+ const moduleIds : string [ ] = [ ]
125
120
126
121
if ( data . slides . length !== newData . slides . length )
127
122
moduleIds . push ( '/@slidev/routes' )
@@ -138,28 +133,47 @@ export function createSlidesLoader({ data, entry, clientRoot, themeRoots, userRo
138
133
const length = Math . max ( data . slides . length , newData . slides . length )
139
134
140
135
for ( let i = 0 ; i < length ; i ++ ) {
136
+ if ( hmrPages . has ( i ) )
137
+ continue
138
+
141
139
const a = data . slides [ i ]
142
140
const b = newData . slides [ i ]
143
-
144
141
if ( a ?. content . trim ( ) === b ?. content . trim ( ) && JSON . stringify ( a . frontmatter ) === JSON . stringify ( b . frontmatter ) )
145
142
continue
143
+ hmrPages . add ( i )
144
+ }
146
145
147
- moduleIds . push (
148
- `${ slidePrefix } ${ i + 1 } .md` ,
149
- `${ slidePrefix } ${ i + 1 } .json` ,
146
+ const modules = (
147
+ await Promise . all (
148
+ Array . from ( hmrPages )
149
+ . map ( async ( i ) => {
150
+ const id = `${ slidePrefix } ${ i + 1 } .md`
151
+ const module = ctx . server . moduleGraph . getModuleById ( id )
152
+
153
+ return await VuePlugin . handleHotUpdate ! ( {
154
+ ...ctx ,
155
+ modules : Array . from ( module ?. importedModules || [ ] ) ,
156
+ file : id ,
157
+ read ( ) {
158
+ return newData . slides [ i - 1 ] ?. raw
159
+ } ,
160
+ } ,
161
+ )
162
+ } ) ,
150
163
)
151
- }
164
+ ) . flatMap ( i => i || [ ] )
165
+
166
+ hmrPages . clear ( )
152
167
153
168
const moduleEntries = moduleIds
154
169
. filter ( isTruthy )
155
- . map ( id => ctx . server . moduleGraph . getModuleById ( id as string ) )
170
+ . map ( id => ctx . server . moduleGraph . getModuleById ( id ) )
156
171
. filter ( notNullish )
172
+ . concat ( modules )
157
173
158
174
pluginOptions . onDataReload ?.( newData , data )
159
-
160
175
Object . assign ( data , newData )
161
176
162
- moduleEntries . map ( m => ctx . server . moduleGraph . invalidateModule ( m ) )
163
177
return moduleEntries
164
178
} ,
165
179
@@ -227,6 +241,13 @@ export function createSlidesLoader({ data, entry, clientRoot, themeRoots, userRo
227
241
}
228
242
} ,
229
243
} ,
244
+ {
245
+ name : 'xxx' ,
246
+ handleHotUpdate ( i ) {
247
+ if ( i . file . endsWith ( '.vue' ) )
248
+ console . dir ( i . modules )
249
+ } ,
250
+ } ,
230
251
]
231
252
232
253
async function getLayouts ( ) {
0 commit comments