HTML骨架必须在首屏渲染前完成输出,即服务端需尽早flush包含及关键占位结构的初始HTML,确保浏览器及时解析、计算样式并预留渲染时机,避免白屏延长。

HTML骨架必须在首屏渲染前完成输出
服务端渲染(SSR)或静态生成(SSG)时, 实操建议: 把任意文章或文档内容转换成精美的全屏翻页 HTML 演示文件(幻灯片风格)。当用户发来一篇文章、文档链接、Markdown 内容、或粘贴的文本,并且希望生成演示用的 HTML 时触发。支持任意内容来源:iWiki 链接、KM 链接、本地文件路径、直接粘贴的文本。生成的 HTML 文件保存到本地工作区,并通过企微直接发送给用户。触发词示例:帮我把这篇文章做成PPT、转成演示文档、生成HTML幻灯片、做个演示、转成可以演示的格式、article to deck、make a slide。 骨架屏不是装饰,是渲染占位符。如果 实操建议: 把骨架逻辑写在 实操建议: 使用 Tailwind、Windi 或 Emotion 时,骨架元素的类名可能未被提取进初始 CSS,导致无样式、透明、错位。这不是 HTML 问题,而是构建时 CSS 作用域未覆盖占位节点。 实操建议: 真正难的不是写出骨架,而是让骨架的 HTML、CSS、JS 在毫秒级时间窗口里各司其职:HTML 提前抵达,CSS 同步可用,JS 不抢道。任何一环稍有延迟,用户看到的就不是“渐进加载”,而是“卡住再闪现”。、、 和关键占位结构(如 、)应尽早 flush 到客户端。浏览器一旦收到完整开头(至少到 开始),就能启动解析和样式计算,为后续占位元素(如
res.write() 分段输出:先发 ...,再 flush;避免等整个模板渲染完才 res.end()
generateStaticParams + loading.tsx 时,确保根 layout 的 HTML 结构不含动态数据,否则会阻塞首字节(TTFB)ob_start() 未配 ob_flush())——这是白屏超 2s 的常见元凶占位元素需匹配真实 DOM 结构与尺寸
不一致,会出现布局偏移(layout shift),CLIP 指标恶化,用户感知卡顿。
aspect-ratio + min-height 控制图片占位区,避免因图片加载后重绘导致文字跳动line-height × 行数设定高度,禁用 height: 100%(父容器无高时失效)background-image 模拟头像——它不触发图像加载,但会干扰 LCP 计算;改用 border-radius: 50% + background-color 更轻量 并设固定宽高,而非删掉该节点(否则 DOM diff 代价更高)JS 加载骨架的时机必须绕过 render blocking
<script src="skeleton.js"></script> 里,又放在 中,等于主动阻塞 HTML 解析。骨架应在 DOM 可操作后立即挂载,且不能拖慢主内容 JS 执行。
<script defer src="skeleton.js"></script>,或更优:内联极简初始化代码(document.getElementById('root').innerHTML = skeletonHTMLfetch() 或访问 localStorage —— 这些 I/O 会延缓首次绘制;数据获取应由主应用接管useEffect 或 mounted 中才插入骨架;而是在 SSR 输出的 HTML 中已存在骨架,JS 仅负责「淡出」和「替换」DOMContentLoaded 时间,若 > 300ms 且骨架未显,大概率是 script 阻塞或骨架 HTML 被 JS 动态注入CSS-in-JS 或原子化框架对骨架样式的干扰
content 配置中显式加入骨架模板路径,例如 "./src/components/**/Skeleton.*";否则 bg-gray-200 类不会进入生产 CSS.module.css,或抽离为全局 skeleton.css 并通过 同步加载style={{ opacity: 0.7 }} 等内联样式——它无法被 PurgeCSS 识别,且增加 JS 执行负担;统一走 class 控制 标签内容,搜索骨架用到的关键类名(如 skeleton-card),确认是否存在;不存在则构建配置漏了
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










