首页  |  学习总览  |  ← 上一章:JavaScript 核心 阶段三 · 第 3 章,共 10 章
阶段三 · 预计 80 小时

浏览器原理与网络 —— 页面如何运行

学完本章,你能完整回答前端面试的经典问题「从输入 URL 到页面显示发生了什么」,能独立配置缓存策略,能说清跨域和安全的底层原理。这是从「会用浏览器」到「懂浏览器」的转折点。

1浏览器架构:多进程模型

现代浏览器为什么快、为什么一个页面崩溃不影响其他页面——答案是进程隔离。

1.1 进程与线程

  • 进程:程序运行的最小资源单位,有独立的内存空间。一个进程崩了不影响其他进程。
  • 线程:进程内的执行单元,同一进程的线程共享内存。

Chrome 是多进程浏览器,主要进程:

进程职责关键点
浏览器主进程界面、标签页管理、网络请求负责与操作系统交互
渲染进程(每标签页)HTML/CSS/JS 解析与渲染包含主线程、合成线程等;沙箱隔离
GPU 进程图形处理合成加速、3D 渲染
网络进程网络资源加载统一管理请求
插件进程运行插件隔离,防止插件拖垮浏览器
💡 为什么要多进程? ① 稳定性:一个标签页崩溃不影响其他标签;② 安全性:沙箱隔离,网页代码不能直接访问系统;③ 性能:多核 CPU 并行。代价是内存占用高——这是浏览器的经典取舍。

1.2 渲染进程内部的关键线程

  • 主线程:解析 HTML/CSS、执行 JS、布局、绘制——JS 在这里跑,所以 JS 卡顿会卡住渲染。
  • 合成线程:把图层拼合成最终画面,transform/opacity 动画在这里做,不占主线程。
  • 事件触发线程:管理事件队列。
  • 定时器线程:管理 setTimeout 计时(JS 线程忙时定时器会被推迟)。

这也是阶段二事件循环的「物理载体」:主线程跑同步代码和微任务,宏任务从事件队列取。

2从输入 URL 到页面显示(面试必考主线)

这条主线串起网络、缓存、渲染、JS 执行的全过程。

2.1 完整流程(八步)

① 输入 URL
② DNS 解析
③ 建立连接
TCP/HTTPS
④ 发请求
查缓存
⑤ 服务器响应
⑥ 解析 HTML
⑦ 构建渲染树
⑧ 布局绘制合成
  1. 输入 URL:地址栏判断是网址还是搜索词。
  2. DNS 解析:把域名翻译成服务器 IP(先查本地缓存,再逐级向上查询)。
  3. 建立连接:TCP 三次握手 + HTTPS 的 TLS 握手(加密通道协商)。
  4. 发送请求:浏览器先查本地缓存,命中则直接使用,不发请求。
  5. 服务器响应:返回 HTML(含状态码 200/304 等)。
  6. 解析 HTML:构建 DOM 树,遇到 CSS 构建 CSSOM,遇到 JS 先下载执行(可被 defer/async 改变)。
  7. 构建渲染树:DOM + CSSOM 合并,剔除 display:none 等不可见节点。
  8. 布局 → 绘制 → 合成:计算每个节点位置(布局)、画出像素(绘制)、分层合成(合成)。

2.2 解析 HTML 的细节:为什么 JS 会阻塞

<!-- 普通 script:会阻塞 HTML 解析,先下载并执行完才继续 -->
<script src="a.js"></script>

<!-- defer:并行下载,但等 HTML 解析完才执行(按顺序)-->
<script defer src="a.js"></script>

<!-- async:并行下载,下载完立即执行(不保证顺序)-->
<script async src="a.js"></script>

// 推荐:普通脚本放 body 底部,或使用 defer
⚠️ CSS 也会阻塞渲染 浏览器要等 CSSOM 构建完才开始渲染,所以 CSS 放 head、JS 放底部(或用 defer/async)。这就是「关键渲染路径」优化——首屏前越少的阻塞资源越好。

