http/2 push 在现代浏览器中已完全失效,chrome 96+、firefox 90+、edge 96+ 彻底移除 push_promise 处理逻辑,推送字节流被静默丢弃;应改用 rel="preload" 和内联关键 css。

HTTP/2 Push 在现代浏览器中已完全失效
你配了 http2_push、写了 Link: ; rel=preload; as=style,甚至在 chrome://net-internals/#http2 看到 PUSH_PROMISE 日志——但这些都不代表 CSS 真被提前加载了。Chrome 96+、Firefox 90+、Edge 96+ 已彻底移除对 PUSH_PROMISE 的处理逻辑,服务器推的字节流会被客户端静默丢弃,不进缓存、不触发解析、不改变资源加载时序。
为什么你还能看到“推送成功”的假象
常见误判点包括:
-
chrome://net-internals/#http2显示 PUSH_PROMISE —— 这只是服务器单方面发帧,浏览器早已不消费 - Wireshark 抓到
PUSH_PROMISE帧 —— TCP 层可见,但 HTTP/2 解帧后直接跳过 - Lighthouse 提示“启用 Server Push 可提升 FCP” —— 规则库未更新,截至 2026 年 5 月仍沿用过时建议
- Network 面板里找不到
Initiator: Push—— 因为根本没触发,所有 CSS 请求的 Initiator 都是Parser或script
真正有效的替代方案:rel="preload"
用 <link rel="preload" as="style" href="/main.css"> 替代所有服务端推送配置:
- 必须放在
中,且不能加onload、crossorigin等干扰属性(除非真需要跨域) - 路径必须是绝对路径,如
/static/main.css,相对路径(./main.css)会被忽略 - 它不执行 CSS,只预取;后续
<link rel="stylesheet">可复用该响应,避免二次请求 - 避免对非首屏 CSS 使用,否则会抢占带宽,拖慢关键资源
更优先的优化动作:内联关键 CSS
比起折腾已失效的推送机制,以下操作对首屏渲染影响更大、更确定:
- 提取首屏必需样式(按钮、导航、标题等),内联为
<style>...</style>,实现零网络延迟渲染 - 非关键 CSS 用
<link rel="preload" as="style" onload="this.rel='stylesheet'">异步加载 - 确认服务端启用了 Brotli 压缩、TLS 1.3、OCSP stapling —— 这些比 Push 实际有效得多
- 禁用 CSS 中的
@import,它强制串行加载,HTTP/2 下也破坏并行性
Server Push 不是“没配对”,而是协议支持已从浏览器中删除——这不是调参问题,是功能下线。把时间花在 rel="preload" 和 Critical CSS 提取上,才真正落在实处。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











