@@ -38,10 +38,7 @@ export async function handleHotUpdate(
38
38
)
39
39
const templateModule = modules . find ( ( m ) => / t y p e = t e m p l a t e / . test ( m . url ) )
40
40
41
- if (
42
- ! isEqualBlock ( descriptor . script , prevDescriptor . script ) ||
43
- ! isEqualBlock ( descriptor . scriptSetup , prevDescriptor . scriptSetup )
44
- ) {
41
+ if ( hasScriptChanged ( prevDescriptor , descriptor ) ) {
45
42
let scriptModule : ModuleNode | undefined
46
43
if ( descriptor . script ?. lang && ! descriptor . script . src ) {
47
44
const scriptModuleRE = new RegExp (
@@ -174,11 +171,32 @@ export function isOnlyTemplateChanged(
174
171
next : SFCDescriptor
175
172
) : boolean {
176
173
return (
177
- isEqualBlock ( prev . script , next . script ) &&
178
- isEqualBlock ( prev . scriptSetup , next . scriptSetup ) &&
174
+ ! hasScriptChanged ( prev , next ) &&
179
175
prev . styles . length === next . styles . length &&
180
176
prev . styles . every ( ( s , i ) => isEqualBlock ( s , next . styles [ i ] ) ) &&
181
177
prev . customBlocks . length === next . customBlocks . length &&
182
178
prev . customBlocks . every ( ( s , i ) => isEqualBlock ( s , next . customBlocks [ i ] ) )
183
179
)
184
180
}
181
+
182
+ function hasScriptChanged ( prev : SFCDescriptor , next : SFCDescriptor ) : boolean {
183
+ if ( ! isEqualBlock ( prev . script , next . script ) ) {
184
+ return true
185
+ }
186
+ if ( ! isEqualBlock ( prev . scriptSetup , next . scriptSetup ) ) {
187
+ return true
188
+ }
189
+
190
+ // vue core #3176
191
+ // <script setup lang="ts"> prunes non-unused imports
192
+ // the imports pruning depends on template, so script may need to re-compile
193
+ // based on template changes
194
+ const prevResolvedScript = getResolvedScript ( prev , false )
195
+ // this is only available in vue@^3.2.23
196
+ const prevImports = prevResolvedScript ?. imports
197
+ if ( prevImports ) {
198
+ return next . shouldForceReload ( prevImports )
199
+ }
200
+
201
+ return false
202
+ }
0 commit comments