diff --git a/packages/inula/src/renderer/TreeBuilder.ts b/packages/inula/src/renderer/TreeBuilder.ts index dff56e07..50326e25 100644 --- a/packages/inula/src/renderer/TreeBuilder.ts +++ b/packages/inula/src/renderer/TreeBuilder.ts @@ -55,6 +55,9 @@ import { getPathArr } from './utils/vNodePath'; import { injectUpdater } from '../external/devtools'; import { popCurrentRoot, pushCurrentRoot } from './RootStack'; +// 使用 push 扩展语法合并数组场景下被合并数组元素的上限(经验值) +const MAX_NUM_PUSH_MERGE_ARRAY = 1000; + // 不可恢复错误 let unrecoverableErrorDuringBuild: any = null; @@ -81,7 +84,12 @@ function collectDirtyNodes(vNode: VNode, parent: VNode): void { if (parent.dirtyNodes === null) { parent.dirtyNodes = dirtyNodes; } else { - parent.dirtyNodes.push(...vNode.dirtyNodes!); + // 超过上限继续使用 push 方法合并数组将导致性能劣化/调用栈溢出 + if (dirtyNodes.length > MAX_NUM_PUSH_MERGE_ARRAY) { + parent.dirtyNodes = parent.dirtyNodes.concat(dirtyNodes); + } else { + parent.dirtyNodes.push(...dirtyNodes); + } dirtyNodes.length = 0; } vNode.dirtyNodes = null;