唯一真正非阻塞的css加载方式是rel="preload" as="style"配合onload动态注入,因其提前请求且不解析、不阻塞渲染,仅在onload后切换为stylesheet才生效,兼顾性能与兼容性。

as 属性本身不能让 <style></style> 无阻塞——它根本不适用于 <style></style> 标签。
浏览器规范里,as 是 <link rel="preload"> 的专属属性,只用于提示预加载资源的类型,比如:
<link rel="preload" href="main.css" as="style">
但注意:这行代码不会把 CSS 变成非阻塞,它只是告诉浏览器“请尽快下载这个 CSS”,而该 CSS 后续仍会以标准方式参与 CSSOM 构建,依然阻塞渲染(只要 media 匹配)。
<link rel="stylesheet"> 怎么才算“无阻塞”?
真正能绕过阻塞的只有两种合法路径:
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
-
使用不匹配当前设备的
media属性,例如:-
<link rel="stylesheet" href="print.css" media="print">→ 不阻塞页面渲染 -
<link rel="stylesheet" href="mobile.css" media="(max-width: 767px)">→ 在桌面端不阻塞
-
-
把
rel="stylesheet"换成rel="preload"+ JS 动态注入(手动控制时机):<link rel="preload" href="async.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
⚠️ 注意:
onload在部分旧浏览器(如 Safari
为什么不能给 <style></style> 加 as 或 async?
-
<style></style>是内联样式块,天生同步解析、同步阻塞 HTML parser; - 它没有
src,不走网络请求,as对它无意义; - 它不支持
async、defer、crossorigin等脚本/链接专属属性; - 所有浏览器遇到
<style></style>都会立即暂停 HTML 解析,构建 CSSOM。
常见错误现象
- 写了
<style as="style">...</style>→ 浏览器直接忽略as,无报错但毫无作用; - 把
<link rel="stylesheet">放在<script></script>后面 → CSS 仍阻塞,JS 反而可能因 DOM 尚未就绪而执行失败; - 用
@import在<style></style>里加载外部 CSS → 额外阻塞、无法并行、无缓存、验证失败。
关键点就一个:<style></style> 没有“无阻塞”模式,它的存在本身就是阻塞前提。
想减少阻塞,唯一靠谱做法是——把非首屏、非关键样式抽离为 media 不匹配的 <link>,或用 JS 控制注入时机。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










