in packages/core/src/rendering/render-chunk.tsx [112:150]
private mergeIntoChunk(child: ChildType, chunkCapacity: number) {
assert(child.parentData, 'child 不能没有 parentData')
assert(!child.parentData.chunk, 'child 不能已分配 chunk')
const prevChunk = child.parentData.prevSibling?.parentData?.chunk
const nextChunk = child.parentData.nextSibling?.parentData?.chunk
// child 介于两个 chunk 之间
if (prevChunk !== nextChunk) {
if (prevChunk && prevChunk.childCount < chunkCapacity) {
// prevChunk 如果容量够就放进去
assert(prevChunk.lastChild === child.parentData.prevSibling)
prevChunk.insertAfter(child, prevChunk.lastChild)
} else if (nextChunk && nextChunk.childCount < chunkCapacity) {
// nextChunk 如果容量够就放进去
assert(nextChunk.firstChild === child.parentData.nextSibling)
nextChunk.insertBefore(child, nextChunk.firstChild)
} else {
const chunk = this.createChunkAfter(prevChunk)
chunk.appendChild(child)
}
} else if (prevChunk) {
// 此时 prevChunk 就是要插入的 Chunk
prevChunk.insertAfter(child, child.parentData.prevSibling)
// 空间不足时,将最后一个节点移出,尝试重新合并
if (prevChunk.childCount >= chunkCapacity) {
const lastChild = prevChunk.lastChild
assert(lastChild)
prevChunk.removeChild(lastChild)
this.mergeIntoChunk(lastChild, chunkCapacity)
}
} else {
// 创建新的 chunk
const chunk = this.createChunkAfter(prevChunk)
chunk.appendChild(child)
}
}