关键css必须内联首屏必需样式,如导航栏背景、标题字号、按钮尺寸等,禁用@import和url(),置于顶部,体积≤14kb,且需人工验证禁用网络后首屏是否正常显示。

关键CSS必须内联,但不是所有内联都算“关键”——只有首屏渲染必需的样式才该放进<style></style>标签,且不能带@import、不能引用外部文件、不能依赖JavaScript执行。
哪些CSS算“关键”?
判断标准只有一个:没有它,首屏文字/按钮/布局会明显闪烁、错位或不可用。比如导航栏背景色、标题字号、按钮基础尺寸、栅格容器宽度。
- 字体加载前的 fallback 字体声明(
font-family: system-ui, sans-serif;)属于关键 -
@font-face定义本身不算关键,但其font-display: swap应写在内联<style></style>里 - 媒体查询中影响首屏的断点(如
@media (max-width: 768px)里控制导航折叠的规则)要保留,其余可外链 - 动画关键帧(
@keyframes)若用于首屏入场动效,必须内联
内联位置和语法限制
必须放在里,且紧靠<meta charset>之后。浏览器解析到<style></style>就立即构建CSSOM,晚了等于白写。
- 不能用
<link rel="stylesheet" href="...">代替——这仍是网络请求,不满足“关键”定义 - 不能把整个
main.css压缩后塞进<style></style>——冗余规则会拖慢解析,还可能触发FOUC - 禁止在
<style></style>里写@import url(...)——它会阻塞渲染,等同于外链 - 避免使用
!important覆盖关键样式,它会让后续外链样式难以调试
怎么生成真正有效的关键CSS
手动提取容易漏,推荐工具链处理,但要注意输出结果必须人工核验。
- 用
Puppeteer或playwright模拟首屏渲染,抓取实际用到的规则(注意开启deviceScaleFactor: 1避免高DPI误判) -
criticalnpm 包能自动提取,但默认会包含:hover等交互态规则——这些不该算关键,需删掉 - Webpack/Vite插件如
vite-plugin-critical-css可在构建时注入,但必须配置include只打包.critical.css文件 - 最终内联内容建议用
<style data-critical></style>标记,方便后续移除或审计
容易被忽略的兼容性细节
内联关键CSS不是一劳永逸,几个边界情况常被跳过:
- HTTP/2 下多个
<link>并行加载快,但关键CSS仍必须内联——协议优化不解决首次解析延迟 - 某些CDN(如Cloudflare)会自动内联CSS,但可能错误包含
@media print等无关规则 - 服务端渲染(SSR)框架如Next.js的
getServerSideProps返回的HTML,<style></style>必须在内,不能动态插入到里 - 内联样式体积建议控制在14KB以内(TCP初始拥塞窗口限制),超了反而降低首字节时间
关键CSS内联的本质是“用可维护性换首屏性能”,一旦项目开始做组件化抽离或主题切换,就得同步更新内联块——这个同步成本,比写错一行style属性严重得多。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











