rrweb 是一个js库,可以对 html 的操作进行录制抓取和还原播放,
在使用 rrweb 对event事件数据进行还原时,可能会出现一个问题,字体图标资源获取跨域
问题分析
以录制 element-ui 官网为例,还原 html 视频时,图标会显示方框
出现该问题的原因是: 浏览器获取字体图标资源跨域,element 的服务器不允许在该 html 请求而跨域
解决方案
由于服务器是 element 的,而不是我们自己的,无法在服务器中允许浏览器的请求,所以解决的方式只有两种:
- 还原时,不使用url的方式去请求
- 使用服务器去请求 element 服务器上的资源,再将数据返回给前端
方案1
还原时,不使用url的方式去请求,前端在录制 html 的时候,可以将字体图标资源处理为base64的格式,然后再去使用 rrweb 录制,还原的时候,rrweb时间数据将不带url,而是直接获取到图标资源的base64的数据去解析
优点:没有兼容问题,在前端录制时能够显示的图标,说明还原时也能够显示
缺点:在前端处理的话,每次开发不同的项目都需要做这种特殊处理,不够灵活
方案2
所以可以考虑在还原 html 时做处理,可以在 node 服务器中请求 element 服务器上的图标资源,然后将其转成base64的数据,再去启动无头浏览器去还原,
优点:不需要所有的项目的前端去处理,统一在 node 服务器处理
缺点:对 rrweb 的原始数据处理,如果处理不当(正则匹配错误或错误地添加了字符等),会出现新的bug
方案2需要注意的点
- 正则匹配时,需要过滤 url 中的 base64数据
eventsJson.match(/@font-face((?!base64).)+?\}/g)
- 注意处理 mime 类型
res = fontMap[type] + ';charset=utf-8;base64,' + base64Data;
- 需要跳过或处理特殊的 url
url = '//at.alicdn.com/t/font_1031158_u69w8yhxdu.ttf?t=1630033759944'
以上是阿里巴巴的标库 url,不带http/https,注意需要做特殊处理