diff --git a/packages/plugin-vue/src/handleHotUpdate.ts b/packages/plugin-vue/src/handleHotUpdate.ts
index a5781a3e..d78082b5 100644
--- a/packages/plugin-vue/src/handleHotUpdate.ts
+++ b/packages/plugin-vue/src/handleHotUpdate.ts
@@ -156,7 +156,7 @@ export async function handleHotUpdate(
if (didUpdateStyle) {
updateType.push(`style`)
}
- if (updateType.length) {
+ if (updateType.length || scriptChanged) {
if (file.endsWith('.vue')) {
// invalidate the descriptor cache so that the next transform will
// re-analyze the file and pick up the changes.
diff --git a/playground/vue/Hmr.vue b/playground/vue/Hmr.vue
index 541929d4..07dda06b 100644
--- a/playground/vue/Hmr.vue
+++ b/playground/vue/Hmr.vue
@@ -3,6 +3,10 @@
Click the button then edit this message. The count should be preserved.
{{ number }}
+
+ bar-title
+ {{ bar }}
+
diff --git a/playground/vue/__tests__/vue.spec.ts b/playground/vue/__tests__/vue.spec.ts
index 898d5123..c44d5cd2 100644
--- a/playground/vue/__tests__/vue.spec.ts
+++ b/playground/vue/__tests__/vue.spec.ts
@@ -221,6 +221,24 @@ describe('hmr', () => {
await untilUpdated(() => page.textContent('.hmr-number'), '200')
})
+ test('should reload when script changes after a rerender', async () => {
+ // rerender
+ editFile('Hmr.vue', (code) => code.replace('bar-title', 'bar-title1'))
+ await untilUpdated(() => page.textContent('.hmr-bar-text'), 'bar-title1')
+
+ // change 'bar' to 'updated', should reload
+ editFile('Hmr.vue', (code) =>
+ code.replace(`let bar = 'bar'`, `let bar = 'updated'`),
+ )
+ await untilUpdated(() => page.textContent('.hmr-bar'), 'updated')
+
+ // change 'updated' to 'bar', should reload again not rerender
+ editFile('Hmr.vue', (code) =>
+ code.replace(`let bar = 'updated'`, `let bar = 'bar'`),
+ )
+ await untilUpdated(() => page.textContent('.hmr-bar'), 'bar')
+ })
+
test('global hmr for some scenarios', async () => {
editFile('Hmr.vue', (code) =>
code.replace('', ' \n' + ''),