http/2 server push 已被主流浏览器废弃,应改用 link: rel=preload 实现资源预加载;需在 html 响应头或 head 中精准声明绝对路径与 as=style,配合关键 css 内联和 media 条件加载优化首屏性能。

HTTP/2 Server Push 在现代浏览器中已基本失效
Chrome 96+、Firefox 90+、Edge 100+ 都已移除对 HTTP/2 Server Push 的支持。不是配置不对,是协议层直接砍掉了——服务端再 push style.css,客户端会静默忽略,甚至可能触发 ERR_HTTP2_PROTOCOL_ERROR。
原因很实际:Push 无法感知缓存状态,容易重复推送;资源优先级难控制;与 preload 语义重叠且更不可控。所以现在谈“配置 Server Push 推 CSS”,本质是在维护一个被废弃的路径。
替代方案:用 Link: rel=preload 实现等效提前加载
这是目前最可靠、浏览器支持度最高(Chrome 50+、Firefox 46+、Safari 11.1+)、语义清晰的替代方式。它由 HTML 触发,浏览器能结合当前缓存、网络条件和渲染阶段做决策,不会瞎推。
- 在响应 HTML 的
headers中添加:Link: /style.css>; rel=preload; as=style - 或在 HTML
中写:<link rel="preload" href="/static/style.css" as="style"> -
as=style必须显式声明,否则浏览器不会复用该资源去解析 CSS,可能降级为fetch级别处理 - 避免对未使用的 CSS 路径 preload,否则会抢占带宽,反而拖慢首屏
Node.js(Express)里加 Link header 的典型写法
别用中间件全局加,只在返回 HTML 的路由里精准注入,避免污染其他响应类型(比如 JSON 或图片)。
app.get('/', (req, res) => {
res.set('Link', '/style.css>; rel=preload; as=style');
res.sendFile(path.join(__dirname, 'index.html'));
});
注意点:
-
Link值里的路径必须是绝对路径(以/开头),相对路径会被忽略 - 如果用了 CDN 或子路径部署(如
/myapp/),href需同步调整为/myapp/static/style.css - Express 4.16+ 支持
res.vary('Accept-Encoding')等配合,但和 preload 无直接关系,不用硬加
真正影响首屏样式的,其实是 CSS 加载时机和阻塞行为
即使 preload 成功,如果 style.css 文件过大、没启用 Brotli 压缩、或放在非 HTTP/2 连接上,效果也会打折扣。更关键的是:
- 把
<link rel="stylesheet">放在末尾,比放在开头略快(减少 parser blocking 时间) - 内联关键 CSS(Critical CSS)比任何 push/preload 都直接——它不依赖网络,立刻生效
- 用
media属性做条件加载,例如:<link rel="stylesheet" href="print.css" media="print">,避免阻塞渲染
Server Push 是个过时的“力气活”,而 preload + 关键 CSS 内联 + 合理 media 分离,才是现在真正在主线程里起作用的组合。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











