Files
rrweb/README.md
Justin Halsall 23388f2d00 Add gold sponsors (#1207)
* Add gold sponsors

* Create empty-bikes-cheer.md
2026-04-01 12:00:00 +08:00

202 lines
12 KiB
Markdown

<p align="center">
<img width="100px" height="100px" src="https://www.rrweb.io/favicon.png">
</p>
<p align="center">
<a href="https://www.rrweb.io/" style="font-weight: bold">Try rrweb</a>
</p>
# rrweb
**[The rrweb documentary (in Chinese, with English subtitles)](https://www.bilibili.com/video/BV1wL4y1B7wN?share_source=copy_web)**
[![Join the chat at slack](https://img.shields.io/badge/slack-@rrweb-teal.svg?logo=slack)](https://join.slack.com/t/rrweb/shared_invite/zt-siwoc6hx-uWay3s2wyG8t5GpZVb8rWg)
[![Twitter Follow](https://img.shields.io/badge/twitter-@rrweb__io-teal.svg?logo=twitter)](https://twitter.com/rrweb_io)
![total gzip size](https://img.badgesize.io/https://cdn.jsdelivr.net/npm/rrweb@latest/dist/rrweb.min.js?compression=gzip&label=total%20gzip%20size)
![recorder gzip size](https://img.badgesize.io/https://cdn.jsdelivr.net/npm/rrweb@latest/dist/record/rrweb-record.min.js?compression=gzip&label=recorder%20gzip%20size)
[![](https://data.jsdelivr.com/v1/package/npm/rrweb/badge)](https://www.jsdelivr.com/package/npm/rrweb)
[中文文档](./README.zh_CN.md)
> I have joined Github Sponsors and highly appreciate your sponsorship.
rrweb refers to 'record and replay the web', which is a tool for recording and replaying users' interactions on the web.
## Guide
[**📚 Read the rrweb guide here. 📚**](./guide.md)
[**🍳 Recipes 🍳**](./docs/recipes/index.md)
## Project Structure
rrweb is mainly composed of 3 parts:
- **[rrweb-snapshot](https://github.com/rrweb-io/rrweb/tree/master/packages/rrweb-snapshot/)**, including both snapshot and rebuilding features. The snapshot is used to convert the DOM and its state into a serializable data structure with a unique identifier; the rebuilding feature is to rebuild the snapshot into corresponding DOM.
- **[rrweb](https://github.com/rrweb-io/rrweb)**, including two functions, record and replay. The record function is used to record all the mutations in the DOM; the replay is to replay the recorded mutations one by one according to the corresponding timestamp.
- **[rrweb-player](https://github.com/rrweb-io/rrweb/tree/master/packages/rrweb-player/)**, is a player UI for rrweb, providing GUI-based functions like pause, fast-forward, drag and drop to play at any time.
## Roadmap
- rrdom: an ad-hoc DOM for rrweb session data [#419](https://github.com/rrweb-io/rrweb/issues/419)
- storage engine: do deduplication on a large number of rrweb sessions
- more end-to-end tests
- compact mutation data in common patterns
- provide plugins via the new plugin API, including:
- XHR plugin
- fetch plugin
- GraphQL plugin
- ...
## Internal Design
- [serialization](./docs/serialization.md)
- [incremental snapshot](./docs/observer.md)
- [replay](./docs/replay.md)
- [sandbox](./docs/sandbox.md)
## Contribute Guide
Since we want the record and replay sides to share a strongly typed data structure, rrweb is developed with typescript which provides stronger type support.
[Typescript handbook](https://www.typescriptlang.org/docs/handbook/declaration-files/introduction.html)
1. Fork this repository.
2. Run `yarn install` in the root to install required dependencies for all sub-packages (note: `npm install` is _not_ recommended).
3. Run `yarn dev` in the root to get auto-building for all the sub-packages whenever you modify anything.
4. Navigate to one of the sub-packages (in the `packages` folder) where you'd like to make a change.
5. Patch the code and run `yarn test` to run the tests, make sure they pass before you commit anything.
6. Push the code and create a pull request.
Protip: You can run `yarn test` in the root folder to run all the tests.
In addition to adding integration tests and unit tests, rrweb also provides a REPL testing tool.
[Using the REPL tool](./guide.md#REPL-tool)
## Sponsors
### Gold
[Become a sponsor](https://opencollective.com/rrweb#sponsor) and get your logo on our README on Github with a link to your site.
<div>
<a href="https://opencollective.com/rrweb/goldsponsor/0/website?requireActive=false" target="_blank"><img src="https://opencollective.com/rrweb/goldsponsor/0/avatar.svg?requireActive=false"></a>
<a href="https://opencollective.com/rrweb/goldsponsor/1/website?requireActive=false" target="_blank"><img src="https://opencollective.com/rrweb/goldsponsor/1/avatar.svg?requireActive=false"></a>
<a href="https://opencollective.com/rrweb/goldsponsor/2/website?requireActive=false" target="_blank"><img src="https://opencollective.com/rrweb/goldsponsor/2/avatar.svg?requireActive=false"></a>
<a href="https://opencollective.com/rrweb/goldsponsor/3/website?requireActive=false" target="_blank"><img src="https://opencollective.com/rrweb/goldsponsor/3/avatar.svg?requireActive=false"></a>
<a href="https://opencollective.com/rrweb/goldsponsor/4/website?requireActive=false" target="_blank"><img src="https://opencollective.com/rrweb/goldsponsor/4/avatar.svg?requireActive=false"></a>
<a href="https://opencollective.com/rrweb/goldsponsor/5/website?requireActive=false" target="_blank"><img src="https://opencollective.com/rrweb/goldsponsor/5/avatar.svg?requireActive=false"></a>
<a href="https://opencollective.com/rrweb/goldsponsor/6/website?requireActive=false" target="_blank"><img src="https://opencollective.com/rrweb/goldsponsor/6/avatar.svg?requireActive=false"></a>
<a href="https://opencollective.com/rrweb/goldsponsor/7/website?requireActive=false" target="_blank"><img src="https://opencollective.com/rrweb/goldsponsor/7/avatar.svg?requireActive=false"></a>
<a href="https://opencollective.com/rrweb/goldsponsor/8/website?requireActive=false" target="_blank"><img src="https://opencollective.com/rrweb/goldsponsor/8/avatar.svg?requireActive=false"></a>
<a href="https://opencollective.com/rrweb/goldsponsor/9/website?requireActive=false" target="_blank"><img src="https://opencollective.com/rrweb/goldsponsor/9/avatar.svg?requireActive=false"></a>
<a href="https://opencollective.com/rrweb/goldsponsor/10/website?requireActive=false" target="_blank"><img src="https://opencollective.com/rrweb/goldsponsor/10/avatar.svg?requireActive=false"></a>
<a href="https://opencollective.com/rrweb/goldsponsor/11/website?requireActive=false" target="_blank"><img src="https://opencollective.com/rrweb/goldsponsor/11/avatar.svg?requireActive=false"></a>
<a href="https://opencollective.com/rrweb/goldsponsor/12/website?requireActive=false" target="_blank"><img src="https://opencollective.com/rrweb/goldsponsor/12/avatar.svg?requireActive=false"></a>
<a href="https://opencollective.com/rrweb/goldsponsor/13/website?requireActive=false" target="_blank"><img src="https://opencollective.com/rrweb/goldsponsor/13/avatar.svg?requireActive=false"></a>
<a href="https://opencollective.com/rrweb/goldsponsor/14/website?requireActive=false" target="_blank"><img src="https://opencollective.com/rrweb/goldsponsor/14/avatar.svg?requireActive=false"></a>
<a href="https://opencollective.com/rrweb/goldsponsor/15/website?requireActive=false" target="_blank"><img src="https://opencollective.com/rrweb/goldsponsor/15/avatar.svg?requireActive=false"></a>
<a href="https://opencollective.com/rrweb/goldsponsor/16/website?requireActive=false" target="_blank"><img src="https://opencollective.com/rrweb/goldsponsor/16/avatar.svg?requireActive=false"></a>
<a href="https://opencollective.com/rrweb/goldsponsor/17/website?requireActive=false" target="_blank"><img src="https://opencollective.com/rrweb/goldsponsor/17/avatar.svg?requireActive=false"></a>
<a href="https://opencollective.com/rrweb/goldsponsor/18/website?requireActive=false" target="_blank"><img src="https://opencollective.com/rrweb/goldsponsor/18/avatar.svg?requireActive=false"></a>
<a href="https://opencollective.com/rrweb/goldsponsor/19/website?requireActive=false" target="_blank"><img src="https://opencollective.com/rrweb/goldsponsor/19/avatar.svg?requireActive=false"></a>
<a href="https://opencollective.com/rrweb/goldsponsor/20/website?requireActive=false" target="_blank"><img src="https://opencollective.com/rrweb/goldsponsor/20/avatar.svg?requireActive=false"></a>
<a href="https://opencollective.com/rrweb/goldsponsor/21/website?requireActive=false" target="_blank"><img src="https://opencollective.com/rrweb/goldsponsor/21/avatar.svg?requireActive=false"></a>
<a href="https://opencollective.com/rrweb/goldsponsor/22/website?requireActive=false" target="_blank"><img src="https://opencollective.com/rrweb/goldsponsor/22/avatar.svg?requireActive=false"></a>
<a href="https://opencollective.com/rrweb/goldsponsor/23/website?requireActive=false" target="_blank"><img src="https://opencollective.com/rrweb/goldsponsor/23/avatar.svg?requireActive=false"></a>
<a href="https://opencollective.com/rrweb/goldsponsor/24/website?requireActive=false" target="_blank"><img src="https://opencollective.com/rrweb/goldsponsor/24/avatar.svg?requireActive=false"></a>
<a href="https://opencollective.com/rrweb/goldsponsor/25/website?requireActive=false" target="_blank"><img src="https://opencollective.com/rrweb/goldsponsor/25/avatar.svg?requireActive=false"></a>
<a href="https://opencollective.com/rrweb/goldsponsor/26/website?requireActive=false" target="_blank"><img src="https://opencollective.com/rrweb/goldsponsor/26/avatar.svg?requireActive=false"></a>
<a href="https://opencollective.com/rrweb/goldsponsor/27/website?requireActive=false" target="_blank"><img src="https://opencollective.com/rrweb/goldsponsor/27/avatar.svg?requireActive=false"></a>
<a href="https://opencollective.com/rrweb/goldsponsor/28/website?requireActive=false" target="_blank"><img src="https://opencollective.com/rrweb/goldsponsor/28/avatar.svg?requireActive=false"></a>
<a href="https://opencollective.com/rrweb/goldsponsor/29/website?requireActive=false" target="_blank"><img src="https://opencollective.com/rrweb/goldsponsor/29/avatar.svg?requireActive=false"></a>
</div>
## Core Team Members
<table>
<tr>
<td align="center">
<a href="https://github.com/Yuyz0112">
<img
src="https://avatars.githubusercontent.com/u/13651389?s=100"
width="100px;"
alt=""
/>
<br /><sub><b>Yuyz0112</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/YunFeng0817">
<img
src="https://avatars.githubusercontent.com/u/27533910?s=100"
width="100px;"
alt=""
/>
<br /><sub><b>Yun Feng</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/eoghanmurray">
<img
src="https://avatars.githubusercontent.com/u/156780?s=100"
width="100px;"
alt=""
/>
<br /><sub><b>eoghanmurray</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/Juice10">
<img
src="https://avatars.githubusercontent.com/u/4106?s=100"
width="100px;"
alt=""
/>
<br /><sub><b>Juice10</b></sub>
</a>
</td>
</tr>
</table>
## Who's using rrweb?
<table>
<tr>
<td align="center">
<a href="http://www.smartx.com/" target="_blank">
<img width="195px" src="https://www.rrweb.io/logos/smartx.png">
</a>
</td>
<td align="center">
<a href="https://posthog.com?utm_source=rrweb&utm_medium=sponsorship&utm_campaign=open-source-sponsorship" target="_blank">
<img width="195px" src="https://www.rrweb.io/logos/posthog.png">
</a>
</td>
<td align="center">
<a href="https://statcounter.com/session-replay/" target="_blank">
<img width="195px" src="https://statcounter.com/images/logo-statcounter-arc-blue.svg">
</a>
</td>
<td align="center">
<a href="https://cux.io" target="_blank">
<img style="padding: 8px" alt="The first ever UX automation tool" width="195px" src="https://cux.io/cux-logo.svg">
</a>
</td>
</tr>
<tr>
<td align="center">
<a href="https://recordonce.com/" target="_blank">
<img width="195px" src="https://uploads-ssl.webflow.com/5f3d133183156245630d4446/5f3d1940abe8db8612c23521_Record-Once-logo-554x80px.svg">
</a>
</td>
<td align="center">
<a href="https://remsupp.com" target="_blank">
<img style="padding: 8px" alt="Remote Access & Co-Browsing" width="195px" src="https://remsupp.com/images/logo.png">
</a>
</td>
</tr>
</table>