不能。preload="none"在android版chrome和edge中仍可能发起几kb的range请求以读取媒体头信息,仅ios safari严格遵守;preload="metadata"流量取决于服务端accept-ranges、moov位置及cdn配置,合规时2–8kb,缺失任一条件可达1.2–4.7mb。

preload="none" 在移动端真能零流量消耗吗
不能。即使写 preload="none",Chrome(Android)和 Edge 移动版仍可能静默发起一个几 KB 的范围请求(如 Range: bytes=0-8191),只为读取 MP4 的 moov box 或 MP3 的 ID3 头——用于快速响应后续 play()、判断编码格式或触发 loadedmetadata。iOS Safari 是例外,它严格遵守 none,不发任何媒体数据请求。
常见误判点:
- Network 面板看到小体积请求,就以为“preload 失效”——其实是浏览器主动优化,不是 bug
- 用
video.readyState === 0判断是否加载成功,但 Chrome 下该值可能短暂跳到 1(HAVE_METADATA)后回落,不可靠 - 未配
Accept-Ranges: bytes的服务端,连这个小请求都可能拉取失败或退化为更大体积
preload="metadata" 流量到底花在哪
preload="metadata" 理论上只取文件开头几 KB,但实际流量取决于三个硬条件是否满足:
- 服务端必须返回
Accept-Ranges: bytes响应头,否则浏览器无法做字节范围请求,可能下载前 2–5 MB 才找到moov - 视频文件必须经
ffmpeg -c copy -movflags +faststart重写,确保moov在文件头部;否则浏览器得一路下载到末尾才能解析元数据 - CDN 缓存了不含
Accept-Ranges的响应(比如因Cache-Control: public且未透传头),所有下游请求都会继承该缺陷
实测数据:合规配置下,MP4 元数据请求体积稳定在 2–8 KB;任一条件缺失,体积常升至 1.2–4.7 MB(尤其 1080p+ 视频)。
preload="auto" 在 iOS 和 Android 上的行为差异
移动端没有“真正生效的 auto”。iOS Safari(10+)从不预加载主体内容,无论你写什么值,它都按 metadata 甚至 none 处理。Android 端更分裂:
- Chrome for Android:仅当设备未开启省电模式、页面已获焦点、且
src在 HTML 中静态存在时,才可能预加载前 1–3 秒帧数据(约150–600 KB) - 微信 WebView / QQ 浏览器内核:多数直接忽略
auto,降级为metadata,且不支持decoding="async"等优化 - 所有移动端浏览器在检测到
Save-Data请求头或 Low Data Mode 开启时,强制切为none
关键事实:autoplay 存在时,preload 值被完全忽略——这是规范行为,不是兼容性问题。
验证真实流量消耗的唯一方式
别信文档描述,只看 Network 面板中该资源的 Size 和 Transfer 列,并确认以下三点:
- 请求是否在
DOMContentLoaded之前发出(说明 preload 生效) - Initiator 是否为
parser(而非script),证明是 HTML 解析阶段触发,非 JS 动态加载 - 响应头含
Accept-Ranges: bytes且状态码为206(而非200)
最容易被忽略的是:React/Vue 渲染的 <video></video> 即使模板写了 preload="metadata",也不会触发初始预加载——因为元素不在初始 HTML 中,preload 属性已失效。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











