一个直接被阻止的 <img> 仍会支付完整的内联图像编码费用
作者: michal-baya创建于 2026年9月1日更新于 2026年9月1日
受影响的内容: rrweb-snapshot 和 serializeElementNode。下面的锚点来自 rrweb 2.0.0-alpha.17 版本的捆绑复制(dist/rrweb.js),我直接从这里读取它们;rrweb-snapshot 2.0.1 版本中也保留了相同的顺序。needBlock 会在较早的时间计算(dist/rrweb.js:808),但 img/inlineImages 分支在 :897 执行,在 needBlock 将元素的属性替换为仅包含 class、rr_width 和 rr_height 的地方之前( :952)。因此,对于一个自身被阻止的 <img>,画布绘制和 toDataURL 仍然会完全执行,然后将生成的 rr_dataURL 丢弃。阻止一个 祖先 可以避免此工作,因为子元素在此处停止(recordChild = recordChild && !serializedNode.needBlock, :1095)。
要准确地说明成本:直接阻止的图像不会比未阻止的图像更耗费资源 — 它们的成本相同,结果被丢弃。令人惊讶的是,将元素标记为阻止会抑制输出而不跳过工作,因此无法用于避免成本。
内容来源: rrweb-io/rrweb