学完本章,你能完整回答前端面试的经典问题「从输入 URL 到页面显示发生了什么」,能独立配置缓存策略,能说清跨域和安全的底层原理。这是从「会用浏览器」到「懂浏览器」的转折点。
现代浏览器为什么快、为什么一个页面崩溃不影响其他页面——答案是进程隔离。
Chrome 是多进程浏览器,主要进程:
| 进程 | 职责 | 关键点 |
|---|---|---|
| 浏览器主进程 | 界面、标签页管理、网络请求 | 负责与操作系统交互 |
| 渲染进程(每标签页) | HTML/CSS/JS 解析与渲染 | 包含主线程、合成线程等;沙箱隔离 |
| GPU 进程 | 图形处理 | 合成加速、3D 渲染 |
| 网络进程 | 网络资源加载 | 统一管理请求 |
| 插件进程 | 运行插件 | 隔离,防止插件拖垮浏览器 |
这也是阶段二事件循环的「物理载体」:主线程跑同步代码和微任务,宏任务从事件队列取。
这条主线串起网络、缓存、渲染、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
前端开发每天都和 HTTP 打交道,这些基础必须烂熟。
// 请求(请求行 + 请求头 + 请求体)
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 | 服务器错 / 网关错 / 服务不可用 / 超时 |
| 方法 | 语义 | 特点 |
|---|---|---|
| GET | 获取资源 | 参数在 URL,有长度限制,会被缓存/历史记录 |
| POST | 提交数据 | 参数在请求体,无长度限制,不缓存 |
| PUT / PATCH | 整体替换 / 部分更新 | RESTful 风格 |
| DELETE | 删除资源 | RESTful 风格 |
| OPTIONS | 预检请求 | CORS 跨域时自动发出 |
| HEAD | 只要响应头 | 检测资源是否存在 |
缓存是性能优化性价比最高的一环,也是面试高频考点。
// 服务器在响应头里返回,浏览器下次直接用缓存,不发请求
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 取代
max-age 优先级高于 Expires。// 第一次请求:服务器返回资源 + 标识
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 + 新资源
max-age=31536000),文件变了哈希变,URL 变自动拉新。HTML:no-cache 每次协商,保证拿到最新入口。这套策略是「版本更新」的最佳实践。
协议演进史就是性能与安全的历史。
HTTP/3 更进一步:基于 UDP(QUIC),解决了 TCP 层的队头阻塞,连接建立更快(0-RTT),弱网表现更好。
存数据选哪个?容量、生命周期、场景是关键。
| 方案 | 容量 | 生命周期 | 特点 | 典型场景 |
|---|---|---|---|---|
| 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 包裹
跨域是前端开发每天都要处理的现实问题,原理必须清楚。
「源」= 协议 + 域名 + 端口,三者完全相同才算同源。浏览器出于安全,默认禁止跨源读取资源。判断例子:
// 页面在 https://a.com:443/index.html
https://a.com/api // ✅ 同源
https://a.com:8080/api // ❌ 端口不同
http://a.com/api // ❌ 协议不同
https://b.com/api // ❌ 域名不同
核心思路:服务器在响应头里「批准」某个源可以访问。浏览器看到许可就放行。
// 服务器返回的响应头(关键就这一行)
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 不能是 *)
安全不是安全团队的专属话题,前端的每一行代码都可能是入口。
攻击者把恶意脚本注入页面,脚本在受害者浏览器里执行,可偷 Cookie、伪造操作、窃取数据。
// 反射型/存储型:把用户输入当 HTML 输出
// ❌ 危险:用户在评论区输入 <script>偷Cookie</script>,被执行
comment.innerHTML = userInput;
// ✅ 安全:用 textContent,内容只当纯文本
comment.textContent = userInput;
| 类型 | 原理 | 例子 |
|---|---|---|
| 反射型 | 恶意脚本藏在 URL 参数里,一次性 | ?search=<script>... |
| 存储型 | 恶意脚本存到服务器,所有访问者中招 | 评论区、昵称 |
| DOM 型 | 脚本在客户端由 DOM 操作注入 | innerHTML 拼接 |
Content-Security-Policy,只允许指定来源的脚本执行。攻击者诱导你点开一个恶意页面,该页面偷偷向你的目标网站发请求——浏览器自动带上你的 Cookie,服务器以为是你在操作。
// 攻击页面里藏着一个自动发出的请求:
<img src="https://bank.com/api/transfer?to=黑客&amount=10000">
// 你的 Cookie 会自动带上,服务器以为是你的操作!
SameSite=Lax/Strict,跨站请求不携带(现代浏览器默认 Lax,效果最好)。本章以理解为主,但也要动手验证。
打开自己阶段一的个人主页,用 DevTools 的 Network 面板:① 逐个资源看加载时间、缓存命中情况;② 用 Performance 面板录制加载过程,找到关键渲染路径上的阻塞资源;③ 用 Lighthouse 打分并记录优化前后对比。把分析写成一份报告。
用流程图软件或手绘,画出完整链路(DNS → 连接 → 请求缓存 → 响应 → 解析 → 渲染树 → 布局 → 绘制 → 合成),每步标注「谁能优化、怎么优化」。这份笔记未来面试前复习,价值极高。
① 本地起两个端口互相请求,观察跨域报错;② 用 vite 的 proxy 配置解决开发期跨域;③ 用 Node 写一个带 CORS 头的接口,验证预检请求 OPTIONS 的完整流程。
本章核心是「能讲清楚」,每题都试着讲给别人听。