第 118 题:vue 渲染大量数据时应该怎么优化?
yygmind opened this issue · 15 comments
数据量大的时候,可以做分页处理。翻页一次请求10-20条数据
虚拟列表?
Object.freeze 冻结对象,不让vue劫持
dwqs/blog#70 虚拟列表
优化我觉得分要分两点:
1、加载显示优化,能快速加载显示;
2、内存占用优化。
如果一次性传入大量数据
建议
- 1.先打死提供数据的人 ^ v ^~ (推荐)
- 2.如果打不过自己架设中间层
- 3.SPA + SSR处理 bigpipe (服务器渲染组件总比浏览器强,毕竟那么多核的CPU也不是花瓶)
- 4.可以考虑stream(我还没看用过...)
- 4.增加加载动画提升用户体验
- 5.同时避免浏览器处理大量的dom(具体看下面)
- 6.尽量不要再用vue的双向数据绑定了 或者只用部分页面中处理的数据
如果并非一次性传入大量数据 而只是分段加载 但次数特别多
建议
- 1.异步渲染组件
- 2.使用vue的v-if 最多显示上中(可视区域)下三屏 避免出现大量的dom节点
- 3.或者使用分页(体验可能不如上面那么好“无限加载的也要考虑dom过多的情况”)
个人建议,如有误,还劳烦指正
可以使用虚拟列表,Object.freeze冻结对象,Object.preventExtentsion阻止对象扩展来阻止vue给每个对象加上get,set,但是缺点是不能响应了
- 按需加载局部数据, 虚拟列表,无限下拉刷新
- js运行异步处理:
分割任务,实现时间切片处理, 类似react fiber, 每次执行记录时间, 超过一定执行时间则settimeout或requestAnimation推迟到下一个时间片,一般一个时间片为16ms - 大量纯展示的数据,不需要追踪变化的 用object.freeze冻结
1.这主要是接口慢,后端优化的事。
2.加个loading。。。
3.数据量大vue已经处理的很好了,我能怎么优化,无非就是用户体验。
4.减少dom结构,减少重构?避免回流啥的,就是减少重绘的时间。
1.建议先从来源地方优化,SQL语句,是否SELECT使用了*, 这个真的很影响速度, 是否建立了索引.
2.然后从传输层来说,提升服务器的上传速率
3.从前端来看,要求分页处理
4.从产品角度来看,优化加载的设计
可以考虑使用 render
函数
如果一次性传入大量数据
建议
- 1.先打死提供数据的人 ^ v ^~ (推荐)
- 2.如果打不过自己架设中间层
- 3.SPA + SSR处理 bigpipe (服务器渲染组件总比浏览器强,毕竟那么多核的CPU也不是花瓶)
- 4.可以考虑stream(我还没看用过...)
- 4.增加加载动画提升用户体验
- 5.同时避免浏览器处理大量的dom(具体看下面)
- 6.尽量不要再用vue的双向数据绑定了 或者只用部分页面中处理的数据
如果并非一次性传入大量数据 而只是分段加载 但次数特别多
建议
- 1.异步渲染组件
- 2.使用vue的v-if 最多显示上中(可视区域)下三屏 避免出现大量的dom节点
- 3.或者使用分页(体验可能不如上面那么好“无限加载的也要考虑dom过多的情况”)
个人建议,如有误,还劳烦指正
前端菜鸟想问下, 如何通过vue的v-if来进行上中下的三屏dom控制?
总结了一下
1.添加加载动画,优化用户体验
2.利用服务器渲染SSR,在服务端渲染组件
3.避免浏览器处理大量的dom,比如懒加载,异步渲染组件,使用分页
4.对于固定的非响应式的数据,使用Object.freeze冻结
如果一次性传入大量数据
建议
- 1.先打死提供数据的人 ^ v ^~ (推荐)
- 2.如果打不过自己架设中间层
- 3.SPA + SSR处理 bigpipe (服务器渲染组件总比浏览器强,毕竟那么多核的CPU也不是花瓶)
- 4.可以考虑stream(我还没看用过...)
- 4.增加加载动画提升用户体验
- 5.同时避免浏览器处理大量的dom(具体看下面)
- 6.尽量不要再用vue的双向数据绑定了 或者只用部分页面中处理的数据
如果并非一次性传入大量数据 而只是分段加载 但次数特别多
建议
- 1.异步渲染组件
- 2.使用vue的v-if 最多显示上中(可视区域)下三屏 避免出现大量的dom节点
- 3.或者使用分页(体验可能不如上面那么好“无限加载的也要考虑dom过多的情况”)
个人建议,如有误,还劳烦指正
前端菜鸟想问下, 如何通过vue的v-if来进行上中下的三屏dom控制?
可以用IntersectionObserver或offsettop值判断dom的可见性,然后通过变量绑定控制展示
两个关键词:大量数据、渲染
那这里就需要讨论这个数据是全部都在一屏中渲染,还是有交互之后的更新,例如虚拟列表和懒加载。
如果只是对大量数据的处理,就是CPU密集型的计算的问题,这个部分可以通过引入缓存和多线程的方式来处理。
通过localStorage或者IndexDB来暂存数据在前端,然后通过web worker来多线程处理数据,包括虚拟DOM的diff。
渲染部分的核心想法是“双缓存”,也就是使用虚拟DOM,只是这个时候需要对数据做统一的处理,缓冲,在统一变更数据之后在生成对应的虚拟DOM树,来进行渲染的操作