2.3 回流(Reflow)与重绘(Repaint)

  • 回流:元素尺寸、位置变了,浏览器要重新计算布局(最贵)。触发:改 width/height/margin/padding、增删 DOM、窗口缩放。
  • 重绘:样式变了但布局没变,只重新绘制(较便宜)。触发:改 color/background。
  • 合成:transform/opacity 变化只触发合成(最便宜,GPU 处理,不占主线程)。
✅ 避免回流的实战建议 ① 用 transform 代替 top/left 动画;② 批量修改 DOM(用 DocumentFragment 或一次性 innerHTML);③ 读布局属性(offsetHeight 等)会强制刷新渲染队列,避免在循环里读;④ 使用 will-change 或 transform 提升图层。
3HTTP 协议基础

前端开发每天都和 HTTP 打交道,这些基础必须烂熟。

3.1 请求与响应结构

// 请求(请求行 + 请求头 + 请求体)
POST /api/login HTTP/1.1              // 方法 路径 版本
Host: example.com
Content-Type: application/json
Authorization: Bearer <token>

{"username":"zhangsan","password":"***"}

// 响应(状态行 + 响应头 + 响应体)
HTTP/1.1 200 OK                       // 版本 状态码 原因短语
Content-Type: application/json
Cache-Control: max-age=3600

{"token":"eyJ..."}

常用状态码(必须脱口而出)

范围代表含义
2xx 成功200 / 201 / 204成功 / 创建成功 / 无内容
3xx 重定向301 / 302 / 304永久重定向 / 临时重定向 / 缓存未修改
4xx 客户端错误400 / 401 / 403 / 404 / 429参数错 / 未登录 / 无权限 / 不存在 / 请求过频
5xx 服务端错误500 / 502 / 503 / 504服务器错 / 网关错 / 服务不可用 / 超时

3.2 请求方法

方法语义特点
GET获取资源参数在 URL,有长度限制,会被缓存/历史记录
POST提交数据参数在请求体,无长度限制,不缓存
PUT / PATCH整体替换 / 部分更新RESTful 风格
DELETE删除资源RESTful 风格
OPTIONS预检请求CORS 跨域时自动发出
HEAD只要响应头检测资源是否存在
⚠️ 语义差异 GET 是「读」,POST 是「写」。不要用 GET 做删除等有副作用的操作——会被爬虫、预加载、缓存影响。
4HTTP 缓存(性能的关键)

缓存是性能优化性价比最高的一环,也是面试高频考点。

4.1 强缓存:不请求服务器

// 服务器在响应头里返回,浏览器下次直接用缓存,不发请求
Cache-Control: max-age=3600          // 1 小时内直接用缓存
Cache-Control: no-cache              // 每次都要重新验证(协商)
Cache-Control: no-store              // 完全不缓存
Expires: Wed, 21 Oct 2026 07:28:00 GMT // 老方案,HTTP/1.0,已被 Cache-Control 取代
  • 命中强缓存:状态码 200(from memory/disk cache),无网络请求。
  • max-age 优先级高于 Expires

4.2 协商缓存:问服务器还新不新

// 第一次请求:服务器返回资源 + 标识
ETag: "abc123"                        // 内容的指纹(优先级高)
Last-Modified: Wed, 19 Aug 2026 08:00:00 GMT  // 最后修改时间

// 第二次请求:浏览器带上标识问服务器
If-None-Match: "abc123"               // 对应 ETag
If-Modified-Since: Wed, 19 Aug 2026 08:00:00 GMT  // 对应 Last-Modified

// 服务器判断:没变 → 返回 304(无响应体),浏览器用缓存
// 变了 → 返回 200 + 新资源
💡 经典缓存策略(背下来) 静态资源(JS/CSS/图片):文件名带内容哈希(如 app.a1b2c3.js)+ 长缓存(max-age=31536000),文件变了哈希变,URL 变自动拉新。HTML:no-cache 每次协商,保证拿到最新入口。这套策略是「版本更新」的最佳实践。
5HTTPS、HTTP/2 与 HTTP/3

