从输入URL到网页显示的完整过程

110 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第23天,点击查看活动详情

从输入URL到网页显示的完整过程

这个题目在面试题圈子里面都已经被刷烂了,无论是视频教程、文章、还是分享都是多如牛毛。不管怎么样,本章都要好好的捋一捋这一题,我们分成三个步骤:

  • 网络请求
  • 解析
  • 渲染

网络请求

  • DNS 查询(得到IP),建立 TCP 连接(三次握手)
  • 浏览器发起 HTTP 请求
  • 收到请求响应,得到 HTML 源代码
    • 这时候没有页面,只有源码
    • 继续请求静态资源
      • 解析 HTML 过程中,遇到静态资源还会继续发起网络请求
      • JS CSS 图片 视频 等
      • 静态资源也可能是强缓存,此时不必请求

解析

在我们得到 js css 这些都是字符串吧,得到字符串之后要干嘛?结构化数据

html css 等源代码是字符串形式,需要解析为特定的数据结构,才能被后续使用。 那么,其实解析是一个什么过程呢?就是一个非常重要的结构化dom树的过程

解析过程:

  • Html 构建 DOM 树
  • CSS 构建 CSSOM 树(style tree)
  • 两者结合,形成 render tree image.png

ps: 解析过程很复杂的,为什么复杂呢?举几个例子:

  • CSS 可能来自 <style><link>
  • JS 可能是内嵌、或外链的,甚至有的还有 defer、async 的逻辑
  • imag 可能是内嵌的,也可能是外链的

优化解析

综上,为了避免不必要的情况,要遵守以下规则

  • css 放在 <head>中,不要异步加载 css
  • js 放在 body 最下面,合理使用 deferasync,不要中途加载、执行 js
  • <img> 等媒体文件尽量限制尺寸,防止渲染时重绘页面

渲染

render tree 绘制到页面:render tree就是上一步的产物。

  • 计算各个DOM的尺寸,定位,最后绘制到页面
  • 遇到 js 可能会执行(参考defer、async)

绘制完成之后,还要继续执行异步加载的资源

  • 异步的 css ,重新渲染页面
  • 异步的 js ,执行(可能重新渲染页面)
  • 异步加载的图片等,可能重新渲染页面(根据图片尺寸)

最后页面渲染完成。

总结

  • 网络请求
    • DNS 解析
    • TCP 连接
    • HTTP 请求和响应
  • 解析
    • DOM 树
    • render tree
  • 渲染页面
    • 可能重绘页面