10万级数据渲染优化方案

10万级数据渲染优化方案

JiangWen Lv4

假设我们需要在页面上加载获取到的10万条数据📊,在不采取优化方案的情况下它的耗时为 482 ms

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 <div id="container"></div>

<script>
const container = document.getElementById('container')
const getList = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve()
}, 200);
}).then(() => {
let arr = []
for (let i = 0; i < 100000; i++) {
arr[i] = { id: i, text: i }
}
return arr
})
}
// 不优化情况:
const renderList = () => {
getList().then(res => {
console.time('不优化')
res.forEach(item => {
const div = document.createElement('div')
div.innerHTML = `<span>${item.text}</span>`
container.appendChild(div)
});
console.timeEnd('不优化')
})
}
</script>

如果使用了分页优化后的耗时为212 ms

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 // 优化情况(分页 + requestAnimationFrame + createDocumentFragment)
const renderList2 = () => {
console.time('分页优化')
getList().then(res => {
const total = res.length // 总条数
const limit = 10000 // 每页数量
const page = 0 // 起始页
const totalPage = Math.ceil(total / limit)

const render = (page) => {
if(totalPage<= page)return
requestAnimationFrame(()=>{ // requestAnimationFrame减少重排
const fragment = document.createDocumentFragment() // 文档碎片
for (let i = page * limit; i < page * limit + limit; i++) {
const item = res[i];
const div = document.createElement('div')
div.innerHTML = `<span>${ item.text }</span>`
fragment.appendChild(div)
}
container.appendChild(fragment)
render(page + 1)
})
}
render(page)
console.timeEnd('分页优化')
})
}

如果dom结构更复杂,差距将更大

  • 标题: 10万级数据渲染优化方案
  • 作者: JiangWen
  • 创建于: 2021-11-18 11:25:00
  • 更新于: 2023-06-18 15:54:09
  • 链接: https://blog.jiangwen.site/2021/11/18/开发学习/10万级数据渲染优化方案/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
 评论
此页目录
10万级数据渲染优化方案