diff --git a/packages/runtime-core/__tests__/hydration.spec.ts b/packages/runtime-core/__tests__/hydration.spec.ts index 4c7aa911bcc..3f9feb4ea77 100644 --- a/packages/runtime-core/__tests__/hydration.spec.ts +++ b/packages/runtime-core/__tests__/hydration.spec.ts @@ -9,7 +9,8 @@ import { Suspense, onMounted, defineAsyncComponent, - defineComponent + defineComponent, + createTextVNode } from '@vue/runtime-dom' import { renderToString, SSRContext } from '@vue/server-renderer' @@ -47,6 +48,14 @@ describe('SSR hydration', () => { expect(container.textContent).toBe('bar') }) + test('empty text', async () => { + const { container } = mountWithHydration('
', () => + h('div', createTextVNode('')) + ) + expect(container.textContent).toBe('') + expect(`Hydration children mismatch in
`).not.toHaveBeenWarned() + }) + test('comment', () => { const { vnode, container } = mountWithHydration('', () => null) expect(vnode.el).toBe(container.firstChild) diff --git a/packages/runtime-core/src/hydration.ts b/packages/runtime-core/src/hydration.ts index cad23524eb7..8f30cadb290 100644 --- a/packages/runtime-core/src/hydration.ts +++ b/packages/runtime-core/src/hydration.ts @@ -359,6 +359,8 @@ export function createHydrationFunctions( slotScopeIds, optimized ) + } else if (vnode.type === Text && !vnode.children) { + continue } else { hasMismatch = true if (__DEV__ && !hasWarned) {