一道面试题,开始性能优化之旅(1)-- beforeFetch

十一闲来无事,最近看了一本关于前端性能的书,而真的看懂一本书的标准就是能用自己的话说明白书中的知识,所以我想来总结一下,但是性能优化又是一个庞杂的话题,该如何说起呢?直到我看到了这道面试题,一道我们再熟悉不过的面试题:

从输入url到页面展示,这个过程中做了什么

一张图直观告诉你答案

图1-1

其实之前遇到这道题,我多半会从浏览器开始解析html开始算起,忽略从navigationStart到responseEnd 流程,我也一直对这段知识盲区视而不见,但是我能感觉到,面试官其实对我的回答并不满意,逃避不是办法,那么我们就来看看每个阶段都做了些啥, **它们又是如何影响前端性能的**

fetchStart

重定向

从上图中我们清晰的看到从 navigationStart 到 fetchStart 有一个 redirect 流程,这就是重定向

重定向流程不赘述了,就是下图所示

图2-1

需要重定向场景

登录鉴权

对于未登录用户,服务端返回301 通知浏览器跳到登陆页 但是就本人的开发经验,对于未登录的跳转,多半是由前端直接控制,不再受限于 重定向实现

强制HTTPS和主域名跳转 / 短链 / 站外引流

这三种情况,本人实际工作中都真实经历过,当时并没有觉得会对性能有什么影响,通过学习,发现重定向确实会对首屏性能有甚至翻倍的影响

重定向对首屏时间的影响

其实通过图 2-1,我们也能清楚的看到 经过301/302 相当于多了一个请求---响应的耗时,看似不经意的一次重定向使整个访问时间几乎翻倍。

为什么会有翻倍的影响呢?

  1. "多了一个请求---响应的耗时" (核心原因):
    • 如之前解释,重定向(无论是 301 还是 302)强制客户端进行两次完整的 HTTP 事务
      • 第一次事务: 请求原始 URL -> 服务器返回 302 + Location (新 URL)。
      • 第二次事务: 请求新 URL -> 服务器返回最终内容 (200 OK)。
    • 每一次 HTTP 事务都包含以下耗时环节(尤其是在网络条件不佳时):
      • DNS 解析: 将域名解析为 IP 地址(可能发生两次,如果新旧 URL 域名不同)。
      • TCP 连接建立: "三次握手"(可能发生两次,如果新旧 URL 是不同服务器或需要新连接)。
      • TLS 握手: 如果使用 HTTPS,建立安全连接(可能发生两次)。
      • 请求发送: 客户端发送 HTTP 请求数据到服务器。
      • 服务器处理: 服务器处理请求(即使是返回重定向,也需要消耗 CPU 和 I/O 资源)。
      • 响应传输: 服务器将响应数据(即使是小的重定向响应)传回客户端。
      • 客户端处理: 客户端接收、解析响应,并根据 Location 头发起新请求。
    • 所有这些环节的耗时在重定向过程中都会至少增加一倍。

重定向对首屏时间的影响的实际案例

问题重现:Bing 的重定向链条

通过 http://bing.com 访问时,实际发生了 两次重定向(而非理想的一次):

  1. 第一次重定向
    http://bing.com302 FoundLocation: https://bing.com
    (强制升级 HTTPS,但未跳转到规范域名)
  2. 第二次重定向
    https://bing.com302 FoundLocation: https://www.bing.com
    (跳转到带 www 的规范域名)

步骤 耗时环节
初始请求 DNS 解析 bing.com + TCP 握手 + TLS 握手(失败,因 HTTP 明文)
第一次重定向 服务器响应 302(约 1 RTT)
第二次请求 DNS 解析 bing.com(可能复用) + TCP 握手 + 完整 TLS 握手(HTTPS)
第二次重定向 服务器响应 302(约 1 RTT)
第三次请求 DNS 解析 www.bing.com + TCP 握手 + TLS 握手 + 最终内容传输

关键性能损耗

  • ⚠️ 额外增加 2 次 RTT(Round Trip Time)
  • ⚠️ 重复的 TLS 握手(第二次请求需完整握手)
  • ⚠️ DNS 解析可能无法复用(若本地无缓存)
  • ⚠️ 浏览器并发连接数限制(Chrome 默认同域 6 个,重定向占用配额)

为什么 Bing 未优化?

  1. 历史遗留架构
    早期域名可能独立部署,未统一收敛到 www
  2. 跨团队协作成本
    HTTPS 升级与域名规范化可能由不同团队负责,未协同优化。
  3. 忽略性能影响
    在低延迟环境下(如美国本土),额外 200-300ms 不易被感知,但全球用户影响显著。

如何优化?

◆ 避免使用短链
  1. 首选方案
    避免短链 - 邮件中直接使用HTTPS终极链接
diff 复制代码
  # 邮件原始内容
- 促销链接:http://short.url/SUMMER2023
+ 促销链接:https://www.example.com/campaigns/summer2023
◆ 合并重定向
  1. 次选方案
    合并重定向 - 配置短链直跳HTTPS

    nginx 复制代码
    location /s/ { return 302 https://$host$request_uri; }
◆ 重定向逻辑前置
  1. 妥协方案
    重定向逻辑前置 - JS预解析短链

    javascript 复制代码
    // 在点击时静默解析真实地址

冷启动 -- 端外引流场景

问题本质:性能监控的时间线污染
plaintext 复制代码
外部应用点击 → 启动浏览器进程 → 创建标签页 → 发起请求 (此时才开始前端性能监控)

致命问题 :浏览器冷启动时间(200ms~2000ms)被错误计入前端性能指标中的 navigationStartfetchStart 阶段。

总结

以上,对于 beforeFetch(navigationStartfetchStart的阶段),如果beforeFetch阶段明显增加,我们可以优先考虑是不是有重定向行为或者端外引流的场景导致冷启动,问题定位后,解决也就是水到渠成的事了

相关推荐
Elieal10 分钟前
AJAX 知识
前端·ajax·okhttp
九皇叔叔22 分钟前
Java循环结构全解析:从基础用法到性能优化
java·开发语言·性能优化
sulikey30 分钟前
Qt 入门简洁笔记:从框架概念到开发环境搭建
开发语言·前端·c++·qt·前端框架·visual studio·qt框架
烛阴1 小时前
循环背后的魔法:Lua 迭代器深度解析
前端·lua
元拓数智1 小时前
现代前端状态管理深度剖析:从单一数据源到分布式状态
前端·1024程序员节
mapbar_front1 小时前
Electron 应用自动更新方案:electron-updater 完整指南
前端·javascript·electron
天一生水water2 小时前
three.js加载三维GLB文件,查看三维模型
前端·1024程序员节
无风听海2 小时前
HarmonyOS之启动应用内的UIAbility组件
前端·华为·harmonyos
冰夏之夜影2 小时前
【科普】Edge出问题后如何恢复出厂设置
前端·edge
葱头的故事3 小时前
vant van-uploader上传file文件;回显时使用imageId拼接路径
前端·1024程序员节