rrweb 集成方案

🗺️ 总体架构概览

在这里插入图片描述


🛠️ 前端录制 SDK 封装

在这里插入图片描述

1. 安装依赖

npm install rrweb lz-string

2. 封装录制逻辑(rrweb-recorder.ts

import { record } from 'rrweb';
import { compressToUTF16 } from 'lz-string';

let events: any[] = [];

export function startRecording(sessionId: string) {
  record({
    emit(event) {
      events.push(event);

      if (events.length >= 50) {
        flush(sessionId);
      }
    },
    checkoutEveryNms: 15_000,
    checkoutEveryNth: 100,
  });
}

function flush(sessionId: string) {
  const compressed = compressToUTF16(JSON.stringify(events));
  fetch('/api/rrweb/upload', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ sessionId, data: compressed }),
  });
  events = [];
}

3. 集成入口(示例)

import { startRecording } from './rrweb-recorder';

const sessionId = generateSessionId(); // UUID or traceId from error tracker
startRecording(sessionId);

📥 服务端存储与处理(Node.js 示例)

1. 接收压缩数据并解压

import express from 'express';
import { decompressFromUTF16 } from 'lz-string';

const app = express();
app.use(express.json());

app.post('/api/rrweb/upload', async (req, res) => {
  const { sessionId, data } = req.body;
  const decompressed = JSON.parse(decompressFromUTF16(data));

  await saveToDatabase(sessionId, decompressed);
  res.sendStatus(200);
});

2. 数据库存储结构(Mongo 示例)

{
  sessionId: 'abc-123',
  timestamp: ISODate(),
  userId: 'user-1',
  events: [...],
  pageUrl: 'https://yourapp.com/xxx',
  errorLogId: 'err-xyz' // optional
}

🔒 安全性与隐私注意事项

项目建议
输入字段默认已脱敏 <input type="password">
敏感路径录制前过滤 DOM(如 .credit-card
鉴权上传接口需用户登录 + 权限验证
回放权限后台地址建议加签 + IP 限制

📺 回放页面封装

1. 安装 player

npm install rrweb-player

2. 回放页面 HTML(player.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>rrweb 回放</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/rrweb-player/dist/style.css" />
  </head>
  <body>
    <div id="player"></div>

    <script src="https://cdn.jsdelivr.net/npm/rrweb-player"></script>
    <script>
      fetch(`/api/rrweb/session?sessionId=abc-123`)
        .then((res) => res.json())
        .then(({ events }) => {
          new rrwebPlayer({
            target: document.getElementById('player'),
            props: {
              events,
              showController: true,
            },
          });
        });
    </script>
  </body>
</html>

📌 常见优化建议

问题建议
回放不准确保事件按时间戳排序
数据过大结合 lz-string 或 gzip 压缩
播放卡顿分段加载播放(如分页加载)
回放延迟高将录制逻辑放入 Web Worker

✅ 小结

rrweb 是一个极具价值的用户行为分析工具,其企业级应用关键在于:

  • 安全压缩 + 高效上传
  • 鉴权保护 + 数据解耦
  • 回放工具 UI 友好
  • 与监控/客服/分析平台打通

实用小工具

App Store 截图生成器应用图标生成器在线图片压缩Chrome插件-强制开启复制-护眼模式-网页乱码设置编码
乖猫记账,AI智能分类的聊天记账。


### rrweb 使用指南与集成方式 rrweb 是一个用于记录和重播用户网页交互行为的强大工具。以下是关于其使用方法和集成方式的详细说明。 #### 1. 集成方式 推荐通过 CDN 方式快速集成 rrweb,这种方式简单且易于维护[^2]。在 HTML 文件中引入以下代码即可完成基本集成: ```html <!-- 引入样式文件 --> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/rrweb@latest/dist/style.css"/> <!-- 引入核心库 --> <script src="https://cdn.jsdelivr.net/npm/rrweb@latest/dist/rrweb.umd.min.cjs"></script> ``` #### 2. 基本使用流程 - **初始化记录器**:创建一个 rrweb 实例并开始记录用户操作。 - **保存数据**:将捕获的事件序列存储到服务器或本地数据库中。 - **回放记录**:通过 rrweb-player 提供的播放器实现交互记录的重播。 以下是一个简单的记录与回放示例: ```javascript // 初始化记录器 const recorder = rrweb.record({ emit(event) { // 将事件发送到后端或其他存储位置 console.log('Captured event:', event); }, }); // 停止记录 function stopRecording() { recorder.destroy(); } // 回放记录 function replay(events) { const player = new rrweb.Player({ target: document.getElementById('replay-container'), // 指定回放容器 data: events, // 传递捕获的事件序列 }); } ``` #### 3. 核心功能模块 rrweb 的功能主要由以下几个部分组成[^3]: - **rrweb-snapshot**:负责将 DOM 转化为可序列化的数据结构,并能重建这些快照。 - **rrweb**:包含记录(record)和重播(replay)功能,捕捉 DOM 中的所有变化并按时间戳执行。 - **rrweb-player**:提供友好的用户界面,支持暂停、快进等功能。 #### 4. 技术特点 - **轻量级**:压缩后的库大小极小,适合各种性能要求的项目。 - **实时性强**:记录与重播几乎无延迟,高度还原真实体验。 - **可扩展性**:支持插件系统,如 XHR、fetch、GraphQL 等集成。 - **类型安全**:基于 TypeScript 编写,确保类型检查和 API 稳定性。 #### 5. 应用场景 rrweb 广泛应用于以下领域: - **用户体验优化**:记录用户在应用中遇到的问题,便于开发团队复现并解决。 - **A/B 测试**:比较不同版本页面的行为差异,提升转化率。 - **教学与教程**:创建互动式教程,让用户亲手操作学习。 - **自动化测试**:生成真实的用户交互数据,辅助端到端测试。 #### 6. 项目目录结构 在 rrweb 项目的根目录中,主要包含以下关键部分[^5]: - `packages`:存放各种子包的目录,例如 `rrweb-snapshot`, `rrweb-player` 等。 - `.github`:包含 GitHub 仓库的元数据,如工作流定义。 - `docs`:文档目录,提供了详细的项目指南与介绍。 - `test`:测试文件存放目录。 - `scripts`:自动化脚本文件存放目录。 如果在安装或配置过程中遇到任何问题,可以参考项目的 GitHub 页面或社区文档获取更多帮助[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@井九

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值