协议演进史就是性能与安全的历史。

5.1 HTTPS:加密的 HTTP

  • HTTP 明文传输,内容可被窃听、篡改、冒充。HTTPS = HTTP + TLS(加密层)。
  • 混合加密:非对称加密(RSA/ECC)安全交换密钥 → 对称加密(AES)高效传输数据。
  • 证书的作用:证明「这个网站是真的」——CA 机构签发,浏览器内置信任根。

5.2 HTTP/2 的关键改进

  • 多路复用:一个连接并发多个请求,解决 HTTP/1.1 的队头阻塞(一个请求卡住后面全卡)。
  • 头部压缩(HPACK):重复的请求头大幅压缩。
  • 二进制分帧:数据以二进制帧传输,更高效。
  • 服务端推送:服务器主动推资源(实际用处有限)。

HTTP/3 更进一步:基于 UDP(QUIC),解决了 TCP 层的队头阻塞,连接建立更快(0-RTT),弱网表现更好。

6浏览器存储方案

存数据选哪个?容量、生命周期、场景是关键。

方案容量生命周期特点典型场景
Cookie约 4KB可设置过期;关浏览器不一定消失每次请求自动携带;可被 JS 读(可设 HttpOnly 防读)会话标识(登录态)
localStorage约 5MB永久,需手动清同步 API;只能存字符串主题、偏好、长期缓存
sessionStorage约 5MB标签页关闭即清同步 API;标签页隔离表单草稿、页内临时数据
IndexedDB大(数百 MB+)永久异步 API;对象存储;支持索引与事务离线数据、大文件、复杂结构化数据
// localStorage 使用(只能存字符串,对象要 JSON 序列化)
localStorage.setItem("theme", "dark");
const theme = localStorage.getItem("theme");   // "dark"
localStorage.removeItem("theme");
// 存对象:JSON.stringify / JSON.parse 包裹
⚠️ Cookie 的坑 Cookie 每次请求都自动带上,4KB 虽小但积累多了会拖慢所有请求。登录态放 Cookie(HttpOnly + Secure + SameSite),业务数据尽量用 localStorage/IndexedDB。
7跨域:同源策略与 CORS

跨域是前端开发每天都要处理的现实问题,原理必须清楚。

7.1 同源策略

「源」= 协议 + 域名 + 端口,三者完全相同才算同源。浏览器出于安全,默认禁止跨源读取资源。判断例子:

// 页面在 https://a.com:443/index.html
https://a.com/api        // ✅ 同源
https://a.com:8080/api   // ❌ 端口不同
http://a.com/api         // ❌ 协议不同
https://b.com/api        // ❌ 域名不同

7.2 CORS(跨域资源共享):正规的解法

核心思路:服务器在响应头里「批准」某个源可以访问。浏览器看到许可就放行。

// 服务器返回的响应头(关键就这一行)
Access-Control-Allow-Origin: https://a.com   // 允许哪个源;* 表示任意源

// 复杂请求(自定义头、非简单方法)会先发 OPTIONS 预检
// 服务器回应:
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Allow-Credentials: true      // 允许携带 Cookie(此时 Origin 不能是 *)
⚠️ 常见误解 跨域报错是「浏览器拦截」——请求其实发出去了,服务器也处理了,只是浏览器不让 JS 读取响应。所以 CORS 是服务器配合的,前端改不了。开发期用代理(vite/webpack proxy)转发请求绕过,生产期必须服务器配 CORS。

其他跨域方案

  • JSONP:用 script 标签不受同源限制的漏洞,只支持 GET,老方案。
  • 代理:开发期用构建工具代理,生产期用 Nginx 反向代理,把跨域请求变成同源。
  • postMessage:iframe 间跨源通信。
8前端安全:XSS 与 CSRF

安全不是安全团队的专属话题,前端的每一行代码都可能是入口。

8.1 XSS(跨站脚本攻击)

攻击者把恶意脚本注入页面,脚本在受害者浏览器里执行,可偷 Cookie、伪造操作、窃取数据。

