在我长期的固有认知中:为了收集和上报网站交互过程中 JavaScript
的报错信息和其它相关数据,我们一般会采用自研或者第三方的SDK
,也可以简单理解为埋点
。这也是为了方便生产问题的排查,做到可溯源。
但是,在前一段,和隔壁组的同事交流时,我发现了一个有点东西
的系统--Rejouer
。这个系统可以做到完整复现用户的操作行为,类似于录屏
的功能,起初我还真的以为他们就是给我放了一个录屏
,后来发现没那么简单。
本文也是在和这位同事探讨的过程中得到的一些启发。
不要重复造轮子!
这是我一直以来的信念。轮子的出现必定是要为业务服务。那么Rejouer
出现的背景是什么呢?
我们来回顾一下日常处理线上问题的场景:
上面图片中的是一个正常处理线上问题的流程。我们一般会通过之前埋入的一些业务打点,根据用户uid
去追溯问题,这样基本可以解决大部分的线上问题。但在实际的业务场景中,总是会出现一些奇奇怪怪的问题:
环境差异
:客户版本和配置差异内容传递不完整
:在上图第 2 步中,出现信息传递不对称,造成问题无法复现敏感性
:上图第 4 步中出现本地无法复现,咨询客户,但又涉及较为私密的信息,用户不愿录屏复现的场景客户数据差异
:即使用户愿意录屏,但可能由于服务抖动,用户此时再次走流程也无法复现除了上面提到的这些问题,还有一个影响线上问题解决速度最致命
的:链路过长!!
由此可见定位问题的痛点也是足够多。
上面提到了那么多的业务痛点,那么为了解决这些问题,我们肯定期望能有这么一个系统:
有了上面的需求,下面让我们来做下技术调研,看如何进行实现。
初期的调研,探寻了 5 种可行的方案:
我们一一来进行分析。
首先简单了解一下webRTC
:它是一套客户端点对点流式信息传播的技术方案。
其不仅可以用于「音视频录制、视频通话」,还可以用在「照相机、音乐播放器、共享远程桌面、即时通信工具、P2P 网络加速、文件传输、实时人脸识别」等场景上。
但我们来看下它的兼容性情况:
不支持 IE,这个就有点不太友好了,而且是完全不支持(毕竟我们还是有部分的用户在使用IE
浏览器的 )
除了兼容性之外,还有另外一个问题:webrtc
在启动能力前,会有原生的chrome
窗口弹出来询问用户,且在开启getDisplayMedia
之后会有一个状态条,所以在整个的操作中会有一些生硬,用户有明显的知道自己的屏幕正在被录制。
显然针对这种场景,更适合用在测试场景下,或者明确授权情况下。也不符合我们的需求。
puppeteer
是谷歌官方出品的一个通过 DevTools
协议控制 headless Chrome
的 Node
库,我们可以通过 puppeteer
提供的 API
直接控制 Chrome
,进而模拟大部分用户在浏览器上的操作,来进行 UI Test
或者作为爬虫访问页面来收集数据。
但puppeteer
主要的问题是它强依赖于Chromium
,客户操作也较为复杂。
因此也不是太符合我们的设定。
简单来说:浏览器插件就是一个用Web
技术开发、用来增强浏览器功能的软件。
正如其名,由于浏览器厂商多样性,其开发适配成本也不低。同时还伴随着诸如权限、培训使用等问题。
也不符合我们的需求。
利用Canvas
截图,使用 html2Canvas
库,不停的画页面然后不停的截图,再将图片组成视频播放出来。
这种也是我首先想到的方案,不过在脑海里没有停留多久,就被否决了:性能太差了!!
而且还存在诸如图片跨域兼容性问题。
好家伙,找了这么久,一个能用的都没有。把我都给整不会了
冷静的分析一波:其实还有一个 API:MutationObserver
。该接口提供了监视对 DOM 树所做更改的能力。我们可以利用这个接口,保存每次变化的DOM
数据,并把这些数据转换成可视化的数据结构,然后分别保存起来。接着使用特定的方式对之前保存起来的DOM
数据进行还原并重新渲染出来。DOM
节点的变化也就意味了页面轨迹发送了变化。这样就可以把这些轨迹记录下来。
理想很丰满,现实真的挺残酷!
真正自己去落地时还是遇到很多问题的,包括其中的很多细节,那么类似的社区里面有没有开源的解决方案呢?
你别说,还真有:rrweb
打开rrweb[1]官方地址:
诚如所言:rrweb
是一个开源的 Web 会话回放库
,它提供易于使用的 API
来记录用户的交互并远程回放。
再看首页右侧的录制回放演示。
这不就是我们想要的吗?
体验了一波之后,我感觉rrweb
基本能满足我们的业务诉求了:
关于
rrweb
的基本使用,这里不会赘述,可参考rrweb 官方使用指南[2]
rrweb
内部做了什么?回想我们起初做的一些调研,都没有成功落地。最终Rejouer
的落地也是基于rrweb
做了很多适配自身业务的封装。
本文后半部分更多是来探讨
rrweb
,Rejouer
由于是内部项目,更多细节暂时不便透露
对于rrweb
内部的一些实现,我们还是比较好奇的。下面我准备深入去挖掘他的内部实现细节。
既然要分析它的内部运作流程,那么有几个前置的知识点需要提前同步一下:
⻚⾯中的视图状态可以通过 DOM
树的形式描述,所以当我们尝试录制⼀个⻚⾯时,我们实际上是在记录 DOM
树在各个时间点上的状态,在 rrweb
中我们称⼀次这样的状态记录为⼀个快照。
定时快照的概念相对比较好理解:定时对⻚⾯制作快照完成录制。
但有很大的弊端:
所以产生了增量快照的概念。
其实我们可以只在页面初始化
完成之后 clone
一次完整的页面内容,等到页面有变动的时候,只记录变化
的部分。这样一来,好处就显而易见了:
这里提到了只记录变化的部分
,那这个变化
又该怎么去衡量呢?
我们可以暂且把这种变化称为视图变更
。
引发视图变更的操作大致有:
DOM 变动
节点创建、销毁
节点属性变化
⽂本变化
⿏标交互
⻚⾯或元素滚动
视窗⼤⼩改变
输⼊
⿏标移动(特指⿏标的视觉位置)
这里的DOM 变动
我们可以采用MutationObserver
来监听,它会以批量的方式返回 dom 的更新记录
。
但是它没法跟踪像 input
、textarea
、select
这类可交互元素的输入。
对于这种可交互的元素,我们主要靠监听 input
和 change
来记录输入的过程。
但是有些元素的值是通过程序直接设置的,这样是不会触发 input
和 change
事件的。这种情况下我们可以通过劫持对应属性的 setter
来达到监听的目的。
ok,有了这些知识,下面我们就来看一下rrweb
的运行流程吧。
这里可以简单用一张图来概括:
在 DOM
加载完成后,record
会做一次完整的 DOM
序列化,我们把它叫做全量快照
,全量快照记录了整个 HTML
数据结构。
然后在页面发生视图变动时(DOM 变化和用户操作),记录增量数据,完成页面的录制,然后保存到远程服务器。
回放时会先创建沙箱环境,接着重建全量快照
,在通过 requestAnimationFrame
模拟定时器的方式来播放增量快照。
本文主要整理了在后埋点时代
针对业务中一些难复现、易引起客户纠纷的一些场景,在页面录制/回放
道路上的探索过程。探讨了几种解决方案的利弊,最终也是基于社区非常优秀的rrweb
做的封装。同时也分析了一下rrweb
的核心实现。关于rrweb
更多细节的探讨可参考rrweb:打开 web 页面录制与回放的黑盒子[3] 。
本文由哈喽比特于3年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/5eeuNUbCh8nRK5wwr5LoSQ
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。