首屏加载慢主因是HTML解析与关键资源加载顺序不当。应内联首屏CSS、用media延迟非关键CSS、避免@import;JS用defer或async,script放</body>前;精准preload字体和首屏图;精简HTML结构并启用Gzip/Brotli压缩。
首屏加载慢,八成卡在 HTML 解析和关键资源加载顺序上。不是 JS 太多,而是浏览器被你写的 <link rel="stylesheet"> 和 <script> 拖住了——它得等 CSSOM 构建完才能开始渲染,得等 JS 执行完才能继续解析 HTML。
外部 CSS 默认是渲染阻塞的:浏览器必须下载、解析、构建 CSSOM 后,才肯画第一帧。首屏样式若全靠 main.css,FCP(首次内容绘制)就注定延迟。
<head> 的 <style> 标签里,不发请求、不等待<link rel="stylesheet" media="print" onload="this.media='all'"> 延迟加载,或配合 media 属性做条件加载(如 media="(min-width: 768px)")@import 里引入关键 CSS —— 它会串行阻塞,比 <link> 多一次网络往返,实测拖慢 FCP 300ms+ 默认 <script src="app.js"> 是同步阻塞的:HTML 解析停住 → 下载 JS → 执行 JS → 继续解析。用户看到的就是白屏。
defer:下载异步,执行时机在 DOM 解析完成后、DOMContentLoaded 前,且按顺序执行analytics.js)可用 async:下载完立刻执行,时机不可控,可能早于 DOM 就绪<script> 放在 </body> 前——至少保证 DOM 已构建完毕,但不如 defer 可控document.write():现代浏览器已废弃,执行即清空文档流,必然阻塞且不可恢复preload 不是“越多越好”,它是高优先级资源提示,写错反而抢带宽、挤掉 HTML 或关键 CSS。
立即学习“前端免费学习笔记(深入)”;
<link rel="preload" href="font.woff2" as="font" type="font/woff2" crossorigin>(注意 crossorigin 必加,否则字体不生效)preload,但别对所有 <img loading="lazy"> 都加——浏览器可能先加载 src,再触发懒加载逻辑,造成重复请求high;prefetch 是 low,混用就等于浪费带宽preload 加 JS 入口文件(如 main.js)——它本身已被 script defer 覆盖,再 preload 属于冗余调度DOM 节点越多,浏览器解析、构建树、计算布局的时间越长。一个 2000+ 节点的页面,光解析 HTML 就可能耗时 50ms+。
<div><div><div> 嵌套,用语义化标签(<header>、<section>、<article>)替代无意义包裹层html-minifier-terser 可集成进 Webpack/Viteloading="lazy":首屏大图必须禁用该属性,否则可能被懒加载机制拦截,导致空白最容易被忽略的是:首屏优化不是“堆技巧”,而是识别真正影响 FCP/LCP 的那几 KB HTML 和几十毫秒的资源调度。内联关键 CSS、defer 主逻辑 JS、精准 preload 字体和首屏图——这三件事做完,多数项目的首屏时间能压到 1s 内。其他都是锦上添花,别本末倒置。