大厂前端面试经典问题:
「从输入 URL 到页面渲染,浏览器到底经历了什么?」
这题简直是面试官的心头好——不管你投的是大厂、小厂、外企、初创公司,只要是前端岗,十个面试官有八个会问,剩下两个要么时间不够,要么刚好断电。
今天我们就用通俗+细节+面试思路,帮你搞定这道题。
学完这篇,你不仅能在面试中答得面试官连连点头,还能顺便装个逼:
“这个过程啊,就像你点了一份外卖,从你下单到吃进嘴里,中间可是一条技术长河。”
一、场景复盘:你敲下一个 URL,浏览器在忙什么?
我们用一个例子:
你输入
https://example.com,然后回车。
浏览器这条小船立刻起航,驶向网页大陆。
Step 1:浏览器解析 URL
- 协议(
https):告诉浏览器用哪种语言和服务器对话(HTTP/HTTPS)。 - 域名(
example.com):告诉浏览器要找哪家“饭店”。 - 端口(https 默认 443):相当于饭店的后门号。
- 路径和参数:告诉服务员你要点的菜(具体资源)。
Step 2:DNS 解析
浏览器去找 DNS 问路:
- 本地缓存(上次来吃饭还记得地址吗?)
- 系统缓存(操作系统问问自己记不记得)
- 路由器缓存(家门口的大爷)
- 运营商 DNS 服务器(小区居委会)
- 权威 DNS 服务器(菜馆总部)
最终拿到 IP:就是饭店的真实门牌号。
Step 3:建立 TCP 连接(三次握手)
像约会一样的确认流程:
- 我(客户端):“在吗?”(SYN)
- 对方(服务器):“在,听得见!”(SYN+ACK)
- 我:“好,那我开始说了!”(ACK)
如果是 HTTPS,还得来一套 TLS 握手(交换公钥、对称密钥),确保你们的对话不被偷听。
Step 4:发送 HTTP 请求
- 浏览器把请求行、请求头、Cookie、可能还有请求体发过去。
- Cookie 就像你上次吃饭留下的小纸条,告诉服务员“我就是上次那位”。
- Authorization 头是你的 VIP 卡(比如 JWT)。
Step 5:服务器处理 & 返回响应
服务员(后端):
- 接单(路由匹配)。
- 看你有没有资格吃这道菜(鉴权)。
- 厨房(业务逻辑)炒菜。
- 装盘(序列化成 HTML/CSS/JS/json)。
- 送回给你(响应报文 + 状态码: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:渲染(浏览器的化妆舞会)
- CSS Parser:生成 CSSOM(样式树)。
- 合并 DOM + CSSOM → Render Tree(只留可见元素)。
- Layout(排版):算每个元素的大小和位置。
- Paint(绘制):涂上颜色、阴影、背景。
- Composite(合成):把所有图层组合到屏幕上。
Step 8:执行 JS(可能改动 DOM)
-
如果 JS 改了 DOM 或样式,可能触发:
- Reflow(回流) :重新计算布局。
- Repaint(重绘) :重新涂色(便宜点)。
-
回流比重绘贵,所以面试官喜欢问“怎么减少回流?”(批量 DOM 修改、用
documentFragment、避免频繁改样式)。
二、为什么 <script> 会卡页面?
当 HTML 解析器遇到:
<script src="a.js"></script>
它会:
- 停下手里的积木活。
- 去下脚本。
- 回来执行脚本。
- 再继续堆积木。
这就叫 阻塞解析——首屏卡顿的元凶之一。
三、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 可以多路复用减少延迟,配合预加载、预连接和缓存策略进一步优化性能。”
总结
这道题是前端面试中的“永恒之题”,越能讲出细节、越能结合实际优化点,你在面试官心中的形象就越专业。记住——不是背八股,是用生活化+技术细节打动面试官。