《大厂面试》:输入 URL 到页面渲染”+ script defer/async 区别

77 阅读5分钟

大厂前端面试经典问题:

「从输入 URL 到页面渲染,浏览器到底经历了什么?」

这题简直是面试官的心头好——不管你投的是大厂、小厂、外企、初创公司,只要是前端岗,十个面试官有八个会问,剩下两个要么时间不够,要么刚好断电。

今天我们就用通俗+细节+面试思路,帮你搞定这道题。
学完这篇,你不仅能在面试中答得面试官连连点头,还能顺便装个逼:

“这个过程啊,就像你点了一份外卖,从你下单到吃进嘴里,中间可是一条技术长河。”


一、场景复盘:你敲下一个 URL,浏览器在忙什么?

我们用一个例子:

你输入 https://example.com,然后回车。
浏览器这条小船立刻起航,驶向网页大陆。

Step 1:浏览器解析 URL

  • 协议(https):告诉浏览器用哪种语言和服务器对话(HTTP/HTTPS)。
  • 域名(example.com):告诉浏览器要找哪家“饭店”。
  • 端口(https 默认 443):相当于饭店的后门号。
  • 路径和参数:告诉服务员你要点的菜(具体资源)。

Step 2:DNS 解析

浏览器去找 DNS 问路:

  1. 本地缓存(上次来吃饭还记得地址吗?)
  2. 系统缓存(操作系统问问自己记不记得)
  3. 路由器缓存(家门口的大爷)
  4. 运营商 DNS 服务器(小区居委会)
  5. 权威 DNS 服务器(菜馆总部)

最终拿到 IP:就是饭店的真实门牌号。


Step 3:建立 TCP 连接(三次握手)

像约会一样的确认流程:

  1. 我(客户端):“在吗?”(SYN)
  2. 对方(服务器):“在,听得见!”(SYN+ACK)
  3. 我:“好,那我开始说了!”(ACK)

如果是 HTTPS,还得来一套 TLS 握手(交换公钥、对称密钥),确保你们的对话不被偷听。


Step 4:发送 HTTP 请求

  • 浏览器把请求行请求头Cookie、可能还有请求体发过去。
  • Cookie 就像你上次吃饭留下的小纸条,告诉服务员“我就是上次那位”。
  • Authorization 头是你的 VIP 卡(比如 JWT)。

Step 5:服务器处理 & 返回响应

服务员(后端):

  1. 接单(路由匹配)。
  2. 看你有没有资格吃这道菜(鉴权)。
  3. 厨房(业务逻辑)炒菜。
  4. 装盘(序列化成 HTML/CSS/JS/json)。
  5. 送回给你(响应报文 + 状态码:200/301/302/304/...)。

常见状态码(面试常问)

  • 1xx:信息性
  • 200 OK
  • 301/302/307 重定向(永久/临时)
  • 304 未修改(协商缓存命中)
  • 401 未授权(认证失败)
  • 403 禁止访问(权限问题)
  • 404 未找到
  • 5xx 服务器错误(500/502/503/504)
  • 206 部分内容(Range 请求)

Step 6:浏览器接收响应

如果是 HTML,浏览器开始边收边解析:

  • HTML Parser:生成 DOM Tree(像搭积木)。
  • 同时下载遇到的资源(CSS、JS、图片等)。

Step 7:渲染(浏览器的化妆舞会)

  1. CSS Parser:生成 CSSOM(样式树)。
  2. 合并 DOM + CSSOM → Render Tree(只留可见元素)。
  3. Layout(排版):算每个元素的大小和位置。
  4. Paint(绘制):涂上颜色、阴影、背景。
  5. Composite(合成):把所有图层组合到屏幕上。

Step 8:执行 JS(可能改动 DOM)

  • 如果 JS 改了 DOM 或样式,可能触发:

    • Reflow(回流) :重新计算布局。
    • Repaint(重绘) :重新涂色(便宜点)。
  • 回流比重绘贵,所以面试官喜欢问“怎么减少回流?”(批量 DOM 修改、用 documentFragment、避免频繁改样式)。


二、为什么 <script> 会卡页面?

当 HTML 解析器遇到:

<script src="a.js"></script>

它会:

  1. 停下手里的积木活。
  2. 去下脚本。
  3. 回来执行脚本。
  4. 再继续堆积木。

这就叫 阻塞解析——首屏卡顿的元凶之一。


三、defer vs async,一句话记住

无属性 script:先下脚本再执行,卡解析。
async:并行下载 → 下载完立刻执行(可能 DOM 还没好),执行顺序不可控。适合不依赖 DOM、不依赖其他脚本的,比如埋点、广告。
defer:并行下载 → 等 HTML 全部解析完再按顺序执行。适合依赖 DOM、需要顺序的脚本。

属性下载时机执行时机顺序适合场景
无属性立即下载完立刻执行保序阻塞型脚本
async立即下载完立刻执行不保独立脚本
defer立即DOM 完成后执行保序依赖 DOM

面试必杀回答:

“如果脚本不依赖 DOM,我会用 async;依赖 DOM 且有顺序要求用 defer。这样用户体验好,还能让首屏加载更快。”


四、面试加分补充点

面试官一般会加码问:“那 HTTP/2、HTTP/3 有啥区别?”

  • HTTP/2:多路复用(一个 TCP 通道同时传多个文件)、二进制帧、头部压缩。
  • HTTP/3:基于 QUIC(UDP),免去 TCP 握手,更快、更抗丢包。

或者:

  • 预加载(<link rel="preload">):提前下关键资源。
  • 预连接(<link rel="preconnect">):提前建好 TCP/TLS,减少延迟。
  • Service Worker:离线缓存、拦截请求、做 PWA。

五、面试高分答题模板(记下来直接背)

“用户输入 URL 后,浏览器先解析 URL 并进行 DNS 查询获得 IP,然后通过 TCP(三次握手)建立连接,若是 HTTPS 还会 TLS 握手。接着浏览器发送 HTTP 请求,服务器路由、鉴权、生成响应返回。浏览器收到 HTML 后边解析边下载资源,HTML 生成 DOM Tree,CSS 生成 CSSOM,合并成 Render Tree,布局、绘制并合成到屏幕。JS 执行过程中可能阻塞解析,所以我会根据依赖关系选择 async 或 defer 以优化首屏体验。HTTP/2 可以多路复用减少延迟,配合预加载、预连接和缓存策略进一步优化性能。”


总结
这道题是前端面试中的“永恒之题”,越能讲出细节、越能结合实际优化点,你在面试官心中的形象就越专业。记住——不是背八股,是用生活化+技术细节打动面试官。