一,问题现象
加载2000条工单数据时,页面完全渲染耗时 8.2秒
滚动时FPS(帧率)最低降至 12帧
PC端Chrome内存占用 320MB 且持续增长
二,性能分析
1.Performance面板诊断
#关键性能指标
Total Blocking Time: 4200ms
Largest Contentful Paint: 5300ms
CPU Idle: 23%
2. 火焰图分析
- 高频触发 Forced Reflow(强制回流)
- 单次事件循环最长耗时 286ms
- renderItem 函数占用 68% 的脚本执行时间
3. Memory面板快照
- 未释放的DOM节点 2450个
- 分离的DOM树 18棵
- 事件监听器数量 4300+
三,优化方案
虚拟滚动技术
// 优化前:直接渲染全部数据
items.forEach(item => {
const div = document.createElement('div');
div.innerHTML = `<img src="${item.image}">...`;
container.appendChild(div);
});
// 优化后:仅渲染可视区域
const visibleCount = Math.ceil(container.clientHeight / itemHeight);
const virtualScroll = (scrollTop) => {
const startIdx = Math.floor(scrollTop / itemHeight);
const endIdx = startIdx + visibleCount + 2; // 缓冲2行
items.slice(startIdx, endIdx).forEach((item, index) => {
if (!renderMap[startIdx + index]) {
const node = createItem(item);
node.style.transform = `translateY(${(startIdx + index) * itemHeight}px)`;
container.appendChild(node);
renderMap[startIdx + index] = node;
}
});
// 清理不可见元素
Object.keys(renderMap).forEach(key => {
if (key < startIdx || key > endIdx) {
container.removeChild(renderMap[key]);
delete renderMap[key];
}
});
};
图片懒加载优化
<!-- 优化前 -->
<img src="high-res-image.jpg">
<!-- 优化后 -->
<img
data-src="high-res-image.jpg"
class="lazyload"
src="placeholder.jpg"
onload="requestIdleCallback(() => {this.src = this.dataset.src})">
3. 事件监听器治理
// 优化前:每个绑定点击事件
items.forEach(item => {
itemElement.addEventListener('click', () => {...});
});
// 优化后:事件委托
container.addEventListener('click', e => {
const itemElement = e.target.closest('.item');
if (itemElement) {
const itemId = itemElement.dataset.id;
// 处理点击逻辑
}
});
4. 内存泄漏修复
// 问题代码:未解绑的观察器
const observers = new Set();
items.forEach(item => {
const observer = new IntersectionObserver(callback);
observer.observe(item.element);
observers.add(observer);
});
// 修复方案:滚动容器销毁时
function cleanup() {
observers.forEach(observer => {
observer.disconnect();
});
observers.clear();
}