rrweb
概述
已弃用。
rrweb仅为向后兼容而保留。新项目应直接依赖 @rrweb/record 和 @rrweb/replay,或使用 @rrweb/all 进行单次便捷导入。迁移到这些入口点能让我们精简并最终移除本包。
rrweb 意为 “record and replay the web”(录制并回放 Web),是一个用于录制和回放用户在 Web 上交互的工具。
在大多数生产环境中,录制器和回放器会部署到不同的页面/应用。请在被录制的页面使用 @rrweb/record,在回放页面使用 @rrweb/replay(或使用 rrweb-player 以包含 UI)。
| 使用场景 | 包选择 |
|---|---|
| 大多数应用(显式声明录制/回放依赖) | @rrweb/record + @rrweb/replay |
| 通过一个导入获得录制、回放和 packer | @rrweb/all |
开发说明
由于这是 rrweb 最初的包,@rrweb/record 和 @rrweb/replay 的 TypeScript 代码仍位于本包的 src/record 和 src/replay 目录中。这些代码日后会重构到各自的包中,但目前本包仍是录制和回放相关 PR 的主要包。更多信息请参阅 rrweb 贡献指南。
安装
1) 打包器 / npm(推荐)
对于新项目:
npm install @rrweb/record @rrweb/replayimport { record } from '@rrweb/record';
import { Replayer } from '@rrweb/replay';
import '@rrweb/replay/dist/style.css';便捷的单包选项:
npm install @rrweb/allimport { record, Replayer, pack, unpack } from '@rrweb/all';
import '@rrweb/all/dist/style.css';旧版兼容包:
npm install rrwebimport { record, Replayer } from 'rrweb';
import 'rrweb/dist/style.css';2) 不使用打包器的浏览器环境(ESM)
<link
rel="stylesheet"
href="https://cdn.rrweb.com/replay/current/dist/style.css"
/>
<script type="module">
import { record } from 'https://cdn.rrweb.com/record/current/dist/record.js';
import { Replayer } from 'https://cdn.rrweb.com/replay/current/dist/replay.js';
</script>使用 current 指向最新稳定版本,或固定到精确版本(例如 https://cdn.rrweb.com/record/2.0.0/dist/record.js 和 https://cdn.rrweb.com/replay/2.0.0/dist/replay.js),以获得不可变的 生产环境 URL。
3) 旧版直接 <script> 引入(UMD 回退方案)
仅用于兼容非模块化环境;现代浏览器 均支持上述 ESM 方式。
<link
rel="stylesheet"
href="https://cdn.rrweb.com/replay/current/dist/style.css"
/>
<script src="https://cdn.rrweb.com/record/current/dist/record.umd.cjs"></script>
<script src="https://cdn.rrweb.com/replay/current/dist/replay.umd.cjs"></script>rrweb 发布说明
2.1.1
补丁变更
- 更新依赖 []:
- rrweb-snapshot@2.1.1
- rrdom@2.1.1
- @rrweb/types@2.1.1
- @rrweb/utils@2.1.1
2.1.0
补丁变更
#1864
7f0f75f感谢 @eoghanmurray! - 修复回放器的getCurrentTime()在实时模式(liveMode)下最后一个事件用尽后“卡住”的问题- rrweb-snapshot@2.1.0
- @rrweb/types@2.1.0
- rrdom@2.1.0
- @rrweb/utils@2.1.0
2.0.1
补丁变更
#1854
5f52d63感谢 @eoghanmurray! - 修复当网页被第三方库 monkey patch 时 Webkit/Safari 中 MutationObserver 失效的问题更新依赖 [
5f52d63]:- rrweb-snapshot@2.0.1
- @rrweb/utils@2.0.1
- rrdom@2.0.1
- @rrweb/types@2.0.1
2.0.0
重大变更
#1497
2606a2a感谢 @Juice10! - 将插件从 rrweb 中拆分出来,移至它们各自的包:@rrweb/packer、@rrweb/rrweb-plugin-canvas-webrtc-record、@rrweb/rrweb-plugin-canvas-webrtc-replay、@rrweb/rrweb-plugin-sequential-id-record、@rrweb/rrweb-plugin-sequential-id-replay、@rrweb/rrweb-plugin-console-record、@rrweb/rrweb-plugin-console-replay。更多信息请查看各包的 README,或查看 https://github.com/rrweb-io/rrweb/pull/1033 了解这些变更。#1497
2606a2a感谢 @Juice10! - 分发的文件使用了新的文件名、路径和扩展名。重要:如果你直接引用分发的文件或类型,可能需要更新路径/文件名。例如你从rrweb/typings/...或rrdom/es导入。但如果你使用import rrweb from 'rrweb'的方式导入,则不会受到此变更的影响。 如果你直接在 script 标签中引入 rrweb 文件,可能需要将该路径更新为.umd.cjs文件。所有.js文件现在使用 ES 模块,可在现代浏览器、node.js 以及支持 ES 模块的打包器中使用。所有 npm 包现在还同时提供.cjs和.umd.cjs文件。.umd.cjs文件是将所有文件打包在一起的 CommonJS 模块,便于向浏览器环境分发单个文件(类似于之前的.js文件)。.cjs文件是可在旧版 Node.js 环境中使用的 CommonJS 模块。类型在package.json中会有更完善的定义;如果你需要特定类型,它们可能从新的包中导出(例如PlayerMachineState和SpeedMachineState现在从@rrweb/replay导出)。请查看package.json的main和exports字段了解可用文件。#1497
2606a2a感谢 @Juice10! - 从rrweb包中移除 rrweb-all.js、rrweb-record.js 和 rrweb-replay.js 文件。现在你可以改用@rrweb/all、@rrweb/record和@rrweb/replay包。更多信息请查看各包的 README,或查看 PR #1033 了解这些变更。#1031
ad9bc3e感谢 @Juice10! - 将 rrweb 共享的事件和录制器类型移至新的@rrweb/types包。#868
e4f680e感谢 @Juice10! - 移除INode/node.__sn的用法,改用Mirror作为事实来源。
次要变更
#1129
979d2b1感谢 @eoghanmurray! - 点击事件现在包含.pointerType属性,用于区分 'pen'、'mouse' 和 'touch' 事件。没有新增 PenDown/PenUp 事件,但可以通过 MouseDown/MouseUp + pointerType=pen 检测它们#1432
123a81e感谢 @Juice10! - 全面重构video和audio元素的播放。更加健壮,并修复了大量与暂停/播放/跳过/静音/playbackRate 等相关的 bug。#1188
bc84246感谢 @benjackwhite! - feat:扩展 maskInputFn,将 HTMLElement 传递给决策函数#1310
7c0dc9d感谢 @benjackwhite! - 扩展 maskTextFn,将 HTMLElement 传递给决策函数#1035
2a80949感谢 @Juice10! - 通过recordCrossOriginIframes新增对录制跨域 iframe 的支持。#989
3809060感谢 @YunFeng0817! - 新增对可构造样式表adoptedStyleSheets的录制和回放支持,包括样式表变更、replace/replaceSync、shadow root、iframe、实时模式和虚拟 DOM 回放。#953
5f59f91感谢 @YunFeng0817! - 新增destroy()方法,用于彻底移除回放器实例并发出销毁事件。#976
a8478f1感谢 @Juice10! - 新增 canvas WebRTC 录制和回放插件,用于实时推流 canvas 内容。#967
bac1d7b感谢 @QxQstar! - 新增dataURLOptions,用于控制 canvas 快照图像的格式和质量。#894
5ba933c感谢 @dbseel! - 新增ignoreCSSAttributes,并在录制器的各个观察器中一致地应用blockSelector检查。
补丁变更
#1269
7103625感谢 @eoghanmurray! - 不再包含刚添加节点上文本/属性变更中的冗余数据#1386
a2c8a1a感谢 @ababik! - 修复可选的maskInputFn在创建全量快照时被意外忽略的问题#1422
3d1877c感谢 @marandaneto! - fix:修复 createImageBitmap 在源宽度或高度为 0 时抛出 DOMException 的问题#1403
af0962c感谢 @pauldambra! - 使用 console 日志插件安全地捕获 BigInt 值"#1327
57a940a感谢 @mydea! - fix:修复initAdoptedStyleSheetObserver中对patchTarget的检查#1156
e65465e感谢 @Code-Crash! - 修复会被 Microbundle 改写的语句#1268
d872d28感谢 @eoghanmurray! - 紧凑样式变更的修复与改进- 修复样式更新在简写属性上包含 'var()' 时的问题 #1246
- 通过在字符串方式更短时回退到字符串方式,进一步确保样式变更保持紧凑
#1262
36da39d感谢 @billyvg! - feat:新增ignoreSelector选项与 ignoreClass 类似,但接受 CSS 选择器,因此你可以使用任意 CSS 选择器。
#1198
b5e30cf感谢 @charliegracie! - 在 Controller 的goto中(而非handleProgressClick中)重置 finished 标志,以便在直接调用goto时也能正确处理。#1417
40bbc25感谢 @YunFeng0817! - fix:修复 style 元素重复的 textContent 导致增量样式变更失效的问题#1762
22bc4c3感谢 @Juice10! - 从所有构建产物中移除 base64 内联的 worker 源码#1279
11f6567感谢 @eoghanmurray! - 扩展 fixBrowserCompatibilityIssuesInCSS,使其也作用于内联样式表#1196
490b3e2感谢 @eoghanmurray! - 防范页面上存在重新定义 Date.now() 的旧版第三方 JavaScript 库#1615
dc20cd4感谢 @eoghanmurray! - 提升对包含大量 CSS 内容的<style>元素执行 splitCssText 的性能——参见 #1603#1640
3e9e42f感谢 @eoghanmurray! - 提升对包含大量 CSS 内容的<style>元素执行 splitCssText 的性能——参见 #1603#1139
f27e545感谢 @YunFeng0817! - 修复:在重建全量快照之前从虚拟 DOM 切换到真实 DOM#1033
7261c43感谢 @Juice10! - 直接从 rrweb 导出ReplayPlugin。以前必须写成import type { ReplayPlugin } from 'rrweb/dist/types';,现在可以写成import type { ReplayPlugin } from 'rrweb';#1464
03b5216感谢 @colingm! - 更好地支持与修改内置Array.from函数的旧库(如 MooTools 和 Prototype.js)共存#1441
ae6908d感谢 @eoghanmurray! - perf:避免事件发出时多余的函数调用和对象克隆#1481
46f1b25感谢 @eoghanmurray! - 修复影响复杂 tailwind css 回放的 bug #1457 并添加测试#1179
e0f862b感谢 @wfk007! - 修复:#1178 移除构建时与 worker_threads 相关的警告#1476
cbbd1e5感谢 @eoghanmurray! - 修复多处 background-clip 替换的问题#1600
a6893f7感谢 @eoghanmurray! - #1575 修复 postcss 在处理被任意拆分的 CSS 内容时可能出错的问题#1155
8aea5b0感谢 @YunFeng0817! - Feat:新增对自定义元素 :defined 伪类的回放支持#1186
267e990感谢 @YunFeng0817! - 修复:即使在不需要录制器的环境中也会创建 processed-node-manager 的问题#1527
68076b7感谢 @arredgroup! - 为录制过程导出 takeFullSnapshot 函数#1220
a1ec9a2感谢 @wfk007! - perf:优化 DoubleLinkedList get 的性能#1515
8059d96感谢 @okejminja! - 新增对已废弃的 addRule 与 removeRule 方法的支持#1829
bfe14c5感谢 @Juice10! - 在文档和公共类型中将inlineImages和inlineStylesheet录制选项标记为已废弃,同时保留现有行为。#1468
4014305感谢 @eoghanmurray! - inlineImages:快照期间避免为内联同源图片添加事件监听器(异步监听器会修改快照,可能引发问题)#1631
88ea2d0感谢 @pauldambra! - 将 patch 函数移入 @rrweb/utils 以改善打包效果#1489
609b7fa感谢 @JonasBa! - 通过将 isParentRemoved 改为迭代过程来优化其性能#1130
f6f07e9感谢 @AgentWrapper! - 修复:内联样式表时,使样式表 URL 的相对路径检测能够识别更多类型的 URL 协议。#1324
1fe39ab感谢 @BelenLuo-tech! - 导出 eventWithTime 供 TypeScript 代码使用#1196
490b3e2感谢 @eoghanmurray! - 防范与 rrweb 共存于同一页面的第三方库对 Date.now 的重定义#1095
1385f7a感谢 @YunFeng0817! - 修复 shadow DOM 重复的问题#1343
05478c3感谢 @mdellanoce! - 在处理属性变更时使用 WeakMap 加速 attributeCursor 查找#1695
fc390a9感谢 @YunFeng0817! - fix:修复 iframe 变为跨域后停止录制时 rrweb 录制器可能报错的问题#1251
bbbfa22感谢 @wfk007! - fix:修复 iframe 出现后 Resize 和 MediaInteraction 事件重复生成的问题#1467
e96f668感谢 @eoghanmurray! - #1434 性能改进后的 bug 修复:修复 blob URL 残留在共享的 anchor 元素上且之后无法修改的问题#1272
58c9104感谢 @eoghanmurray! - Perf:遍历样式规则时避免创建中间数组#1126
227d43a感谢 @YunFeng0817! - 将所有使用 commonjs 模块的打包脚本后缀从 'js' 重构为 cjs #1087。#1493
82f6fec感谢 @eoghanmurray! - 回放:替换 CSS 解析器正则表达式中的负向后行断言,因为它会在 Safari 16 中引发问题#1311
980a38c感谢 @eoghanmurray! - 新增 'recordDOM' 配置选项,可关闭 DOM 录制(使录制结果无法回放)。适用于特殊场景,例如仅录制热力图点击/滚动#1145
a82a3b4感谢 @eoghanmurray! - 对于移除节点的变更,考虑到可能是祖先节点(而不仅是父节点)刚被移除,减少误报警告的数量#1353
5c27b76感谢 @YunFeng0817! - 修复:部分嵌套的跨域 iframe 无法被录制的问题#1775
b149cf3感谢 @alailsonko! - fix:改进嵌套 CSS 规则的处理,以及回放器对缺失规则的处理#1351
a2be77b感谢 @eoghanmurray! - 当<textarea>已预填内容时,不再重复录制其值 #1301#1126
227d43a感谢 @YunFeng0817! - 修复:提升 rrdom 的健壮性 #1091。#1837
527d9d3感谢 @Juice10! - 从@rrweb/record构建产物中 tree-shake 移除仅回放使用的postcss代码。#1618
79837ac感谢 @billyvg! - 修复由于对象引用被修改,远程加载的<link>内联 CSS 无法正确应用的问题。#1431
a7c33f2感谢 @eoghanmurray! - 确保 :hover 在回放器中生效,即使规则位于媒体查询之内 尊重 max-device-width 和 min-device-width 媒体查询背后的意图,使其效果在回放器上下文中也显而易见#1834
43e4f5b感谢 @Juice10! - 默认要求浏览器中的rebuild()调用必须以rebuildIntoSandboxedIframe()或createSandboxedIframe()创建的 document 为目标。处理不可信的回放数据时请使用这些辅助函数,或仅在接受脚本执行风险时传入UNSAFE_allowUnprotectedRebuild: true。由于 canvas 回放会为回放 iframe 增加脚本权限,
rrweb现在将UNSAFE_replayCanvas重建标记为显式的不安全路径。#1127
3cc4323感谢 @YunFeng0817! - 重构:在超大基准用例中将性能提升 80%。- 重构:将 childNodes 的数据结构从数组改为链表
- 提升 “contains” 函数的性能。新算法会将复杂度从 O(n) 降至 O(logn)
#1328
d38893f感谢 @eoghanmurray! - 重构后不再需要与 shadowDom 相关的、在后台持续运行的 raf 循环#1614
6f4e691感谢 @billyvg! - 改为忽略所有 link[rel="modulepreload"],而不再仅包含带as="script"的项#1535
04ee6ed感谢 @eoghanmurray! - 在 #1458 之后,对替换 :hover 的方式做小幅简化#1437
5fbb904感谢 @eoghanmurray! - 边界情况:支持对(罕见地)包含多个文本节点的<style>元素的变更#1512
d08624c感谢 @eoghanmurray! - 优化:跳过叶子元素的脱敏检查#1374
314a8dd感谢 @andrewpomeroy! - 捕获标记为rel="preload"的样式表#1593
5a78938感谢 @daibhin! -NodeType枚举已从 rrweb-snapshot 移至 @rrweb/types 以下类型已从 rrweb-snapshot 移至 @rrweb/types:documentNode、documentTypeNode、legacyAttributes、textNode、cdataNode、commentNode、elementNode、serializedNode、serializedNodeWithId、serializedElementNodeWithId、serializedTextNodeWithId、IMirror、INode、mediaAttributes、attributes和DataURLOptions#1141
3416c3a感谢 @YunFeng0817! - 修复:所有全量快照事件中遗漏 isCheckout 的问题#1599
9cd28b7感谢 @eoghanmurray! - #1596 为 textarea 元素的 innerText 变更新增脱敏#1349
07ac5c9感谢 @eoghanmurray! - 文本脱敏时的快照性能:避免递归遍历 DOM 时重复调用closest#1704
33e01f5感谢 @eoghanmurray! - 在 /dist/ 之外提供 /umd/ 输出目录,以便提供带 .js 扩展名的 UMD(Universal Module Definition)文件,同时不违背 package.json 中 /dist/ 下所有 .js 文件均为模块的约定#1121
502d15d感谢 @YunFeng0817! - 修复:过时的 ':hover' 样式无法从 iframe 或 shadow DOM 中移除的问题#1273
a3de582感谢 @Juice10! - Canvas FPS 录制:在创建 canvas 时覆盖preserveDrawingBuffer: true。 Canvas 回放:修复 canvas 元素闪烁的问题。 Canvas FPS 录制:修复录制时会清除 webgl(2) canvas 背景的 bug。#760
e08706a感谢 @eoghanmurray! - 新增 slimDOM 选项以屏蔽<title>标签上的动画;当 slimDOM 使用 'all' 值时启用#1122
8d209a6感谢 @YunFeng0817! - 手动补充缺失的变更日志。从下个版本开始,所有变更日志将自动生成。a220835#1053 感谢 @Juice10! - 修复:postMessage 可能中断跨域 iframe 录制的问题。7e8dcdb#1063 感谢 @lele0108! - 修复:muted 从 false 变为 true 未被设置的问题。36b44e1#1042 感谢 @wfk007! - 修复:在 Node 上执行 insertBefore 失败的问题。03821d9#1083 感谢 @eoghanmurray! - 统一为单一的 getWindowScrolld08913d#1086 感谢 @YunFeng0817! - 修复:checkout 全量快照中遗漏 shadow DOM 的 adopted style sheets 的问题。57a2e14#1088 感谢 @mydea! - 修复:防范 window.CSSStyleSheet 缺失的情况。fc82869#1093 感谢 @YunFeng0817! - 修复:跨域 iframe 的 bug。a77e302#1104 感谢 @jlalmes! - [console-plugin] Feat:录制未处理的 rejection 事件。0732618#1100 感谢 @YunFeng0817! - 修复:特殊 iframe 中 rootId 值错误的问题。3caa25e#1098 感谢 @eoghanmurray! - 重构:实时模式下不再让 requestAnimationFrame 在后台循环。3a26e36#1092 感谢 @YunFeng0817! - 修复:问题回归:ShadowHost 不能是字符串(issue 941)07d22e7#1111 感谢 @YunFeng0817! - Feat:支持在回放器中自定义 logger。0627d4d#1109 感谢 @YunFeng0817! - Feat:新增在 DOMContentLoaded 事件时开始录制的选项。174b9ac#1112 感谢 @YunFeng0817! - 修复:变更报错 Failed to execute 'insertBefore' on 'Node': Only one doctype on document allowed。
#1509
be6bf52感谢 @Juice10! - 反向 monkey patch 内置方法,以支持 LWC(以及 angular 等其他会 monkey patch 内置方法的框架)。#1136
aaabdbd感谢 @benjackwhite! - fix:修复 console 录制时递归记录日志的 bug#1191
1e6f71b感谢 @Juice10! - 调用 replayer.pause(...) 时,随 mouse up 和 mouse down 事件触发鼠标移动与悬停。#1763
6388fb5感谢 @wfk007! - fix:处理 wujie monkeypatch ownerDocument 的情况#1163
4cb4d0e感谢 @zhaobosky! - 修复:部分网站重建不完整- 部分网站中,emit 函数里的 addedSet 不为空,但 Array.from 转换的结果为空。
- 部分网站 polyfill 了 HTML 元素的 classList 方法,其实现可能抛错并导致快照失败。我添加了 try-catch 语句使代码更健壮。
#1159
5e6c132感谢 @eoghanmurray! - 针对使用 userTriggeredOnInput 设置的用户:在 Input 属性修改时也将 userTriggered 设为 false;此前 IncrementalSource.Input 的这一变体中该值为空#1029
fdb7135感谢 @Juice10! - 修复同时应用scrollTop和scrollLeft时元素滚动位置的回放问题。#1037
a9fffb3感谢 @QuentinLowe! - 在 iframe 内注册 shadow root 时使用正确的 document。#1041
1990524感谢 @YunFeng0817! - 修复在某些页面上可能进入无限循环的 shadow DOM 变更处理问题。#1020
7edfefe感谢 @YunFeng0817! - 修复非 shadow-root 节点暴露host属性时录制器崩溃的问题。#1016
87aa3b6感谢 @eoghanmurray! - 避免录制isContextLost等无意义的只读 WebGL 属性。#1013
20ad416感谢 @eoghanmurray! - 修复多个上下文被 patch 时的 WebGL 变量跟踪问题。#1012
6f44bb7感谢 @Juice10! - 确保回放插件的onBuild钩子对新追加的变更节点和顶层重建的 document 节点也会运行。#995
55ebce7感谢 @YunFeng0817! - 通过更新现有 link/style 节点的属性(而非添加子节点),修复延迟内联样式表链接的回放问题。#927
fd85c79感谢 @Juice10! - 通过正确处理负数及未序列化的节点 id,修复 iframe 重载和 rrdom diff 问题。#952
a0d5373感谢 @YunFeng0817! - 修复快进播放期间回放选择事件时的错误。#966
ac7935e感谢 @QxQstar! - 修复blockClass为正则表达式时基于 FPS 的 canvas 录制问题。#956
e7fdf53感谢 @YunFeng0817! - 修复 shadow root 内多个子节点的录制问题。#991
7be26b0感谢 @QuentinLowe! - 通过使用 iframe document 自身的 window 原型,修复 iframe 内的输入钩子问题。#1002
96b7466感谢 @YunFeng0817! - 通过避免对同一 shadow root 的重复观察,修复 shadow DOM 重复录制问题。#1001
c619a59感谢 @eoghanmurray! - 修复addAction,使计时器启动后添加的回放动作无需停止并重启即可生效。#938
f3064c1感谢 @lele0108! - 修复 SVG<use href="#...">的快照序列化,使本地片段引用被保留而不是转换为绝对 URL。#935
8ad4325感谢 @YunFeng0817! - 修复 console 插件录制,使undefined值能被正确序列化和回放。#942
f03504a感谢 @YunFeng0817! - 修复对 ShadyDOM 和@lwc/synthetic-shadowpolyfill 的 Shadow DOM 的录制和回放。#944
f1b23dd感谢 @YunFeng0817! - 修复快进回放,使通过虚拟 DOM 路径重建时 iframe 内的 canvas 图像数据能够被恢复。#867
93fec1f感谢 @rahulrelicx! - 修复被屏蔽的元素 class 之后被取消屏蔽时的变更边界情况。#891
3cdcb8a感谢 @dkozlovskyi! - 修复回放/录制行为中的 issue #890。更新依赖 [
6db8f71,47a7c3f,0f0a532,a2c8a1a,8e55c45,d872d28,b798f2d,123a81e,40bbc25,22bc4c3,11f6567,123a81e,dc20cd4,3e9e42f,03b5216,46f1b25,cbbd1e5,a6893f7,c28ef5f,335639a,5e7943d,4014305,efdc167,88ea2d0,f6f07e9,979d2b1,1385f7a,d7c72bf,f2419f2,c0f83af,e96f668,58c9104,227d43a,bc84246,d2582e9,82f6fec,eac9b18,02cc62d,2606a2a,d0fdc0f,f3cf092,a2be77b,f27e545,227d43a,527d9d3,f7c6973,efdc167,a7c33f2,43e4f5b,3cc4323,6f4e691,335639a,123a81e,04ee6ed,5fbb904,d350da8,d08624c,e7f0c80,8aea5b0,314a8dd,5a78938,e607e83,76df979,7c0dc9d,8e47ca1,07ac5c9,c6600e7,33e01f5,e08706a,be6bf52,6388fb5,c278d06]:- @rrweb/utils@2.0.0
- rrweb-snapshot@2.0.0
- @rrweb/types@2.0.0
- rrdom@2.0.0
2.0.0-alpha.20
补丁变更
#1763
6388fb5感谢 @wfk007! - fix:处理 wujie monkeypatch ownerDocument 的情况更新依赖 [
6388fb5]:- @rrweb/utils@2.0.0-alpha.20
- rrweb-snapshot@2.0.0-alpha.20
- rrdom@2.0.0-alpha.20
- @rrweb/types@2.0.0-alpha.20
2.0.0-alpha.19
补丁变更
#1615
dc20cd4感谢 @eoghanmurray! - 提升对包含大量 CSS 内容的<style>元素执行 splitCssText 的性能——参见 #1603#1640
3e9e42f感谢 @eoghanmurray! - 提升对包含大量 CSS 内容的<style>元素执行 splitCssText 的性能——参见 #1603#1600
a6893f7感谢 @eoghanmurray! - #1575 修复 postcss 在处理被任意拆分的 CSS 内容时可能出错的问题#1631
88ea2d0感谢 @pauldambra! - 将 patch 函数移入 @rrweb/utils 以改善打包效果#1695
fc390a9感谢 @YunFeng0817! - fix:修复 iframe 变为跨域后停止录制时 rrweb 录制器可能报错的问题#1618
79837ac感谢 @billyvg! - 修复由于对象引用被修改,远程加载的<link>内联 CSS 无法正确应用的问题。#1614
6f4e691感谢 @billyvg! - 改为忽略所有 link[rel="modulepreload"],而不再仅包含带as="script"的项#1599
9cd28b7感谢 @eoghanmurray! - #1596 为 textarea 元素的 innerText 变更新增脱敏更新依赖 [
47a7c3f,dc20cd4,3e9e42f,a6893f7,88ea2d0,f2419f2,6f4e691,76df979]:- rrweb-snapshot@2.0.0-alpha.19
- @rrweb/utils@2.0.0-alpha.19
- rrdom@2.0.0-alpha.19
- @rrweb/types@2.0.0-alpha.19
2.0.0-alpha.18
次要变更
补丁变更
#1535
04ee6ed感谢 @eoghanmurray! - 在 #1458 之后,对替换 :hover 的方式做小幅简化#1437
5fbb904感谢 @eoghanmurray! - 边界情况:支持对(罕见地)包含多个文本节点的<style>元素的变更#1593
5a78938感谢 @daibhin! -NodeType枚举已从 rrweb-snapshot 移至 @rrweb/types 以下类型已从 rrweb-snapshot 移至 @rrweb/types:documentNode、documentTypeNode、legacyAttributes、textNode、cdataNode、commentNode、elementNode、serializedNode、serializedNodeWithId、serializedElementNodeWithId、serializedTextNodeWithId、IMirror、INode、mediaAttributes、attributes和DataURLOptions更新依赖 [
8e55c45,02cc62d,04ee6ed,5fbb904,5a78938]:- rrdom@2.0.0-alpha.18
- rrweb-snapshot@2.0.0-alpha.18
- @rrweb/types@2.0.0-alpha.18
- @rrweb/utils@2.0.0-alpha.18
2.0.0-alpha.17
次要变更
补丁变更
#1417
40bbc25感谢 @YunFeng0817! - fix:修复 style 元素重复的 textContent 导致增量样式变更失效的问题#1527
68076b7感谢 @arredgroup! - 为录制过程导出 takeFullSnapshot 函数#1515
8059d96感谢 @okejminja! - 新增对已废弃的 addRule 与 removeRule 方法的支持#1509
be6bf52感谢 @Juice10! - 反向 monkey patch 内置方法,以支持 LWC(以及 angular 等其他会 monkey patch 内置方法的框架)。更新依赖 [
40bbc25,335639a,335639a,d350da8,be6bf52]:- rrweb-snapshot@2.0.0-alpha.17
- rrdom@2.0.0-alpha.17
- @rrweb/types@2.0.0-alpha.17
- @rrweb/utils@2.0.0-alpha.17
2.0.0-alpha.16
补丁变更
#1386
a2c8a1a感谢 @ababik! - 修复可选的maskInputFn在创建全量快照时被意外忽略的问题#1512
d08624c感谢 @eoghanmurray! - 优化:跳过叶子元素的脱敏检查- rrweb-snapshot@2.0.0-alpha.16
- rrdom@2.0.0-alpha.16
- @rrweb/types@2.0.0-alpha.16
2.0.0-alpha.15
重大变更
#1497
2606a2a感谢 @Juice10! - 将插件从 rrweb 中拆分出来,移至它们各自的包:@rrweb/packer、@rrweb/rrweb-plugin-canvas-webrtc-record、@rrweb/rrweb-plugin-canvas-webrtc-replay、@rrweb/rrweb-plugin-sequential-id-record、@rrweb/rrweb-plugin-sequential-id-replay、@rrweb/rrweb-plugin-console-record、@rrweb/rrweb-plugin-console-replay。更多信息请查看各包的 README,或查看 https://github.com/rrweb-io/rrweb/pull/1033 了解这些变更。#1497
2606a2a感谢 @Juice10! - 分发的文件使用了新的文件名、路径和扩展名。重要:如果你直接引用分发的文件或类型,可能需要更新路径/文件名。例如你从rrweb/typings/...或rrdom/es导入。但如果你使用import rrweb from 'rrweb'的方式导入,则不会受到此变更的影响。 如果你直接在 script 标签中引入 rrweb 文件,可能需要将该路径更新为.umd.cjs文件。所有.js文件现在使用 ES 模块,可在现代浏览器、node.js 以及支持 ES 模块的打包器中使用。所有 npm 包现在还同时提供.cjs和.umd.cjs文件。.umd.cjs文件是将所有文件打包在一起的 CommonJS 模块,便于向浏览器环境分发单个文件(类似于之前的.js文件)。.cjs文件是可在旧版 Node.js 环境中使用的 CommonJS 模块。类型在package.json中会有更完善的定义;如果你需要特定类型,它们可能从新的包中导出(例如PlayerMachineState和SpeedMachineState现在从@rrweb/replay导出)。请查看package.json的main和exports字段了解可用文件。#1497
2606a2a感谢 @Juice10! - 从rrweb包中移除 rrweb-all.js、rrweb-record.js 和 rrweb-replay.js 文件。现在你可以改用@rrweb/all、@rrweb/record和@rrweb/replay包。更多信息请查看各包的 README,或查看 PR #1033 了解这些变更。
补丁变更
#1033
7261c43感谢 @Juice10! - 直接从 rrweb 导出ReplayPlugin。以前必须写成import type { ReplayPlugin } from 'rrweb/dist/types';,现在可以写成import type { ReplayPlugin } from 'rrweb';#1468
4014305感谢 @eoghanmurray! - inlineImages:快照期间避免为内联同源图片添加事件监听器(异步监听器会修改快照,可能引发问题)#1489
609b7fa感谢 @JonasBa! - 通过将 isParentRemoved 改为迭代过程来优化其性能#1493
82f6fec感谢 @eoghanmurray! - 回放:替换 CSS 解析器正则表达式中的负向后行断言,因为它会在 Safari 16 中引发问题#1353
5c27b76感谢 @YunFeng0817! - 修复:部分嵌套的跨域 iframe 无法被录制的问题#1328
d38893f感谢 @eoghanmurray! - 重构后不再需要与 shadowDom 相关的、在后台持续运行的 raf 循环#760
e08706a感谢 @eoghanmurray! - 新增 slimDOM 选项以屏蔽<title>标签上的动画;当 slimDOM 使用 'all' 值时启用更新依赖 [
4014305,82f6fec,2606a2a,f3cf092,e08706a]:- rrweb-snapshot@2.0.0-alpha.15
- rrdom@2.0.0-alpha.15
- @rrweb/types@2.0.0-alpha.15
2.0.0-alpha.14
补丁变更
#1464
03b5216感谢 @colingm! - 更好地支持与修改内置Array.from函数的旧库(如 MooTools 和 Prototype.js)共存#1441
ae6908d感谢 @eoghanmurray! - perf:避免事件发出时多余的函数调用和对象克隆#1481
46f1b25感谢 @eoghanmurray! - 修复影响复杂 tailwind css 回放的 bug #1457 并添加测试#1476
cbbd1e5感谢 @eoghanmurray! - 修复多处 background-clip 替换的问题#1467
e96f668感谢 @eoghanmurray! - #1434 性能改进后的 bug 修复:修复 blob URL 残留在共享的 anchor 元素上且之后无法修改的问题更新依赖 [
03b5216,46f1b25,cbbd1e5,5e7943d,c0f83af,e96f668]:- rrweb-snapshot@2.0.0-alpha.14
- rrdom@2.0.0-alpha.14
- @rrweb/types@2.0.0-alpha.14
2.0.0-alpha.13
次要变更
- #1432
123a81e感谢 @Juice10! - 全面重构video和audio元素的播放。更加健壮,并修复了大量与暂停/播放/跳过/静音/playbackRate 等相关的 bug。
补丁变更
#1422
3d1877c感谢 @marandaneto! - fix:修复 createImageBitmap 在源宽度或高度为 0 时抛出 DOMException 的问题更新依赖 [
123a81e,123a81e,f7c6973,123a81e,c278d06]:- rrdom@2.0.0-alpha.13
- rrweb-snapshot@2.0.0-alpha.13
- @rrweb/types@2.0.0-alpha.13
2.0.0-alpha.12
次要变更
- #1310
7c0dc9d感谢 @benjackwhite! - 扩展 maskTextFn,将 HTMLElement 传递给决策函数
补丁变更
#1403
af0962c感谢 @pauldambra! - 使用 console 日志插件安全地捕获 BigInt 值"#1327
57a940a感谢 @mydea! - fix:修复initAdoptedStyleSheetObserver中对patchTarget的检查#1155
8aea5b0感谢 @YunFeng0817! - Feat:新增对自定义元素 :defined 伪类的回放支持#1324
1fe39ab感谢 @Belen-Luo! - 导出 eventWithTime 供 TypeScript 代码使用#1343
05478c3感谢 @mdellanoce! - 在处理属性变更时使用 WeakMap 加速 attributeCursor 查找#1272
58c9104感谢 @eoghanmurray! - Perf:遍历样式规则时避免创建中间数组#1311
980a38c感谢 @eoghanmurray! - 新增 'recordDOM' 配置选项,可关闭 DOM 录制(使录制结果无法回放)。适用于特殊场景,例如仅录制热力图点击/滚动#1351
a2be77b感谢 @eoghanmurray! - 当<textarea>已预填内容时,不再重复录制其值 #1301#1431
a7c33f2感谢 @eoghanmurray! - 确保 :hover 在回放器中生效,即使规则位于媒体查询之内 尊重 max-device-width 和 min-device-width 媒体查询背后的意图,使其效果在回放器上下文中也显而易见#1374
314a8dd感谢 @andrewpomeroy! - 捕获标记为rel="preload"的样式表#1349
07ac5c9感谢 @eoghanmurray! - 文本脱敏时的快照性能:避免递归遍历 DOM 时重复调用closest更新依赖 [
58c9104,a2be77b,a7c33f2,8aea5b0,314a8dd,e607e83,7c0dc9d,07ac5c9]:- rrweb-snapshot@2.0.0-alpha.12
- rrdom@2.0.0-alpha.12
- @rrweb/types@2.0.0-alpha.12
2.0.0-alpha.11
补丁变更
#1279
11f6567感谢 @eoghanmurray! - 扩展 fixBrowserCompatibilityIssuesInCSS,使其也作用于内联样式表更新依赖 [
11f6567,efdc167,efdc167]:- rrweb-snapshot@2.0.0-alpha.11
- @rrweb/types@2.0.0-alpha.11
- rrdom@2.0.0-alpha.11
2.0.0-alpha.10
补丁变更
#1269
7103625感谢 @eoghanmurray! - 不再包含刚添加节点上文本/属性变更中的冗余数据#1268
d872d28感谢 @eoghanmurray! - 紧凑样式变更的修复与改进- 修复样式更新在简写属性上包含 'var()' 时的问题 #1246
- 通过在字符串方式更短时回退到字符串方式,进一步确保样式变更保持紧凑
#1262
36da39d感谢 @billyvg! - feat:新增ignoreSelector选项与 ignoreClass 类似,但接受 CSS 选择器,因此你可以使用任意 CSS 选择器。
#1251
bbbfa22感谢 @wfk007! - fix:修复 iframe 出现后 Resize 和 MediaInteraction 事件重复生成的问题#1273
a3de582感谢 @Juice10! - Canvas FPS 录制:在创建 canvas 时覆盖preserveDrawingBuffer: true。 Canvas 回放:修复 canvas 元素闪烁的问题。 Canvas FPS 录制:修复录制时会清除 webgl(2) canvas 背景的 bug。- @rrweb/types@2.0.0-alpha.10
- rrweb-snapshot@2.0.0-alpha.10
- rrdom@2.0.0-alpha.10
2.0.0-alpha.9
补丁变更
#1196
490b3e2感谢 @eoghanmurray! - 防范页面上存在重新定义 Date.now() 的旧版第三方 JavaScript 库#1220
a1ec9a2感谢 @wfk007! - perf:优化 DoubleLinkedList get 的性能#1196
490b3e2感谢 @eoghanmurray! - 防范与 rrweb 共存于同一页面的第三方库对 Date.now 的重定义- rrdom@2.0.0-alpha.9
- rrweb-snapshot@2.0.0-alpha.9
- @rrweb/types@2.0.0-alpha.9
2.0.0-alpha.8
次要变更
#1129
979d2b1感谢 @eoghanmurray! - 点击事件现在包含.pointerType属性,用于区分 'pen'、'mouse' 和 'touch' 事件。没有新增 PenDown/PenUp 事件,但可以通过 MouseDown/MouseUp + pointerType=pen 检测它们#1188
bc84246感谢 @benjackwhite! - feat:扩展 maskInputFn,将 HTMLElement 传递给决策函数
补丁变更
#1198
b5e30cf感谢 @charliegracie! - 在 Controller 的goto中(而非handleProgressClick中)重置 finished 标志,以便在直接调用goto时也能正确处理。更新依赖 [
979d2b1,bc84246,d0fdc0f]:- @rrweb/types@2.0.0-alpha.8
- rrweb-snapshot@2.0.0-alpha.8
- rrdom@2.0.0-alpha.8
2.0.0-alpha.7
次要变更
补丁变更
#1179
e0f862b感谢 @wfk007! - 修复:#1178 移除构建时与 worker_threads 相关的警告#1186
267e990感谢 @YunFeng0817! - 修复:即使在不需要录制器的环境中也会创建 processed-node-manager 的问题#1145
a82a3b4感谢 @eoghanmurray! - 对于移除节点的变更,考虑到可能是祖先节点(而不仅是父节点)刚被移除,减少误报警告的数量#1191
1e6f71b感谢 @Juice10! - 调用 replayer.pause(...) 时,随 mouse up 和 mouse down 事件触发鼠标移动与悬停。#1163
4cb4d0e感谢 @zhaobosky! - 修复:部分网站重建不完整- 部分网站中,emit 函数里的 addedSet 不为空,但 Array.from 转换的结果为空。
- 部分网站 polyfill 了 HTML 元素的 classList 方法,其实现可能抛错并导致快照失败。我添加了 try-catch 语句使代码更健壮。
- rrweb-snapshot@2.0.0-alpha.7
- rrdom@2.0.0-alpha.7
- @rrweb/types@2.0.0-alpha.7
2.0.0-alpha.6
补丁变更
#1156
e65465e感谢 @Code-Crash! - 修复会被 Microbundle 改写的语句#1139
f27e545感谢 @YunFeng0817! - 修复:在重建全量快照之前从虚拟 DOM 切换到真实 DOM#1130
f6f07e9感谢 @Equlnox! - 修复:内联样式表时,使样式表 URL 的相对路径检测能够识别更多类型的 URL 协议。#1141
3416c3a感谢 @YunFeng0817! - 修复:所有全量快照事件中遗漏 isCheckout 的问题#1136
aaabdbd感谢 @benjackwhite! - fix:修复 console 录制时递归记录日志的 bug#1159
5e6c132感谢 @eoghanmurray! - 针对使用 userTriggeredOnInput 设置的用户:在 Input 属性修改时也将 userTriggered 设为 false;此前 IncrementalSource.Input 的这一变体中该值为空更新依赖 [
c28ef5f,f6f07e9,eac9b18,f27e545,8e47ca1]:- rrweb-snapshot@2.0.0-alpha.6
- rrdom@2.0.0-alpha.6
- @rrweb/types@2.0.0-alpha.6
2.0.0-alpha.5
补丁变更
#1095
1385f7a感谢 @YunFeng0817! - 修复 shadow DOM 重复的问题#1126
227d43a感谢 @YunFeng0817! - 将所有使用 commonjs 模块的打包脚本后缀从 'js' 重构为 cjs #1087。#1126
227d43a感谢 @YunFeng0817! - 修复:提升 rrdom 的健壮性 #1091。#1127
3cc4323感谢 @YunFeng0817! - 重构:在超大基准用例中将性能提升 80%。- 重构:将 childNodes 的数据结构从数组改为链表
- 提升 “contains” 函数的性能。新算法会将复杂度从 O(n) 降至 O(logn)
#1121
502d15d感谢 @YunFeng0817! - 修复:过时的 ':hover' 样式无法从 iframe 或 shadow DOM 中移除的问题#1122
8d209a6感谢 @YunFeng0817! - 手动补充缺失的变更日志。从下个版本开始,所有变更日志将自动生成。a220835#1053 感谢 @Juice10! - 修复:postMessage 可能中断跨域 iframe 录制的问题。7e8dcdb#1063 感谢 @lele0108! - 修复:muted 从 false 变为 true 未被设置的问题。36b44e1#1042 感谢 @wfk007! - 修复:在 Node 上执行 insertBefore 失败的问题。03821d9#1083 感谢 @eoghanmurray! - 统一为单一的 getWindowScrolld08913d#1086 感谢 @YunFeng0817! - 修复:checkout 全量快照中遗漏 shadow DOM 的 adopted style sheets 的问题。57a2e14#1088 感谢 @mydea! - 修复:防范 window.CSSStyleSheet 缺失的情况。fc82869#1093 感谢 @YunFeng0817! - 修复:跨域 iframe 的 bug。a77e302#1104 感谢 @jlalmes! - [console-plugin] Feat:录制未处理的 rejection 事件。0732618#1100 感谢 @YunFeng0817! - 修复:特殊 iframe 中 rootId 值错误的问题。3caa25e#1098 感谢 @eoghanmurray! - 重构:实时模式下不再让 requestAnimationFrame 在后台循环。3a26e36#1092 感谢 @YunFeng0817! - 修复:问题回归:ShadowHost 不能是字符串(issue 941)07d22e7#1111 感谢 @YunFeng0817! - Feat:支持在回放器中自定义 logger。0627d4d#1109 感谢 @YunFeng0817! - Feat:新增在 DOMContentLoaded 事件时开始录制的选项。174b9ac#1112 感谢 @YunFeng0817! - 修复:变更报错 Failed to execute 'insertBefore' on 'Node': Only one doctype on document allowed。
更新依赖 [
1385f7a,227d43a,227d43a,3cc4323]:- rrweb-snapshot@2.0.0-alpha.5
- rrdom@2.0.0-alpha.5
- @rrweb/types@2.0.0-alpha.5
1.0.0
次要变更
- 支持录制同源的未沙箱化 iframe。
- 支持录制 open 模式的 shadow DOM。
- 实现插件 API。
- 将
record.takeFullSnapshot作为公共 API 导出。 - 录制并回放拖拽事件。
- 新增文本脱敏选项(#540)。
补丁变更
- 在 Angular patch 了 MutationObserver 时获取原始的 MutationObserver。
- 修复 RangeError: Maximum call stack size exceeded(#479)。
- 修复录制器中的链表实现。
- 播放器暂停时不执行新添加的动作(#539)。
- 修复鼠标位置不准确的问题(#522)。
重大变更
- 废弃
rrweb.mirror的用法,请改用record.mirror和replayer.getMirror()。 - 废弃内置的 console 录制和回放选项。请参阅 console 指南中的插件 API。