您现在的位置是:首页>博客详情

基于rrweb实现前端异常视频录制与回放功能

FreshMan2022年03月15日 15:40rrweb,前端录屏,回放1430

简介日常开发过程中,面对线上问题,常见的两个痛点,一个是用户操作在自己的机器上,开发者无法还原用户触发异常的场景,另一个,由于混淆和压缩代码,导致线上报错在控制台打印的堆栈信息,无法将异常定位到代码源码.这次我们来讨论下异常视频回放的解决方案.

1、rrweb 是什么?

web 端录制回放的一个基础库,即记录页面中的 DOM 结构还有用户操做行为,在远程实现回放。rrweb 其实实现了 录制页面为用户的操做,回放页面则是根据数据回放用户的操做行为功能的一个库。

2、适用场景

  • 记录⽤户使⽤产品的⽅式并加以分析,进⼀步优化产品。

  • 采集⽤户遇到 bug 的操做路径,予以复现。

  • 记录 CI 环境中的 E2E 测试的执⾏状况。

  • 录制体积更⼩、清晰度⽆损的产品演⽰。

3、录制回放基本原理

这一块能够简单地理解为 “快照 + 操做指令”, 通常记录页面状态,咱们能够根据时间记录每一时刻页面的 DOM状态,回放的时候根据时间点显示便可,可是通常一个页面DOM 数据是很庞大的。

所以 rrweb 采起了另一种方式,记录初始页面的DOM 状态,或者特定某个时刻的DOM 状态,后续收集的是不一样时间点的操做指令 或者 某个时刻 某个DOM 的变化做为一个增量快照,在原先快照的基础上,不断加入根据行为解析的DOM 数据,构建了后续的快照,减小大量数据的存储或传输。

4、使用 rrweb 应注意的问题

  • 数据量大的问题

  • 数据安全问题 关于数据大的问题,其实rrweb 内部有作了一些处理,好比:

  • 根据DOM 变化或者有特定的用户操做行为时才收集数据;

  • 数据切片,分片不是单个数据的分片,而是如何把一天的数据或者是连续不刷新页面的数据进行分片,在rrweb里叫snapshot,好比每隔10分钟或者数据超过必定大小以后,进行一次数据分片,能够分开存储,这样在播放的时候,能够获取某一段的数据,不用播放一成天的。

  • 节流,对于鼠标移动,页面滚动事件进行了节流

除此之外,可本身对收集到的数据进行处理

  • 压缩数据,尝试过用 pako.js 进行压缩

  • 将数据切片保存在不一样的文件存储在云服务器,在播放的时候拉取文件整合数据再播放(这里只是一个想法,还没验证是否可行)

使用rrweb示例见附件。其开源地址为:https://github.com/rrweb-io/rrweb

在vuejs项目中使用简单示例如下:

template:

<el-cardshadow="never"class="aui-card--fill">

      <divclass="rrweb-create">

        <el-button @click="get_start">开始录制</el-button>

        <el-button @click="playback">回放录制</el-button>

      </div>

      <divid="replaycontent"style="width:1000px;height:500px;"></div>

    </el-card>

script:

import { record } from'rrweb'

import'rrweb-player/dist/style.css'

importrrwebPlayerfrom'rrweb-player'


letevents= []

get_start() {

      let_this=this

      events=[]

      this.stopFn=record({

        emit(event) {

          events.push(event)

          if (events.length>900) {

            _this.stopFn()

          }

        }

      })

    },

    playback() {

      newrrwebPlayer({

        target: document.getElementById('replaycontent'),

        data: {

          events,

        }

      })

    }

展示效果如下:

GIF 2022-3-22 10-43-24.gif

下载地址:

文件名称:rrweb示例.zip

文件大小:1KB

更新日期:2022/03/15