为什么关键CSS加载优先级不够高?

技术杏花 阅读 97

我在做首页性能优化时发现,虽然我把首屏样式内联了,但Lighthouse还是提示“移除阻塞渲染的资源”。我试过用 preload 加载关键 CSS 文件,但好像浏览器还是没把它当高优先级处理,这是为啥?

我的写法是这样的:

<head>
  <link rel="preload" href="/critical.css" rel="external nofollow"  rel="external nofollow"  as="style">
  <link rel="stylesheet" href="/critical.css" rel="external nofollow"  rel="external nofollow" >
</head>

是不是 preload 和 stylesheet 这样一起用反而有问题?或者我漏了什么属性?

我来解答 赞 17 收藏
二维码
手机扫码查看
2 条解答
Air-书娟
preload 和 stylesheet 一起用理论上没问题,但有时候浏览器的渲染机制会有点迷。你这样写是正确的,但可能还需要确保以下几点:

1. 确保 critical.css 真的是首屏渲染必要的样式,尽量减少文件大小。
2. 检查网络请求,确认 critical.css 是否被正确预加载,有没有被缓存导致预加载无效。
3. 确认没有其他 CSS 文件阻塞了渲染,有时候其他资源也会导致首屏渲染变慢。

你可以尝试给 link 标签加上 media 属性,比如这样:








这样可以确保 preload 的 CSS 在加载完成后才会应用,避免阻塞渲染。同时,
点赞
2026-03-20 23:19
Mr.雨橙
Mr.雨橙 Lv1
这个问题其实挺常见的,很多人在用preload优化CSS时都会踩这个坑。你的写法其实有个关键问题:preload和stylesheet同时加载同一个资源,浏览器可能会重复请求。

更靠谱的做法是直接用preload加载,然后在onload事件里改成stylesheet。我给你个优化后的代码:

<head>
<link rel="preload" href="/critical.css" as="style" onload="this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="/critical.css"></noscript>
</head>


另外检查下服务端是否正确设置了响应头的content-type为text/css,不然preload可能不会按预期工作。

还有个细节要注意,preload的as属性必须写对,你这里写的是style没问题,但很多人会漏掉这个。

如果还不行的话,可以试试把preload放在更靠前的位置,有时候浏览器对head里的资源加载顺序挺迷的。
点赞
2026-03-08 01:03