# 介绍

rrweb 是一种通过记录页面 dom 元素的变化,以及鼠标或者键盘输入的变化,来实现 web 操作的录制回放的功能。
官网在这里:rrweb
源码在这里:https://github.com/rrweb-io/rrweb

# 在 vue 中使用

# 新建 vue3 项目

npm install -g @vue/cli
vue create rrweb-vue-demo

# 创建两个路由页面

分别用来录制操作和回放操作

import * as Router from "vue-router";  
  
const routes = [  
    {path:'/',component: import("../Record.vue")},  
    { path: '/play', component: import("../Play.vue") },  
]  
  
export const router = Router.createRouter({  
    // 4. 内部提供了 history 模式的实现。为了简单起见,我们在这里使用 hash 模式。  
    history: Router.createWebHashHistory(),  
    routes, // `routes: routes` 的缩写  
})

# 录制和播放

# 安装 rrweb

npm install rrweb rrweb-player

# 录制

这里录制 20s 自动停止,你也可以改成手动停止

<template>  
  <button @click="startRecord">开启记录</button>  
  <HelloWorld msg="Vite + Vue" />  
  <button @click="gotoPlay">前往回放</button>  
</template>  
  
<script setup  lang="ts">  
import HelloWorld from './components/HelloWorld.vue'  
import * as rrweb from "rrweb";  
import {useRouter} from "vue-router";  
const startRecord = () => {  
  //record() 方法启动录制  
  //stopFn为暂停录制的方法  
  let stopFn = rrweb.record({  
    //12秒后停止页面的录制,如果想一直录得话可以去掉。  
    emit(event) {  
      setTimeout(() => {  
        stopFn();  
      }, 20000);  
      // 用任意方式存  储 event      // store.commit("updateEvents", { event: event });      let eventList: any[] = JSON.parse(localStorage.getItem("events"))  
      if (eventList == null){  
        eventList = [event]  
      }else{  
        eventList.push(event)  
      }  
      localStorage.setItem("events",JSON.stringify(eventList))  
  
      // lo  
      console.log(event)  
    },  
  });  
  console.log("开启记录")  
};  
  
const route = useRouter()  
const gotoPlay = ()=>{  
  
  console.log(route)  
  route.push("/play")  
}  
  
</script>  
  
<style scoped>  
  
</style>

# 回放

<template>  
  <button @click="startPlay">回放</button>  
  <div class="counte">  
    <div id="playback"></div>  
  </div></template>  
  
<script lang="ts" setup>  
import rrwebPlayer from "rrweb-player";  
import "rrweb-player/dist/style.css"  
import {ref} from "vue";  
  
const player = ref(null)  
const startPlay = ()=>{  
  const events = JSON.parse(localStorage.getItem("events"))  
  player.value = new rrwebPlayer({  
    target: document.getElementById("playback"),  
    props:{  
      events:events,  
      speedOption:[1,2,5,10]  
    }  
  })  
}  
  
</script>  
  
<style scoped>  
  
</style>

# 用途

# 自动化测试

对于 web 的项目,可以预先录制一份操作数据。
然后测试时通过回放操作来进行回放。
不过如何发现测试中的错误,我还没有深入研究。
当然,如果要进行自动化测试,前端还有很多自动化的工具可以使用,这个未必好用。

# bug 复现

这个应该是 rrweb 最重要的功能。
线上如果出现 bug,可以利用 rrweb 录制的结果去回放 bug 现场。什么时机判断出现了 bug 呢?可以让用户一键上报,也可以进行埋点,发现问题就自动上报。

# 操作说明

一些需要教育用户的复杂操作,可以通过 rrweb 录制一份操作指南,让用户去观看学习。

# 其他

其他

# !! 注意事项

因为回放的原理是通过 iframe 加载网页,来回放操作,如果录制时和回放时的内容不一样,那就 game over 了

更新于 阅读次数