Open tiantingrui opened 2 years ago
chrome performance
chrome-extension的请求混杂在页面请求中,难以分析 filter中填写 -scheme:chrome-extension 即可过滤掉插件请求
webpack-bundle-analyzer插件,代码:vue.config.js + package.json
和渲染息息相关的主要有
GUI渲染线程负责渲染浏览器界面HTML元素,当界面需要重绘(Repaint)或由于某种操作引发回流(reflow)时,该线程就会执行。 在Javascript引擎运行脚本期间,GUI渲染线程都是处于挂起状态的,也就是说被冻结了.
JS为处理页面中用户的交互,以及操作DOM树、CSS样式树来给用户呈现一份动态而丰富的交互体验和服务器逻辑的交互处理。
GUI渲染线程与JS引擎线程互斥的,是由于JavaScript是可操纵DOM的,如果在修改这些元素属性同时渲染界面(即JavaScript线程和UI线程同时运行),那么渲染线程前后获得的元素数据就可能不一致。 当JavaScript引擎执行时GUI线程会被挂起,GUI更新会被保存在一个队列中等到引擎线程空闲时立即被执行。 由于GUI渲染线程与JS执行线程是互斥的关系,当浏览器在执行JS程序的时候,GUI渲染线程会被保存在一个队列中,直到JS程序执行完成,才会接着执行。
因此如果JS执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞的感觉。
重绘(repaint):改变某个元素的背景色、文字颜色、边框颜色等等不影响它周围或内部布局的属性时,屏幕的一部分要重画,但是元素的几何尺寸没有变。
渲染流程主要分为以下4步:
现代浏览器总是并行加载资源,例如,当 HTML 解析器(HTML Parser)被脚本阻塞时,解析器虽然会停止构建 DOM,但仍会识别该脚本后面的资源,并进行预加载。
同时,由于下面两点:
所以存在阻塞的 CSS 资源时,浏览器会延迟 JavaScript 的执行和 DOM 构建。另外:
所以,script 标签的位置很重要。实际使用时,可以遵循下面两个原则:
defer async
都是异步加载js资源, 但是区别是async加载完资源后会立即开始执行, 而defer会在整个document解析完成后执行
一、图片资源优化
tips: 如何判断元素是否在可视区域内?
原理:默认给图片设置一个兜底图, 监听页面滚动, 判断图片进入可视区域内后, 则给图片设置真实的src
代码:懒加载.html
const img = new Image();
img.src= 'xxxxxx';
<img src="http://pic26.nipic.com/20121213/6168183 0044449030002.jpg" style="display:none"/>
https://help.aliyun.com/document_detail/171050.html?spm=5176.10695662.1996646101.searchclickresult.2b9b75d6NiTHLQ https://help.aliyun.com/document_detail/44704.html?spm=a2c4g.11186623.6.1428.4acb1ecfHEUVE6
二、其他静态资源加载优化
https://github.com/GoogleChromeLabs/quicklink
link(rel="dns-prefetch", href="//www.baidu.com")
link(rel="preconnect", href="//www.baidu.com")
link(rel="preload", as="script", href=xxxxx)
link(rel="preload", as="image", href=xxxxxx)
gzip, Brotli https://help.aliyun.com/document_detail/27127.html?spm=a2c4g.11186623.6.645.70471769PeSCe6
打包优化 https://webpack.docschina.org/configuration/optimization/
代码:index.html
同构渲染 - next.js nuxt.js pug模板渲染
为了兼容低版本浏览器, 我们一般会引入polyfill。但是@babel/polyfill这个包非常大, gzip之后都有27.7k, 非常影响体积.
阿里云cdn: https://polyfill.alicdn.com/polyfill.min.js?features=es6,es7,es2017,es2018&flags=gated
<script src="https://polyfill.io/v3/polyfill.js?features=es5,es6,es7,es2017,es2018&flags=gated&callback=invokeMain" async></script>
function invokeMain() {
var scriptElement = document.createElement('script');
scriptElement.type = 'text/javascript';
scriptElement.async = true;
scriptElement.src = 'xxxxxxxxx';
document.body.appendChild(scriptElement);
}
可以放到window.addEventListener('load', () => {})
代码 - 节流 防抖
节流函数:当持续触发事件时,保证一定时间段内只调用一次事件处理函数。 防抖函数:当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设定的时间到来之前,又一次触发了事件,就重新开始延时。
函数节流不管事件触发有多频繁,都会保证在规定时间内一定会执行一次真正的事件处理函数 函数防抖只是在最后一次事件后才触发一次函数。
比如在页面的无限加载场景下,我们需要用户在滚动页面时,每隔一段时间发一次 Ajax 请求,而不是在用户停下滚动页面操作时才去请求数据。这样的场景,就适合用节流技术来实现。 而比如搜索框, 输入结束后才发起请求, 就适合用防抖