private mergeIntoChunk()

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)
    }
  }