核心是批量处理dom变更以减少重排重绘:用documentfragment批量插入、合并样式修改(csstext或class切换)、利用queuemicrotask收拢变更、操作前移出文档流。

核心是把零散的 DOM 变更攒起来,等一次到位再交给浏览器处理,避免中间状态反复触发重排重绘。
用 DocumentFragment 批量插入节点
循环中逐个 appendChild 会多次触发重排;DocumentFragment 是内存中的临时容器,不挂载到真实 DOM,往里面加元素完全不触发渲染。
- 调用
document.createDocumentFragment()创建片段 - 所有新节点都
appendChild到这个片段里 - 最后只执行一次真实父元素的
appendChild(fragment)
比如向列表添加 100 个 <li>,用 Fragment 能把 100 次重排压缩成 1 次,首屏时间可能从 800ms 降到 150ms 左右。
合并样式修改,避免逐条赋值
连续写 el.style.width = '100px'、el.style.height = '200px',每次都会强制浏览器重新计算样式和布局。
- 改用
el.style.cssText = 'width:100px;height:200px;margin:10px;',一次设完全部 - 更推荐预定义 CSS 类(如
.card-large),再用el.classList.add('card-large')
类名切换由浏览器底层高效处理,也方便复用和维护。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
利用微任务收拢变更
微任务在当前 JS 任务结束、浏览器渲染前集中执行,天然适合合并 DOM 操作。
- 用
queueMicrotask(() => { /* 所有 DOM 修改放这里 */ })或Promise.resolve().then(...) - 同一轮事件循环中多次调用
queueMicrotask,最终只批量执行一次 - 内部可做状态合并:比如只保留最后一次输入值、跳过中间过渡态、去重插入节点
注意:别在微任务里读 offsetWidth 或 getComputedStyle,否则会强制同步回流,破坏优化效果。
操作前移出文档流
对已有元素做高频或复杂修改时,先把它从 DOM 中暂时移除或隐藏,改完再放回去。
- 用
element.remove()或element.style.display = 'none' - 完成所有修改后,再重新插入或恢复显示
这样能确保修改过程不参与当前渲染流程,避免中途触发不必要的重排。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










