为了方便后续测试,我们可以使用node创建一个简单的服务器。,服务器端代码:,我们可以使用 node 或 nodemon 启动服务器:,然后我们的前端由一个 HTML 文件和一个 JS 文件组成。,Index.html:,Index.js:,好的,这就是我们的前端页面模板代码,我们开始渲染数据。,最直接的方法是一次将所有数据渲染到页面。代码如下:,一次渲染 100,000 条记录大约需要 12 秒,这显然是不可取的。,一个简单的优化方法是对数据进行分页。假设每个页面都有limit记录,那么数据可以分为Math.ceil(total/limit)个页面。之后,我们可以使用 setTimeout 顺序渲染页面,一次只渲染一个页面。,分页后,数据可以快速渲染到屏幕上,减少页面的空白时间。,在渲染页面的时候,我们可以使用requestAnimationFrame来代替setTimeout,这样可以减少reflow次数,提高性能。,window.requestAnimationFrame() 方法告诉浏览器您希望执行动画,并请求浏览器调用指定函数在下一次重绘之前更新动画。该方法将回调作为要在重绘之前调用的参数。,以前,每次创建 div 元素时,都会通过 appendChild 将元素直接插入到页面中。但是 appendChild 是一项昂贵的操作。,实际上,我们可以先创建一个文档片段,在创建了 div 元素之后,再将元素插入到文档片段中。创建完所有 div 元素后,将片段插入页面。这样做还可以提高页面性能。,虽然后端一次返回这么多数据,但用户的屏幕只能同时显示有限的数据。所以我们可以采用延迟加载的策略,根据用户的滚动位置动态渲染数据。,要获取用户的滚动位置,我们可以在列表末尾添加一个空节点空白。每当视口出现空白时,就意味着用户已经滚动到网页底部,这意味着我们需要继续渲染数据。,同时,我们可以使用getBoundingClientRect来判断空白是否在页面底部。,
,使用 Vue 的示例代码:,我们从一个面试问题开始,讨论了几种不同的性能优化技术。,如果你在面试中被问到这个问题,你可以用今天的内容回答这个问题,如果你在工作中遇到这个问题,你应该先揍那个写 API 的人。
© 版权声明
文章版权归作者所有,未经允许请勿转载。