From 3108d91dfaed6e805b2b5455167b27176cfe41af Mon Sep 17 00:00:00 2001 From: daiwei Date: Wed, 23 Apr 2025 10:53:57 +0800 Subject: [PATCH] refactor: skip dynamic anchors and empty text nodes --- .../src/transforms/transformChildren.ts | 21 +++++++-- .../runtime-vapor/__tests__/hydration.spec.ts | 10 +++-- packages/runtime-vapor/src/dom/hydration.ts | 43 ++----------------- packages/runtime-vapor/src/dom/node.ts | 20 ++++++++- 4 files changed, 46 insertions(+), 48 deletions(-) diff --git a/packages/compiler-vapor/src/transforms/transformChildren.ts b/packages/compiler-vapor/src/transforms/transformChildren.ts index 790cd9d6f..da47438c2 100644 --- a/packages/compiler-vapor/src/transforms/transformChildren.ts +++ b/packages/compiler-vapor/src/transforms/transformChildren.ts @@ -70,10 +70,23 @@ function processDynamicChildren(context: TransformContext) { if (!(child.flags & DynamicFlag.NON_TEMPLATE)) { if (prevDynamics.length) { if (hasStaticTemplate) { - context.childrenTemplate[index - prevDynamics.length] = `` - prevDynamics[0].flags -= DynamicFlag.NON_TEMPLATE - const anchor = (prevDynamics[0].anchor = context.increaseId()) - registerInsertion(prevDynamics, context, anchor) + // each dynamic child gets its own placeholder node. + // this makes it easier to locate the corresponding node during hydration. + for (let i = 0; i < prevDynamics.length; i++) { + const idx = index - prevDynamics.length + i + context.childrenTemplate[idx] = `` + const dynamicChild = prevDynamics[i] + dynamicChild.flags -= DynamicFlag.NON_TEMPLATE + const anchor = (dynamicChild.anchor = context.increaseId()) + if ( + dynamicChild.operation && + isBlockOperation(dynamicChild.operation) + ) { + // block types + dynamicChild.operation.parent = context.reference() + dynamicChild.operation.anchor = anchor + } + } } else { registerInsertion(prevDynamics, context, -1 /* prepend */) } diff --git a/packages/runtime-vapor/__tests__/hydration.spec.ts b/packages/runtime-vapor/__tests__/hydration.spec.ts index 27ef427a1..246d8c9b9 100644 --- a/packages/runtime-vapor/__tests__/hydration.spec.ts +++ b/packages/runtime-vapor/__tests__/hydration.spec.ts @@ -317,7 +317,7 @@ describe('Vapor Mode hydration', () => { ) }) - test.todo('mixed component and text with anchor insertion', async () => { + test('mixed component and text with anchor insertion', async () => { const { container, data } = await testHydration( `