让前端飞Web前端之路Web 前端开发

浏览器输入 URL 到页面呈现及其优化

2019-10-30  本文已影响0人  coolheadedY

输入 url: 浏览器先检查缓存,然后解析本地-路由器-全网 dns,指向服务器 ip

请求远程服务器: 建立 TLS 连接2次RTT, TCP 三次握手RTT,nginx 转发到对应的资源上,服务器检查缓存

ssl_session_tickets on;
ssl_session_ticket_key current.key;
ssl_session_ticket_key previous.key;

服务器断开连接的四次挥手

浏览器检查状态码,304 协商缓存,301,302 重定向

解析返回内容,重排重绘

  1. html 解析成 dom 树
  2. css 解析成 cssom
  3. 结合 dom 树和 cssom 生成 render tree
  4. 进行布局 flow 将 渲染树的 节点进行合成
  5. 进行绘制 paint 至屏幕上
  • defer async 资源的script 都不阻塞,
    普通 script 下载阻塞再执行阻塞
    defer 先下载 html 解析完后执行,没什么阻塞
    async 下载好后直接执行,阻塞执行阶段

重排重绘优化

// 改变 p 里的 dom 也会影响 h5 和 h4,固定 p 的大小
<body>
  <div class="hello">
    <h4>h4</h4>
    <p><strong>Name:</strong>BDing</p>
    <h5>h5</h5>
  </div>
</body>
// 只发生一次重绘重排, 读取操作在写入操作完成后才进行, 有的浏览器低下仍会进行4次
div.style.left = '10px';
div.style.top = '10px';
div.style.width = '20px';
div.style.height = '20px';
console.log(div.offsetLeft);
console.log(div.offsetTop);
console.log(div.offsetWidth);
console.log(div.offsetHeight);
// 使用添加 className 和 cssText 的方式一次操作
el.className += " otherclass"
el.style.cssText += "; left: " + left + "px; top: " + top + "px;";
// bad 同时又读写操作 强制刷新 触发两次重排
div.style.left = div.offsetLeft + 1 + 'px';
div.style.top = div.offsetTop + 1 + 'px';
// good 缓存布局信息 读写分离
var curLeft = div.offsetLeft;
var curTop = div.offsetTop;
div.style.left = curLeft + 1 + 'px';
div.style.top = curTop + 1 + 'px';
dom.display = 'none'
// 修改dom样式
dom.display = 'block'
----
const fragment = document.createDocumentFragment();
// DocumentFragment 上批量操作 dom
list.appendChild(fragment);
----
复制 dom,操作完后替换掉原 dom
var p = document.getElementById("para1"),
var p_prime = p.cloneNode(true);

参考

上一篇 下一篇

猜你喜欢

热点阅读