jstree 預設一次性渲染所有節點,當節點超過 2000+ 時,DOM 節點暴增導致:
$('#tree').jstree({
core: {
data: function (node, cb) {
if (node.id === '#') {
// 根節點:只請求第一層
loadLevel(0).then(cb);
} else {
// 子節點:根據父 ID 請求下一層
loadChildren(node.id).then(cb);
}
}
}
});
後端接口需支持 parentId 分頁查詢,返回 {id, text, children: true/false, state: {opened: false}} 結構。
引入 jstree-virtual-scrolling 插件或自行實現:
scroll 事件。Set selectedIds 而非遍歷 DOM。allSelected = true + excludedIds,提交時由後端計算差集。jstree.checkbox 插件的 tie_selection: false 解耦選中狀態與 UI 高亮。animation: 0。core.worker: true(Web Worker 解析 JSON,需瀏覽器支持)。contain: strict 限制重排範圍。| 指標 | 優化前 | 優化後 |
|---|---|---|
| 5000 節點初始化 | 3.2 s | 0.4 s (懶加載首屏) |
| 全選操作響應 | 卡死 1.5 s | < 50 ms |
| 內存佔用 | 180 MB | 45 MB |
先上懶加載解決首屏加載,再視業務複雜度引入虛擬滾動。若節點極大(5萬+),建議後端提供搜索接口,前端改為「搜索即樹」模式,徹底避免全量樹渲染。