前言
看到标题,大家会好奇,rrweb究竟是什么?rrweb是一个开源框架,目前主要用于web 屏幕录制和回放。利用rrweb,以及它future提案,将对bug收集,屏幕录制,自动化测试等等有非常大的作用。笔者看了官方对其的说明文章后,非常期待rrweb的后续发展,并且实践了一下rrweb与谷歌插件的集合,实现了对任意网页的屏幕录制与回放功能。
起步
通过阅读官方的使用指南,快速实现了一次屏幕录制和回放。然后思考怎么方便的实践。主要思路还是从解决用户怎么控制开启、停止、预览、存储方面考虑。一开始想着是直接在页面中添加对应的代码,发现这样的侵入性太大了,而且并非所有的用户都需要一部分功能,无效的资源则浪费,还增大用户的请求带宽。后来发现谷歌插件的开发思路非常符合我的需求。用户(开发、有问题的用户),安装谷歌插件后,通过热键录制,生成数据后可以观看回放,最后决定是否上传服务器。用户再将bug(问题)与该回放地址关联,指派给对应的开发解决问题。这样的流程非常的清晰,而且在代码层面上是毫无侵入感的,没有安装插件的用户对我们的系统是无感知的,拓展性很强不止单一系统可用,其他系统也可以使用这个插件完成屏幕录制。一处开发,处处使用。
主要逻辑思路
主要完成以下几个工作
- 开启录制
- 结束录制
- 数据压缩
- 数据保存(地址or服务器)
- 数据解压
- 回放录屏
通过监听F1键触发事件录制开启
document.querySelector('html').addEventListener('keydown', function keydown (e) {
if(e.keyCode === 112){
console.log('start',chrome);
alert('准备开始')
start()
}
})
function start(){
a = rrweb.record({
emit(event) {
// 将 event 存入 events 数组中
console.log('event')
events.push(event);
},
});
}
通过监听F2键触发事件录制停止
document.querySelector('html').addEventListener('keydown', function keydown (e) {
if(e.keyCode === 113){
console.log('stop');
stop();
alert('完成录制')
save();
e.stopImmediatePropagation();
}
})
function stop(){
a && a();
}
数据保存,数据压缩使用来pako库,至少压缩来3-4倍大小 插件本地存储和服务器接口存储都能够实现,本地存储可以考虑chrome.storage或者是localstorage或者数据量比较大可以使用indexDB
function zip(str){
var binaryString = pako.gzip(str, { to: 'string' });
return btoa(binaryString);
}
function save(){
if ( events.length === 0) return;
const data = zip(JSON.stringify(events))
const body = JSON.stringify({ data });
chrome.storage.local.get({data: []}, function(items) {
const d = items.data
const newData = body;
d.push({data:newData, time: new Date()})
chrome.storage.local.set({data: d}, function() {
console.log('保存成功!');
});
});
events = [];
return;
fetch('http://127.0.0.1:7001/review/add', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body,
});
}
录制数据的回放则是使用官方的播放器rrwebPlayer
id = ? // 携带的ID
chrome.storage.local.get({data: []}, function(items) {
const d = items.data
console.log('读取成功!', d);
const events = JSON.parse(unzip(JSON.parse(d[id].data).data));
console.log(JSON.stringify(events))
new rrwebPlayer({
target: document.body, // 可以自定义 DOM 元素
data: {
events,
},
})
});
这样回放的数据流就简单的说明了,大家应该比较明白屏幕录制到观看回放实践的过程了。具体的代码等笔者完善后,将一次提供。