From 531f4f005245f6c56038b27a1e0f9c4b5b0e714a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E6=99=BA=E5=AD=90=20Kevin=20Deng?= Date: Thu, 22 Feb 2024 02:07:38 +0800 Subject: [PATCH] perf(runtime-vapor): improve traverse children --- packages/runtime-vapor/src/dom.ts | 8 -------- packages/runtime-vapor/src/template.ts | 16 ++++++++++++++++ 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/packages/runtime-vapor/src/dom.ts b/packages/runtime-vapor/src/dom.ts index b1c25a8b0..ac0fb527e 100644 --- a/packages/runtime-vapor/src/dom.ts +++ b/packages/runtime-vapor/src/dom.ts @@ -65,14 +65,6 @@ export function remove(block: Block, parent: ParentBlock) { } } -/*! #__NO_SIDE_EFFECTS__ */ -export function children(node: Node | Node[], ...paths: number[]): Node { - for (const idx of paths) { - node = isArray(node) ? node[idx] : node.childNodes[idx] - } - return node as Node -} - /*! #__NO_SIDE_EFFECTS__ */ export function createTextNode(val?: unknown): Text { // eslint-disable-next-line no-restricted-globals diff --git a/packages/runtime-vapor/src/template.ts b/packages/runtime-vapor/src/template.ts index 780e47c49..9ab2d5081 100644 --- a/packages/runtime-vapor/src/template.ts +++ b/packages/runtime-vapor/src/template.ts @@ -1,3 +1,5 @@ +import { isArray } from '@vue/shared' + /*! #__NO_SIDE_EFFECTS__ */ export function template(str: string): () => ChildNode[] { let cached = false @@ -24,3 +26,17 @@ export function template(str: string): () => ChildNode[] { function fragmentToNodes(node: DocumentFragment): ChildNode[] { return Array.from((node.cloneNode(true) as DocumentFragment).childNodes) } + +/*! #__NO_SIDE_EFFECTS__ */ +export function children(node: Node | Node[], ...paths: number[]): Node { + for (const idx of paths) { + if (isArray(node)) { + node = node[idx] + } else { + for (let i = 0; i <= idx; i++) { + node = (node as Node)[i === 0 ? 'firstChild' : 'nextSibling']! + } + } + } + return node as Node +}