输入网址之后,浏览器到底做了什么?专业且好懂的“全流程讲解”
|
admin
2025年12月12日 22:41
本文热度 72
|
导读
把一次打开网页,想象成一段从“找路—取件—装配—上屏—互动—安保—回访”的流水线。本文用专业但不艰涩的方式,带你顺着这条线走一遍:每一步在做什么、为什么重要、能带来怎样的直观感受,以及顺手可用的小技巧。末尾附有权威延伸阅读,均可查证。
一、路线图(从回车到首屏)
- 找路和通道:DNS 把域名变成 IP,TLS 建安全通道,HTTP/2 或 HTTP/3 负责传输。
- 分工与隔离:多进程架构把页面、网络、GPU 分到不同“岗位”,互不拖累。
- 读图纸、备材料:解析 HTML/CSS 形成 DOM/CSSOM,并用预解析器提早下单关键资源。
- 装配与上色:布局(Layout)测量位置尺寸,绘制(Paint)上色,再交由 GPU 合成(Compositing)。
- 脚本与节奏:JavaScript 引擎执行代码,事件循环在一帧内协调渲染与输入;若目标是 60FPS60FPS,每帧只有约 16.67ms16.67ms 预算。
- 安全与围栏:同源策略、CORS、站点隔离与沙箱保障安全。
- 回头客体验:HTTP 缓存、
Service Worker 与 IndexedDB 让复访更快、离线可用。
二、关键机制拆解
1) 网络链路:DNS → TLS → HTTP/2/3
- 在做什么:定位服务器、建立加密通道,用支持多路复用的协议并行传输资源。HTTP/3 基于 QUIC,更抗丢包、建连更快。
- 举个栗子:像去餐厅——先找地址(DNS),过安检(TLS),再一次点多道菜并行上(HTTP/2/3)。
- 你会感受到:首屏快或慢、弱网是否“抖但不断”,二次访问是否更快(命中缓存)。
<link rel="preconnect" href="https://example.cdn">
[2] 合理使用 preload/fetchpriority 提升关键资源优先级。
2) 多进程与站点隔离:稳定与安全的底座
- 在做什么:
Browser 进程管全局;每个站点/标签多为独立 Renderer 进程;GPU、Network Service 各司其职;再配合操作系统级沙箱。 - 你会感受到:某页崩溃不影响其它页;恶意页面更难突破“围栏”。
3) 解析与预加载:边读边搭骨架
- 在做什么:HTML 构建 DOM,CSS 构建 CSSOM;两者合并为渲染树。预解析器会在解析过程中提前请求图片、样式等关键资源。
- 举个栗子:工人一边搭骨架,一边让物流先把材料运到工地。
- [1] 关键 CSS 前置;阻塞性 JS 延后执行。 [2] 使用
preload 告诉浏览器“这个很要紧,请预先加载”。
示例:
<link rel="preload" href="/css/critical.css" as="style" onload="this.rel='stylesheet'"><noscript><link rel="stylesheet" href="/css/critical.css"></noscript><script src="/js/app.js" defer></script>
4) 渲染流水线:布局 → 绘制 → 合成
- 在做什么:计算每个元素的几何信息(布局),绘制像素(绘制),将多个图层交给 GPU 合成(合成)。
transform/opacity 可走合成级动画,避开昂贵的重排/重绘。 - 举个栗子:先摆家具(布局),再上色(绘制),最后在舞台灯光下把布景叠起来(合成)。
- [1] 优先用
transform、opacity 做动画;必要时点到为止地用 will-change。
示例:
.card { will-change: transform; }.card:hover { transform: translateY(-4px); }
5) JavaScript 与事件循环:别占满主线程
- 在做什么:V8 等引擎 JIT 编译执行 JS,并进行 GC;事件循环在一帧内调度宏任务、微任务、样式计算、布局、绘制与输入。若目标 60FPS60FPS,每帧约 16.67ms16.67ms,长任务会让页面掉帧卡顿。
- 举个栗子:共享一个“出餐口”,JS 长时间占用,渲染与输入就只能排队。
- 顺手优化 - 将重计算放至
Web Worker;动画用 requestAnimationFrame;拆分长任务
示例:
function tick() { requestAnimationFrame(tick); }requestAnimationFrame(tick);const worker = new Worker('/heavy.js');worker.postMessage({ payload });worker.onmessage = ({ data }) => { };
6) 安全模型:同源、CORS、Site Isolation
- 在做什么:同源策略限制不同源间的读写;CORS 通过明确授权放行;站点隔离把不同站点放进不同进程并加沙箱。
- 举个栗子:小区围栏 + 门禁系统 + 不同单元楼。
- 你会感受到:有些“跨域”会被拦,但账号与数据更安全,问题页面也不易拖累其他标签。
7) 缓存与离线:让“回头客”更快
- 在做什么:依据
Cache-Control、ETag 等规则命中 HTTP 缓存;Service Worker 可拦截请求、预缓存关键资源,配合 IndexedDB 管理更大数据。 - 举个栗子:菜做成半成品,来就能热上桌;甚至停电(离线)也能端上基础套餐。
- 你会感受到:二次访问“秒开”,地铁无网也能用部分功能。
- [1] 正确设置缓存头;用
workbox 或手写 Service Worker 实现离线与预缓存。
示例:
<img src="/hero.jpg" fetchpriority="high" width="1200" height="600" alt="Hero"><img src="/gallery-1.jpg" loading="lazy" alt="Gallery">
三、原理到体验:一张“映射表”
四、常见误区与更好的做法
- “把所有 JS 放头部更保险”:实际上同步脚本会阻塞解析与渲染。优先使用
defer 或按需异步加载。 - “动画卡就加
will-change”:过度使用会增加内存与层开销。仅在动画开始前短暂启用。 - “图片先上,样式慢慢来”:样式缺席会阻塞渲染树合并,引发抖动和重排。保证关键 CSS 可用、图片设定明确尺寸避免布局跳动。
- “HTTP/2 万能并行,不用合并资源了”:虽不必盲目打包巨文件,但合理拆分与缓存仍重要;过多小文件在高延迟场景仍有成本。
五、把原理“用起来”的“三步诀”
- 看链路:DNS/TLS/协议与优先级,决定首屏速度。
- 看流水线:尽量让变化发生在合成阶段,减少布局/重绘。
- 看主线程:每帧预算约 16.67ms16.67ms,避免长任务,输入与渲染就能“跟手”。
六、延伸阅读(卷,就使劲卷)
- inside look at modern web browsers(Chrome 官方) - Part 1(多进程与导航):https://developer.chrome.com/blog/inside-browser-part1/ - Part 2(渲染管线):https://developer.chrome.com/blog/inside-browser-part2/ - Part 3(JS 与事件循环):https://developer.chrome.com/blog/inside-browser-part3/ - Part 4(数据存储):https://developer.chrome.com/blog/inside-browser-part4/
- How browsers work(Tali Garsiel & Paul Irish):https://web.dev/howbrowserswork/
- Critical Rendering Path:https://web.dev/critical-rendering-path/
- RenderingNG(Chrome 渲染架构):https://developer.chrome.com/blog/renderingng/
- Event Loop(MDN):https://developer.mozilla.org/docs/Web/JavaScript/Event_loop
- HTTP 缓存(MDN):https://developer.mozilla.org/docs/Web/HTTP/Caching
- Service Worker(MDN):https://developer.mozilla.org/docs/Web/API/Service_Worker_API
- Same-origin policy(MDN):https://developer.mozilla.org/docs/Web/Security/Same-origin_policy
- Site Isolation(Chromium):https://www.chromium.org/Home/chromium-security/site-isolation/
- HTTP/3(RFC 9114):https://www.rfc-editor.org/rfc/rfc9114
- QUIC(RFC 9000):https://www.rfc-editor.org/rfc/rfc9000
- 资源优先级与
fetchpriority:https://developer.chrome.com/articles/fetch-priority/ rel="preload"(MDN):https://developer.mozilla.org/docs/Web/HTML/Attributes/rel/preloadrequestAnimationFrame(MDN):https://developer.mozilla.org/docs/Web/API/window/requestAnimationFrame
结语
浏览器并不是“黑盒”,而是一条严谨而高效的生产线:网络把货送到门口,解析与预加载安排好物料,渲染流水线负责装配与上色,脚本与事件循环维持节奏,安全机制在旁护航,缓存与离线让“回头客”受益。理解这些原理,你能读懂“为什么这页快、那页慢”,也能写出既专业又体面的优化方案。下次按下回车,不妨想象幕后这场协作正在流畅地上演。
阅读原文:原文链接
该文章在 2025/12/13 8:57:26 编辑过