大连网站建设方案咨询,建设银行江西分行官方网站,wordpress 会员名字,网站开发实验报告前言 最近博主在字节面试中遇到这样一个面试题#xff0c;这个问题也是前端面试的高频问题#xff0c;作为一名前端开发工程师#xff0c;我们虽然可能很少会遇到后端返回十万条数据的情况#xff0c;但是了解掌握如何处理这种情况#xff0c;能让你对前端性能优化有更深的… 前言 最近博主在字节面试中遇到这样一个面试题这个问题也是前端面试的高频问题作为一名前端开发工程师我们虽然可能很少会遇到后端返回十万条数据的情况但是了解掌握如何处理这种情况能让你对前端性能优化有更深的理解博主在这给大家细细道来。 作者简介程序员小豪全栈工程师热爱编程曾就职于蔚来、腾讯现就职于某互联网大厂技术栈Vue、React、Python、Java 本文收录于小豪的前端系列专栏后续还会更新前端入门以及前端面试的一些相关文章手把手带你从零学习前端到面试找工作并如果有想进入前端领域工作的同学这个前端专栏会对你有所帮助欢迎关注起来呀 本人也会持续的去关注AIGC以及人工智能领域的一些动向并总结到博客中大家感兴趣的可以关注一下我的人工智能专栏 云原生的入门学习系列大家有兴趣的可以看一看 目录 最粗暴的做法一次性渲染使用定时器为什么会出现闪屏现象呢简单聊一下 setTimeout 和闪屏现象 使用 requestAnimationFrame使用 DocumentFragment总结 最粗暴的做法一次性渲染
我们先来看看最粗暴的做法一次性将大量数据插入到页面中
ul idcontainer/ul// 记录任务开始时间
let now Date.now();
// 插入十万条数据
const total 100000;
// 获取容器
let ul document.getElementById(container);
// 将数据插入容器中
for (let i 0; i total; i) {let li document.createElement(li);li.innerText ~~(Math.random() * total)ul.appendChild(li);
}console.log(JS运行时间,Date.now() - now);
setTimeout((){console.log(总运行时间,Date.now() - now);
},0)
// print: JS运行时间 187
// print: 总运行时间 2844我们对十万条记录进行循环操作JS的运行时间为187ms还是蛮快的但是最终渲染完成后的总时间确是2844ms。
简单说明一下为何两次console.log的结果时间差异巨大并且是如何简单来统计JS运行时间和总渲染时间
在 JS 的Event Loop中当JS引擎所管理的执行栈中的事件以及所有微任务事件全部执行完后才会触发渲染线程对页面进行渲染第一个console.log的触发时间是在页面进行渲染之前此时得到的间隔时间为JS运行所需要的时间第二个console.log是放到 setTimeout 中的它的触发时间是在渲染完成在下一次Event Loop中执行的
依照两次console.log的结果可以得出结论
对于大量数据渲染的时候JS运算并不是性能的瓶颈性能的瓶颈主要在于渲染阶段
使用定时器
从上面的例子我们已经知道页面的卡顿是由于同时渲染大量DOM所引起的所以我们考虑将渲染过程分批进行
在这里我们使用setTimeout来实现分批渲染
ul idcontainer/ul//需要插入的容器
let ul document.getElementById(container);
// 插入十万条数据
let total 100000;
// 一次插入 20 条
let once 20;
//总页数
let page total/once
//每条记录的索引
let index 0;
//循环加载数据
function loop(curTotal,curIndex){if(curTotal 0){return false;}//每页多少条let pageCount Math.min(curTotal , once);setTimeout((){for(let i 0; i pageCount; i){let li document.createElement(li);li.innerText curIndex i : ~~(Math.random() * total)ul.appendChild(li)}loop(curTotal - pageCount,curIndex pageCount)},0)
}
loop(total,index);用一个gif图来看一下效果
我们可以看到页面加载的时间已经非常快了每次刷新时可以很快的看到第一屏的所有数据但是当我们快速滚动页面的时候会发现页面出现闪屏或白屏的现象
为什么会出现闪屏现象呢
首先理清一些概念。FPS表示的是每秒钟画面更新次数。我们平时所看到的连续画面都是由一幅幅静止画面组成的每幅画面称为一帧FPS是描述帧变化速度的物理量。
大多数电脑显示器的刷新频率是60Hz大概相当于每秒钟重绘60次FPS为60frame/s为这个值的设定受屏幕分辨率、屏幕尺寸和显卡的影响。
因此当你对着电脑屏幕什么也不做的情况下大多显示器也会以每秒60次的频率正在不断的更新屏幕上的图像。
为什么你感觉不到这个变化
那是因为人的眼睛有视觉停留效应即前一副画面留在大脑的印象还没消失紧接着后一副画面就跟上来了 这中间只间隔了16.7ms(1000/60≈16.7)所以会让你误以为屏幕上的图像是静止不动的。
而屏幕给你的这种感觉是对的试想一下如果刷新频率变成1次/秒屏幕上的图像就会出现严重的闪烁 这样就很容易引起眼睛疲劳、酸痛和头晕目眩等症状。
大多数浏览器都会对重绘操作加以限制不超过显示器的重绘频率因为即使超过那个频率用户体验也不会有提升。 因此最平滑动画的最佳循环间隔是1000ms/60约等于16.6ms。
直观感受不同帧率的体验
帧率能够达到 50 60 FPS 的动画将会相当流畅让人倍感舒适帧率在 30 50 FPS 之间的动画因各人敏感程度不同舒适度因人而异帧率在 30 FPS 以下的动画让人感觉到明显的卡顿和不适感帧率波动很大的动画亦会使人感觉到卡顿。
简单聊一下 setTimeout 和闪屏现象
setTimeout的执行时间并不是确定的。在JS中setTimeout任务被放进事件队列中只有主线程执行完才会去检查事件队列中的任务是否需要执行因此setTimeout的实际执行时间可能会比其设定的时间晚一些。刷新频率受屏幕分辨率和屏幕尺寸的影响因此不同设备的刷新频率可能会不同而setTimeout只能设置一个固定时间间隔这个时间不一定和屏幕的刷新时间相同。
以上两种情况都会导致setTimeout的执行步调和屏幕的刷新步调不一致。
在setTimeout中对dom进行操作必须要等到屏幕下次绘制时才能更新到屏幕上如果两者步调不一致就可能导致中间某一帧的操作被跨越过去而直接更新下一帧的元素从而导致丢帧现象。
使用 requestAnimationFrame
与setTimeout相比requestAnimationFrame最大的优势是由系统来决定回调函数的执行时机。
如果屏幕刷新率是60Hz,那么回调函数就每16.7ms被执行一次如果刷新率是75Hz那么这个时间间隔就变成了1000/7513.3ms换句话说就是requestAnimationFrame的步伐跟着系统的刷新步伐走。它能保证回调函数在屏幕每一次的刷新间隔中只被执行一次这样就不会引起丢帧现象。
我们使用requestAnimationFrame来进行分批渲染
ul idcontainer/ul//需要插入的容器
let ul document.getElementById(container);
// 插入十万条数据
let total 100000;
// 一次插入 20 条
let once 20;
//总页数
let page total/once
//每条记录的索引
let index 0;
//循环加载数据
function loop(curTotal,curIndex){if(curTotal 0){return false;}//每页多少条let pageCount Math.min(curTotal , once);window.requestAnimationFrame(function(){for(let i 0; i pageCount; i){let li document.createElement(li);li.innerText curIndex i : ~~(Math.random() * total)ul.appendChild(li)}loop(curTotal - pageCount,curIndex pageCount)})
}
loop(total,index);看下效果
我们可以看到页面加载的速度很快并且滚动的时候也很流畅没有出现闪烁丢帧的现象。
这就结束了么还可以再优化么
当然~~
使用 DocumentFragment
先解释一下什么是 DocumentFragment 文献引用自MDN DocumentFragment文档片段接口表示一个没有父级文件的最小文档对象。它被作为一个轻量版的Document使用用于存储已排好版的或尚未打理好格式的XML片段。最大的区别是因为DocumentFragment不是真实DOM树的一部分它的变化不会触发DOM树的重新渲染) 且不会导致性能等问题。可以使用document.createDocumentFragment方法或者构造函数来创建一个空的DocumentFragment从MDN的说明中我们得知DocumentFragments是DOM节点但并不是DOM树的一部分可以认为是存在内存中的所以将子元素插入到文档片段时不会引起页面回流。
当append元素到document中时被append进去的元素的样式表的计算是同步发生的此时调用 getComputedStyle 可以得到样式的计算值。 而append元素到documentFragment 中时是不会计算元素的样式表所以documentFragment 性能更优。当然现在浏览器的优化已经做的很好了 当append元素到document中后没有访问 getComputedStyle 之类的方法时现代浏览器也可以把样式表的计算推迟到脚本执行之后。
最后修改代码如下
复制代码ul idcontainer/ul//需要插入的容器
let ul document.getElementById(container);
// 插入十万条数据
let total 100000;
// 一次插入 20 条
let once 20;
//总页数
let page total/once
//每条记录的索引
let index 0;
//循环加载数据
function loop(curTotal,curIndex){if(curTotal 0){return false;}//每页多少条let pageCount Math.min(curTotal , once);window.requestAnimationFrame(function(){let fragment document.createDocumentFragment();for(let i 0; i pageCount; i){let li document.createElement(li);li.innerText curIndex i : ~~(Math.random() * total)fragment.appendChild(li)}ul.appendChild(fragment)loop(curTotal - pageCount,curIndex pageCount)})
}
loop(total,index);总结
各位看官老爷们好小豪已经建立了技术交流群如果你很感兴趣可以私信我加入我的社群。
社群中不定时会有很多活动例如学习资料分享、大厂面经分享、技术讨论、行业大佬创业杂谈等等。
本人目前是在互联网大厂正式工作也有过多个大厂的工作经历加入社群也会有简历修改辅导模拟面试手把手项目实战教学大厂工作内推机会以及大厂面试题解析分享等福利。
社群方向很多相关领域有Web全栈前后端、人工智能、AIGC、自媒体变现、前沿科技文章分享、论文精读等等。
不管你是多新手的小白都欢迎你加入社群中讨论、聊天、分享加速助力你成为下一个技术大佬也随时欢迎您跟我沟通一起交流一起成长。变现、进步、技术、资料、项目、你想要的这里都会有
网络的风口只会越来越大风浪越大鱼越贵欢迎您加入社群~一个人可以或许可以走的很快但一群人将走的更远
想都是问题做都是答案行动起来吧欢迎评论区or后台与我沟通交流也欢迎您扫描下方二维码直接加入到我的交流社群(微信adcoderhao) 文章转载自: http://www.morning.zlfxp.cn.gov.cn.zlfxp.cn http://www.morning.qyjqj.cn.gov.cn.qyjqj.cn http://www.morning.ktyww.cn.gov.cn.ktyww.cn http://www.morning.cbvlus.cn.gov.cn.cbvlus.cn http://www.morning.drzkk.cn.gov.cn.drzkk.cn http://www.morning.bzlgb.cn.gov.cn.bzlgb.cn http://www.morning.xgzwj.cn.gov.cn.xgzwj.cn http://www.morning.wmrgp.cn.gov.cn.wmrgp.cn http://www.morning.qnkqk.cn.gov.cn.qnkqk.cn http://www.morning.yrbhf.cn.gov.cn.yrbhf.cn http://www.morning.cmhkt.cn.gov.cn.cmhkt.cn http://www.morning.fthcq.cn.gov.cn.fthcq.cn http://www.morning.dpdr.cn.gov.cn.dpdr.cn http://www.morning.rlhh.cn.gov.cn.rlhh.cn http://www.morning.wmqrn.cn.gov.cn.wmqrn.cn http://www.morning.ghgck.cn.gov.cn.ghgck.cn http://www.morning.llcsd.cn.gov.cn.llcsd.cn http://www.morning.qxxj.cn.gov.cn.qxxj.cn http://www.morning.slwfy.cn.gov.cn.slwfy.cn http://www.morning.dnzyx.cn.gov.cn.dnzyx.cn http://www.morning.xnyfn.cn.gov.cn.xnyfn.cn http://www.morning.kfldw.cn.gov.cn.kfldw.cn http://www.morning.qlsbz.cn.gov.cn.qlsbz.cn http://www.morning.sxlrg.cn.gov.cn.sxlrg.cn http://www.morning.qrcxh.cn.gov.cn.qrcxh.cn http://www.morning.rtsx.cn.gov.cn.rtsx.cn http://www.morning.sxmbk.cn.gov.cn.sxmbk.cn http://www.morning.lmxzw.cn.gov.cn.lmxzw.cn http://www.morning.mtyhk.cn.gov.cn.mtyhk.cn http://www.morning.txmlg.cn.gov.cn.txmlg.cn http://www.morning.ctqbc.cn.gov.cn.ctqbc.cn http://www.morning.nlmm.cn.gov.cn.nlmm.cn http://www.morning.lhxrn.cn.gov.cn.lhxrn.cn http://www.morning.roymf.cn.gov.cn.roymf.cn http://www.morning.ztcwp.cn.gov.cn.ztcwp.cn http://www.morning.dnqpq.cn.gov.cn.dnqpq.cn http://www.morning.rmryl.cn.gov.cn.rmryl.cn http://www.morning.rykn.cn.gov.cn.rykn.cn http://www.morning.wpspf.cn.gov.cn.wpspf.cn http://www.morning.frnjm.cn.gov.cn.frnjm.cn http://www.morning.mnclk.cn.gov.cn.mnclk.cn http://www.morning.nrll.cn.gov.cn.nrll.cn http://www.morning.mqdr.cn.gov.cn.mqdr.cn http://www.morning.nssjy.cn.gov.cn.nssjy.cn http://www.morning.zrkws.cn.gov.cn.zrkws.cn http://www.morning.xnltz.cn.gov.cn.xnltz.cn http://www.morning.llcgz.cn.gov.cn.llcgz.cn http://www.morning.wjdgx.cn.gov.cn.wjdgx.cn http://www.morning.zmwzg.cn.gov.cn.zmwzg.cn http://www.morning.lztrt.cn.gov.cn.lztrt.cn http://www.morning.qgfkn.cn.gov.cn.qgfkn.cn http://www.morning.nzmw.cn.gov.cn.nzmw.cn http://www.morning.lmqfq.cn.gov.cn.lmqfq.cn http://www.morning.kmqwp.cn.gov.cn.kmqwp.cn http://www.morning.shinezoneserver.com.gov.cn.shinezoneserver.com http://www.morning.cmrfl.cn.gov.cn.cmrfl.cn http://www.morning.ylxgw.cn.gov.cn.ylxgw.cn http://www.morning.tkchg.cn.gov.cn.tkchg.cn http://www.morning.wjhnx.cn.gov.cn.wjhnx.cn http://www.morning.gkjnz.cn.gov.cn.gkjnz.cn http://www.morning.wdprz.cn.gov.cn.wdprz.cn http://www.morning.tldhq.cn.gov.cn.tldhq.cn http://www.morning.xpzgg.cn.gov.cn.xpzgg.cn http://www.morning.wcjk.cn.gov.cn.wcjk.cn http://www.morning.lcdtb.cn.gov.cn.lcdtb.cn http://www.morning.tnthd.cn.gov.cn.tnthd.cn http://www.morning.pjxlg.cn.gov.cn.pjxlg.cn http://www.morning.sxmbk.cn.gov.cn.sxmbk.cn http://www.morning.yrhd.cn.gov.cn.yrhd.cn http://www.morning.rtlg.cn.gov.cn.rtlg.cn http://www.morning.tlfzp.cn.gov.cn.tlfzp.cn http://www.morning.hnkkm.cn.gov.cn.hnkkm.cn http://www.morning.zrnph.cn.gov.cn.zrnph.cn http://www.morning.tcylt.cn.gov.cn.tcylt.cn http://www.morning.brlgf.cn.gov.cn.brlgf.cn http://www.morning.wyfpc.cn.gov.cn.wyfpc.cn http://www.morning.xmtzk.cn.gov.cn.xmtzk.cn http://www.morning.wqcbr.cn.gov.cn.wqcbr.cn http://www.morning.tslfz.cn.gov.cn.tslfz.cn http://www.morning.hpjpy.cn.gov.cn.hpjpy.cn