// 反射型/存储型:把用户输入当 HTML 输出
// ❌ 危险:用户在评论区输入 <script>偷Cookie</script>,被执行
comment.innerHTML = userInput;

// ✅ 安全:用 textContent,内容只当纯文本
comment.textContent = userInput;

三类 XSS

类型原理例子
反射型恶意脚本藏在 URL 参数里,一次性?search=<script>...
存储型恶意脚本存到服务器,所有访问者中招评论区、昵称
DOM 型脚本在客户端由 DOM 操作注入innerHTML 拼接

防御三板斧

  1. 转义输出:所有用户内容按纯文本处理(textContent / 框架自带转义如 React 默认转义)。
  2. CSP(内容安全策略):服务器设 Content-Security-Policy,只允许指定来源的脚本执行。
  3. Cookie 加 HttpOnly:脚本读不到 Cookie,偷了也没用。

8.2 CSRF(跨站请求伪造)

攻击者诱导你点开一个恶意页面,该页面偷偷向你的目标网站发请求——浏览器自动带上你的 Cookie,服务器以为是你在操作。

// 攻击页面里藏着一个自动发出的请求:
<img src="https://bank.com/api/transfer?to=黑客&amount=10000">
// 你的 Cookie 会自动带上,服务器以为是你的操作!

防御三板斧

  1. SameSite Cookie:Cookie 设 SameSite=Lax/Strict,跨站请求不携带(现代浏览器默认 Lax,效果最好)。
  2. CSRF Token:表单里带服务器下发的随机 token,攻击页面拿不到。
  3. 验证请求来源:服务器校验 Origin/Referer 头。
9实战项目(通关必做)

本章以理解为主,但也要动手验证。

项目一:性能面板实战分析

打开自己阶段一的个人主页,用 DevTools 的 Network 面板:① 逐个资源看加载时间、缓存命中情况;② 用 Performance 面板录制加载过程,找到关键渲染路径上的阻塞资源;③ 用 Lighthouse 打分并记录优化前后对比。把分析写成一份报告。

项目二:手写「从输入 URL 到页面显示」图文笔记

用流程图软件或手绘,画出完整链路(DNS → 连接 → 请求缓存 → 响应 → 解析 → 渲染树 → 布局 → 绘制 → 合成),每步标注「谁能优化、怎么优化」。这份笔记未来面试前复习,价值极高。

项目三:跨域实战

① 本地起两个端口互相请求,观察跨域报错;② 用 vite 的 proxy 配置解决开发期跨域;③ 用 Node 写一个带 CORS 头的接口,验证预检请求 OPTIONS 的完整流程。

10通关自检题

本章核心是「能讲清楚」,每题都试着讲给别人听。

1. 完整说出「从输入 URL 到页面显示」的 8 个步骤

2. 浏览器为什么用多进程模型?三个好处分别是什么?

3. script 的 defer 和 async 有什么区别?

4. 回流和重绘的区别?哪些属性变化只触发合成?

5. 说出 200 / 301 / 304 / 401 / 403 / 404 / 500 / 502 的含义

6. 强缓存和协商缓存的区别?各自的响应头是什么?

7. 静态资源的经典缓存策略是什么?为什么文件名要带哈希?

8. Cookie / localStorage / sessionStorage / IndexedDB 的对比(容量、生命周期、场景)

9. 什么是同源策略?跨域报错是浏览器还是服务器的问题?CORS 怎么解决?

10. 预检请求是什么?什么情况下会触发?

11. XSS 三种类型的区别?防御手段有哪些?

12. CSRF 的攻击原理?SameSite Cookie 为什么能防住它?

13. HTTPS 的加密原理?为什么需要证书?

14. HTTP/2 解决了 HTTP/1.1 的什么问题?

✅ 全部通关? 你已经具备「页面运行原理」的完整认知。下一阶段《工程化与构建》将进入工具链的世界——Vite、Webpack、Git、TypeScript,把你的知识变成生产力。