实现页面加载进度条需手动跟踪资源状态,document.readystate 仅有三态不可映射百分比,应结合 performanceobserver 监听真实资源加载,并注意 的 max/value 类型与更新频率控制。

<progress></progress> 标签本身不监听页面加载,它只是个被动控件。真要实现“页面加载进度条”,必须手动跟踪资源状态或估算时间——没有浏览器自动帮你把 script、img、link 的加载过程映射到 value 上。
为什么 document.readyState 不能直接当进度用
它只有 loading / interactive / complete 三态,中间没有百分比。比如从 loading 跳到 interactive 可能卡在 30%,也可能卡在 85%,完全不可控。
- 别写
if (document.readyState === 'loading') { bar.value = 20 }这类硬编码逻辑,不同页面 DOM 复杂度差异太大 -
DOMContentLoaded触发时,图片、字体、异步脚本往往还没开始加载,此时设bar.value = 80很容易让用户觉得“怎么还有 20% 卡着不动” - 动态插入的资源(如
document.createElement('img'))不会触发任何 readyState 变化,但它们确实影响用户感知的“加载完成”
用 PerformanceObserver 监听真实资源加载(现代方案)
Chrome 59+、Firefox 73+、Safari 11+ 支持,能拿到每个 script、img、link[rel="stylesheet"] 的实际 entry.duration 和 entry.startTime,比手动钩子更可靠。
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
- 必须在
尽早初始化,否则会错过 navigationStart 后前几百毫秒的资源记录 - 过滤掉
entry.initiatorType === 'xmlhttprequest'或'fetch'的条目,避免把 API 请求误算成页面资源 - 先用
document.querySelectorAll('script, link[rel="stylesheet"], img:not([data-src])')统计初始关键资源数,再配合PerformanceObserver计数完成量 - 别指望它实时更新:你只能知道“又一个资源完成了”,没法预测“还剩几个”,所以最后 5–10% 要留给人为渲染、JS 执行等开销
用 fetch/ReadableStream 同步 AJAX 主体内容进度
如果首屏数据靠 fetch() 拉取(比如 SPA),那进度条不该跟着 DOM 解析走,而应绑定到这个请求本身。
-
fetch()默认不暴露字节级进度,必须配合ReadableStream手动读取:response.body.getReader()+reader.read() - 服务端必须返回
Content-Length,否则event.loaded和event.total都是 0(2026 年仍如此) - 别一次
reader.read()读完全部——用controller.desiredSize控制 chunk 大小,否则进度直接跳到 100% -
XMLHttpRequest更简单些:设xhr.responseType = 'arraybuffer'才能触发onprogress;文本响应不触发
用 <progress></progress> 时最常踩的三个坑
很多人写了标签却看不到效果,问题不在逻辑,而在基础属性和类型。
-
max和value必须同时存在且为数字类型:写<progress value="60"></progress>不行,max缺失会导致浏览器按默认max="1"解析,60 就爆表了 - JS 动态更新时别直接
bar.value = '60',字符串会失效;得用Number()或parseInt()强转,再加Math.min(Math.max(0, val), 100)截断 - 高频更新(比如每毫秒设一次
value)会阻塞主线程,建议用requestAnimationFrame()节流,或至少 50ms 间隔
真正难的不是让进度条动起来,而是定义“100% 到底指什么”:是 HTML 解析完?所有图片 onload?还是首屏可交互?不同目标对应完全不同的监控策略,混用就会出现进度卡住、跳变、甚至倒退。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










