mirror of https://github.com/vuejs/core.git
fix(hmr): avoid hydration for hmr root reload (#12450)
close vitejs/vite-plugin-vue#146 close vitejs/vite-plugin-vue#477
This commit is contained in:
parent
626450590d
commit
1f98a9c493
|
@ -1880,6 +1880,26 @@ describe('SSR hydration', () => {
|
|||
expect(root.innerHTML).toBe('<div><div>bar</div></div>')
|
||||
})
|
||||
|
||||
test('hmr root reload', async () => {
|
||||
const appId = 'test-app-id'
|
||||
const App = {
|
||||
__hmrId: appId,
|
||||
template: `<div>foo</div>`,
|
||||
}
|
||||
|
||||
const root = document.createElement('div')
|
||||
root.innerHTML = await renderToString(h(App))
|
||||
createSSRApp(App).mount(root)
|
||||
expect(root.innerHTML).toBe('<div>foo</div>')
|
||||
|
||||
reload(appId, {
|
||||
__hmrId: appId,
|
||||
template: `<div>bar</div>`,
|
||||
})
|
||||
await nextTick()
|
||||
expect(root.innerHTML).toBe('<div>bar</div>')
|
||||
})
|
||||
|
||||
describe('mismatch handling', () => {
|
||||
test('text node', () => {
|
||||
const { container } = mountWithHydration(`foo`, () => 'bar')
|
||||
|
|
|
@ -383,13 +383,12 @@ export function createAppAPI<HostElement>(
|
|||
// HMR root reload
|
||||
if (__DEV__) {
|
||||
context.reload = () => {
|
||||
const cloned = cloneVNode(vnode)
|
||||
// avoid hydration for hmr updating
|
||||
cloned.el = null
|
||||
// casting to ElementNamespace because TS doesn't guarantee type narrowing
|
||||
// over function boundaries
|
||||
render(
|
||||
cloneVNode(vnode),
|
||||
rootContainer,
|
||||
namespace as ElementNamespace,
|
||||
)
|
||||
render(cloned, rootContainer, namespace as ElementNamespace)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue