浏览器渲染
浏览器渲染流程
javascript(触发页面视觉变化)
style(根据css重新计算样式)
layout(布局,得到元素的大小和位置)
paint(把元素实际绘制到页面上,像素化每个节点的过程)
composite(合成/复合)把页面拆成多个图层,进行绘制
浏览器有 渲染引擎和 JS 引擎
渲染引擎, 我们常说的浏览器内核主要指的就是渲染引擎: WebKit JavaScript 引擎是一个专门处理 JavaScript 脚本的虚拟机,常见的 js引擎: V8
页面中有script标签时会阻塞html 的渲染
如下面的 myElement 在script 下面,这时就去不到它的值,就会返回undefined
<script>for (var i = 0; i < 5000000; i++) {if(i%50000 === 0){console.log(`i ==`,i)}}console.log(document.body.innerHTML);let myElement = document.getElementById("myElement");console.log(`myElement===`);console.log(myElement);// undefined</script><img id="img" src="https://www.learnnote.site/images/golden-retriever.png" /><div id="myElement" className='p-2 bg-gray-200 mt-1'>default content, the text should be changed to "Page loaded successfully!"</div>
回流(reflow)
对页面做了一些事情,导致了layout过程的再次发生
影响回流的一些操作
添加/删除元素操作stylesdisplay:noneoffsetLeftscrollTopclientWidth移动元素的位置修改浏览器大小,字体等
4 things a browser can animate cheaply
浏览器不会触发回流,而直接触发复合的过程
position: transform: translate(npx, npx)
防止布局抖动
避免回流
读写分离
利用fastdom 进行元素位置的读写分离
react fiber 时间分片 5 毫秒时间,以便响应更高优先级的任务,如用户输入点击等。浏览器渲染是每秒60帧,也就是16ms渲染一帧。每秒60帧是人类肉眼看起来比较流畅的
window.requestAnimationFrame vs window.requestIdleCallback
window.requestAnimationFramerAF是渲染之前发生,高优先级一般情况下,一帧会执行一次 requestAnimationFramewindow.requestIdleCallback空闲时才执行,低优先级
如何判断用户打开了浏览器控制台
// 页面上加上如下代码,如果用户没有打开控制台,debugger 不会生效,// 这时 timeConsumed 会很小,一般会小于1,// 如果 用户打开了控制台,debugger 生效,往下走 timeConsumed 肯定会大于100setInterval(() => {let startTime = performance.now();debuggerlet endTime = performance.now();let timeConsumed = endTime - startTime;console.log(`timeConsumed`, timeConsumed)if(timeConsumed > 100){console.log(`opened f12`)}}, 100)