弱网下视频需手动控制加载与降级,preload="metadata"是默认安全线,仅下载头部信息以兼顾可用性与带宽;source顺序、type匹配、懒加载及超时fallback均需主动实现。

弱网下
为什么 preload="metadata" 是弱网下视频的默认安全线
preload 控制的是“页面加载阶段是否发起请求”以及“请求多少”,不是“要不要播”。在弱网中,auto 会尝试预加载大量数据,极易拖垮首屏;none 则完全放弃封面图和控件初始化,用户点击后才开始请求,感知延迟高。
- metadata 只下载头部(时长、宽高、编码格式),足够渲染 poster、显示播放按钮、支持 JS 调用 video.duration —— 这是弱网下唯一能兼顾可用性与带宽的取值
- 若服务器响应头缺失 Content-Length 或 Transfer-Encoding: chunked,某些安卓 WebView 可能无法正确解析 metadata,导致 poster 不显示或控件不激活;此时需配合
video.load()主动触发一次元数据加载 - preload="metadata" 在 Safari 上表现稳定,但 iOS 16.4 之前版本对 H.265 视频的 metadata 解析有兼容问题,建议 fallback 到 H.264 编码
标签顺序 + type 匹配失败会导致静默白屏
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
- 必须把最兼容、体积最小的格式放在最前面,例如:
<source src="vid.webm" type="video/webm"></source>应在<source src="vid.mp4" type="video/mp4"></source>之前,因 WebM 通常更小且 VP9 解码开销更低 - type 值必须与服务器实际返回的
Content-Type完全一致;写成video/mp3而服务端返回audio/mpeg,Chrome 会跳过该 source,不报错也不 fallback - 本地 file:// 协议下
全部失效(CORS + 协议限制),调试务必用 http-server 或 Vite 预览,不能双击 HTML 打开
如何用 IntersectionObserver + data-src 实现真懒加载
loading="lazy" 对
- 初始 HTML 写为:
<video poster="cover.jpg" width="640" height="360"></video>,确保 poster 可立即显示 - 监听时用
{ rootMargin: '100px' }提前触发,避免用户滚动到边缘才开始加载;旧版 Safari(loading="lazy" for - 调用
video.load()后,必须显式检查video.readyState === 0(HAVE_NOTHING),再调用video.play().catch(...),否则 Safari 可能拒绝自动播放 - 若视频加载超时(fetch timeout > 1500ms),应清除
src并插入降级提示,如:<p class="fallback-text">网络较慢,已切换为精简版</p>
弱网 fallback 必须绕过 fetch 自动重试逻辑
浏览器对
- 不能依赖
video.onerror,要改用AbortController封装 fetch 获取视频片段(如第一帧截图或元数据),超时即切换 fallback - 离线包加载失败后,先检查
navigator.onLine === false,再决定是否启用内联 JSON 数据或降级为 GIF 动画,而不是直接 retry - 连续两次请求耗时 > 800ms,应全局标记
networkStatus = 'weak',后续所有视频自动降级为 poster + 文字说明,不再尝试加载
真正难的不是写对
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










