hawx1993 / tech-blog

📦My personal tech blog,not regularly update
http://sf.gg/u/trigkit4/articles
339 stars 30 forks source link

前端性能优化方案梳理 #30

Open hawx1993 opened 1 year ago

hawx1993 commented 1 year ago

合理利用缓存

只请求当前需要的资源

缩减压缩包体积

时序优化

降低请求量

加快请求速度

渲染优化

LCP 优化

LCP:Largest Contentful Paint,当前视窗中的最大内容元素渲染时间,小于2.5s属于还不错。
元素大小是指元素在视口中的可见大小,如果一个元素延伸到视口外面,如果有裁剪或者延伸到视口外面,则不纳入计算。如果元素是图片,图片固有尺寸大小和实际渲染大小,则取最小值那个。
LCP主要受以下四方面影:

可以使用web-vitals测量LCP时间。关于LCP的优化方法参考如下:

相关参考:https://web.dev/optimize-lcp/

FID 优化

First Input Delay,FID衡量的是用户输入到主线程空闲的时间差。

关于FID的优化方法参考如下:

FID减少长任务

相关参考:https://web.dev/optimize-fid/

使用webpack 优化项目

使用Performance分析优化

Chrome Devtools 的 Performance 工具是网页性能分析的利器,它可以记录一段时间内的代码执行情况,比如 Main 线程的 Event Loop、每个 Event loop 的 Task,每个 Task 的调用栈,每个函数的耗时等,还可以定位到 Sources 中的源码位置。

Performance 工具最重要的是分析主线程的 Event Loop,分析每个 Task 的耗时、调用栈等信息。
因为渲染和 JS 执行都在主线程,在一个 Event Loop 中,会相互阻塞,如果 JS 有长时间执行的 Task,就会阻塞渲染,导致页面卡顿。所以,性能分析主要的目的是找到 long task,之后消除它。

使用Performance分析性能瓶颈

有如下代码,点击block1,调用myClickEvent,myClickEvent同步执行forEach循环,之后延迟1.5s调用changeHeight函数,改变block1的高度。

//index.html 
<div class="block1">block1</div>
<div class="block2">block2</div>
// script.js
const block1 = document.querySelector('.block1');
const block2 = document.querySelector('.block2');

function changeHeight() {
  block1.style.height = '300px';
}
function arrayFun() {
  console.log('1');
}
function myClickEvent() {
  setTimeout(() => {
    changeHeight();
  }, 1500);
  new Array(10000).fill(0).forEach(arrayFun);
}
block1.addEventListener('click', myClickEvent);


如上图所示,我们可以在main 主线程中看到带有红色三角号的task,说明该任务是个long task,存在性能问题。点击该task,可以在下方的event log看到具体的事件日志。


根据上图,找到self time耗时最长的任务,右侧可以看到具体的js文件和行数,这样便定位到问题所在。

使用Performance分析代码使用率

我们还可以通过 Coverage 工具分析运行时的代码使用情况:

小结:资源加载的性能优化可以用 Coverage 工具记录代码使用情况,分析出没用到的代码,使用 treeshking、懒加载等方式,针对性的优化它。

使用Chrome 排查内存泄露

内存泄露是指由于疏忽或错误造成程序未能释放已经不再使用的内存。

重现您认为可能正在泄漏的某些场景,例如,打开和关闭模式对话框。对话框关闭后,您希望内存恢复到上一级。因此,您需要拍摄另一个快照,然后将其与上一个快照进行比较。

https://developers.google.com/web/tools/chrome-devtools/memory-problems?hl=zh-cn

使用Network分析网络请求

Reference:

React 组件性能优化

了解最新的React Fiber架构


应该知道什么是fiber算法,Fiber架构,双缓冲模式,Lane模型,时间切片,Reconciler,Scheduler,和Concurrent模式。

相关阅读