HTTP/2 服务端推送在现代浏览器中已完全失效,Chrome/Firefox/Safari 等主流浏览器自指定版本起均移除 PUSH_PROMISE 帧处理逻辑,实际发送的推送帧会被直接丢弃;rel="preload" 是唯一可靠替代方案,需正确配置 as 属性与位置以确保提前加载关键资源。

HTTP/2 服务端推送在现代浏览器中已完全失效,HTML 中无需、也不应做任何与 Server Push 相关的适配或预留。
Chrome/Firefox/Safari 都已静默忽略 PUSH_PROMISE 帧
Chrome 96+、Firefox 90+、Edge 96+、Safari 16.4+ 全部移除了对 PUSH_PROMISE 帧的实际处理逻辑。即使服务端发出了推送帧(Wireshark 或 nghttp 可抓到),浏览器也会直接丢弃——不进缓存、不触发解析、不显示在 Network 面板的 Initiator 列里为 Push。
常见错误现象包括:
- 开发者工具 Network 面板看不到被“推送”的 CSS/JS 资源
- 页面加载瀑布图中,
main.css仍显示为 HTML 解析后才发起 GET 请求 - 配置了
http2_push /main.css的 Nginx 日志无报错,但实际没效果
rel="preload" 是唯一可靠且语义明确的替代方案
它由浏览器自主调度,兼容所有主流版本,且能真正提前拉取资源、参与关键路径渲染。关键不是“写不写”,而是“怎么写对”:
立即学习“前端免费学习笔记(深入)”;
- 必须放在
<head>中,且早于对应<link rel="stylesheet">或<script> -
as属性不可省:<link rel="preload" as="style" href="/main.css">,否则默认按as="fetch"处理,不参与样式解析流程 - 字体需加
crossorigin:<link rel="preload" as="font" href="/heading.woff2" crossorigin>,否则加载失败 - 避免对非首屏 JS/CSS 使用,否则抢占带宽,反而拖慢 FCP
服务端配置 http2_push 或 Link 响应头的实际后果
这些配置不再带来性能收益,只增加确定的开销:
- Nginx 的
http2_push /main.css会多发约 150 字节PUSH_PROMISE帧,纯属 TCP 浪费 - PHP 输出
header('Link: ; rel=preload; as=style'),浏览器收到后静默丢弃,无日志、无 fallback - Node.js 调用
stream.pushStream()发送资源,客户端 stream 状态为idle,数据被内核直接丢弃 - Lighthouse 若仍提示“启用 Server Push”,说明其规则库未更新(截至 2026 年 6 月)
真正影响首屏速度的是:内联关键 CSS(控制在 ~14KB 内)、rel="preload" 加载首屏字体与图片、defer 非关键 JS、TLS 1.3 与 Brotli 是否启用——Server Push 不是调优项,是该清理的历史配置。



















