弱网下首屏是否“有东西可看”取决于HTML结构是否正确:首屏文本必须直写在<body>最前,禁用嵌套wrapper、data-lazy、visibility:hidden及<template>,须带lang属性且DOM深度≤6层,关键HTML≤14KB。
弱网下前端体验是否“有东西可看”,不取决于 JS 多快、CDN 多强,而取决于 HTML 本身有没有写对——错一层嵌套、多一个无语义 wrapper、少一个 lang,首屏文本就可能延迟 300ms 以上,甚至彻底不渲染。
<body> 最前面,不能包、不能懒、不能藏浏览器解析 HTML 是流式的,<h1> 和 <p> 越靠前,越早进入渲染树。但很多项目把它塞进五层 <div> 里,或用 data-lazy 占位,结果就是白屏卡住。
<h1>、<p>、<button> 必须直接出现在 <body> 内,不嵌套在 <div class="wrapper"> 或 <section data-lazy="true"> 中visibility: hidden 或 opacity: 0 控制显隐——这些样式仍需等 CSSOM 就绪,弱网下等于“有 DOM 没文字”<template> 和 <slot> 不行:Safari 15.4 之前不支持降级渲染,老版本直接丢内容lang 属性(如 <p lang="zh-CN">),否则字体 fallback 易触发重排(CLS)实测显示,低端安卓机上 DOM 深度从 3 层升到 8 层,domInteractive 时间平均高出 200ms+。这不是传输慢,是浏览器在反复创建节点、匹配选择器、计算继承样式。
Show DOM properties 查深度,超过 6 就该扁平化<main> 比 <div class="main-wrapper"> 更快匹配样式<div> 是高频雷区:<td><div><p>text</p></div></td> —— 直接写 <td><p>text</p></td>
display: contents 替代文本容器:Safari 15.4 之前不支持,会丢文本上下文<object> 是唯一无需 JS 就能自动 fallback 的原生机制弱网下 <iframe> 白屏、<img> + onerror 失效、<script> 还没加载完错误就已抛出——只有 <object> 在 DNS 失败、404、MIME 不匹配等任意异常下,都会自动渲染内部子内容。
立即学习“前端免费学习笔记(深入)”;
<object></object> 开闭标签之间,不能只靠注释或空格占位<object data="chart.svg"><img src="chart-fallback.png" alt="图表简述"></object>,内部 <img> 会被当作真实后备呈现<object data="xxx"> 没闭合,后备内容将被忽略data 指向的外部资源里;首屏核心信息应直接写在 <object> 内部Chrome 关键渲染路径要求首段 HTML(含 <title>)在首个 TCP 数据包(约 14KB)内到达。弱网下这个阈值极易突破,一旦超限,解析延迟不可逆。
<script> 标签之前,确保其字节数 ≤12KB(留 2KB 容错)<div><div><p>欢迎页</p></div></div> → 直接用 <h1> 或 <p>
<head> 中写内联 <script>console.log()</script>,除非是极小的 nonce 注入逻辑<noscript><p>默认文案</p></noscript>
最易被忽略的点是:DOM 结构不是“写完就能跑”,而是每层嵌套、每个无语义 wrapper、每处缺失的 lang,都在弱网设备上默默吃掉几十毫秒。这些加起来,就是用户看到白屏还是立刻读到字的区别。