Просмотр исходного кода

fix(hmr): preserve appContext on root HMR reload (#14528)

edison 1 месяц назад
Родитель
Сommit
714151ebe0
2 измененных файлов с 37 добавлено и 0 удалено
  1. 35 0
      packages/runtime-vapor/__tests__/hmr.spec.ts
  2. 2 0
      packages/runtime-vapor/src/hmr.ts

+ 35 - 0
packages/runtime-vapor/__tests__/hmr.spec.ts

@@ -3,6 +3,7 @@ import {
   computed,
   createApp,
   h,
+  inject,
   nextTick,
   onActivated,
   onDeactivated,
@@ -17,6 +18,7 @@ import {
   createComponent,
   createSlot,
   createTemplateRefSetter,
+  createVaporApp,
   defineVaporAsyncComponent,
   defineVaporComponent,
   delegateEvents,
@@ -178,6 +180,39 @@ describe('hot module replacement', () => {
     expect(mountSpy).toHaveBeenCalledTimes(1)
   })
 
+  test('reload root vapor component should preserve appContext provide/inject', async () => {
+    const root = document.createElement('div')
+    const appId = 'test-root-reload-app-context'
+
+    const Child = defineVaporComponent({
+      setup() {
+        const msg = inject('msg')
+        return { msg }
+      },
+      render: compileToFunction(`<div>{{ msg }}</div>`),
+    })
+
+    const App = defineVaporComponent({
+      __hmrId: appId,
+      render: () => createComponent(Child),
+    })
+    createRecord(appId, App as any)
+
+    const app = createVaporApp(App)
+    app.provide('msg', 'app-injected')
+    app.mount(root)
+    expect(root.innerHTML).toBe(`<div>app-injected</div>`)
+
+    reload(appId, {
+      __vapor: true,
+      __hmrId: appId,
+      render: () => createComponent(Child),
+    })
+
+    await nextTick()
+    expect(root.innerHTML).toBe(`<div>app-injected</div>`)
+  })
+
   test('reload KeepAlive slot', async () => {
     const root = document.createElement('div')
     document.body.appendChild(root)

+ 2 - 0
packages/runtime-vapor/src/hmr.ts

@@ -51,6 +51,8 @@ export function hmrReload(
     instance.rawProps,
     instance.rawSlots,
     instance.isSingleRoot,
+    undefined,
+    instance.appContext,
   )
   setCurrentInstance(...prev)
   mountComponent(newInstance, parent, anchor)