14kb是tcp初始拥塞窗口限制的硬边界,对应10个mss(约14.6kb),超限将导致第11个tcp段延迟一个rtt发送,引发白屏;gzip后体积不等于传输体积,需验证brotli/gzip是否实际生效;@import和@font-face会破坏内联效果,必须人工清除或预加载;真正应内联的仅lcp元素最小样式集,通常gzip后仅4–6kb。

14KB不是随便定的,它卡在TCP初始拥塞窗口上
浏览器发起HTML请求时,服务端响应要分片传回来。现代HTTP/1.1和HTTP/2都受限于TCP层的初始拥塞窗口(initial cwnd),主流系统(Linux 5.4+、Windows Server 2016+)默认是10个MSS(Maximum Segment Size),按标准1460字节算,就是约14.6KB。一旦内联
gzip后体积 ≠ 网络传输体积,别被压缩率骗了
很多人看构建日志里critical.css gzip 后才 8KB,就放心内联,结果线上TTFB变长。问题出在:服务端是否对整个HTML启用Brotli?CDN是否缓存了未压缩版本?如果HTML用的是gzip而CSS部分没被统一压缩,实际传输体积极可能突破14KB。更隐蔽的是:某些CDN(如Cloudflare免费版)默认不压缩HTML中的<style></style>块,只压文本节点。
- 用
curl -I -H "Accept-Encoding: br" https://yoursite.com/检查响应头是否含content-encoding: br - 在Chrome DevTools → Network → 拦截HTML请求 → 查看“Size”列(左)是传输体积,“Content”列(右)是解压后体积;两者差值大,说明压缩没生效
- 若用Nginx,确认配置了
gzip_vary on和gzip_types text/html text/css application/javascript
@import和@font-face会让内联失效
哪怕你把所有首屏样式都塞进<style></style>,只要里面出现@import url("fonts.css")或@font-face { src: url("bold.woff2") },浏览器仍会暂停CSSOM构建,发起新请求——等于白干。这类规则不会被工具(如critters)自动剔除,必须人工扫。
-
@import必须全部转成+动态rel切换 -
@font-face中src指向的字体文件,得提前用<link rel="preload" as="font" type="font/woff2" crossorigin>,且确保该<link>在<style></style>之前 - 检查DevTools → Rendering → “Paint flashing”是否在首屏文字出现前闪红——那是字体加载阻塞渲染的信号
真正该内联的,只是LCP元素的最小样式集
很多团队把整个.header、.hero全塞进去,但其实LCP(最大内容绘制)往往只依赖其中几个属性:比如h1的font-size、line-height、color,按钮的padding和background-color。其余border-radius、box-shadow、hover态完全可异步加载。
- 用Chrome Coverage面板(More Tools → Coverage)打开页面,刷新后看
<style></style>块里哪些CSS规则是灰色(未执行) - 删掉所有
:hover、:focus、@media (min-width: 768px)里的规则——它们不属于首屏必需 - 避免内联
#footer、.modal-hidden这类DOM存在但不可见的样式,它们拉高体积却不参与LCP
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











