What is rrweb-snapshot?
The rrweb-snapshot npm package is a part of the rrweb suite, which is used for recording and replaying user interactions on web pages. The rrweb-snapshot package specifically focuses on taking snapshots of the DOM and serializing it into a format that can be used for replaying the recorded interactions.
What are rrweb-snapshot's main functionalities?
Snapshot the DOM
This feature allows you to take a snapshot of the current state of the DOM. The `snapshot` function serializes the DOM into a JSON format that can be used for replaying the recorded interactions.
const { snapshot } = require('rrweb-snapshot');
const domSnapshot = snapshot(document);
console.log(domSnapshot);
Rebuild the DOM
This feature allows you to rebuild the DOM from a previously captured snapshot. The `rebuild` function takes the serialized DOM snapshot and reconstructs it in a specified container.
const { rebuild } = require('rrweb-snapshot');
const domSnapshot = /* previously captured snapshot */;
const container = document.createElement('div');
rebuild(domSnapshot, { doc: document, afterAppend: (n) => container.appendChild(n) });
document.body.appendChild(container);
Other packages similar to rrweb-snapshot
puppeteer
Puppeteer is a Node library which provides a high-level API to control Chrome or Chromium over the DevTools Protocol. It can be used for taking screenshots, generating PDFs, and capturing the DOM state. Unlike rrweb-snapshot, Puppeteer is more focused on browser automation and testing rather than recording and replaying user interactions.
html2canvas
html2canvas is a JavaScript library that allows you to take 'screenshots' of webpages or parts of it, directly in the browser. It renders the webpage as a canvas image. While it can capture the visual state of the DOM, it does not serialize the DOM structure like rrweb-snapshot.
dom-to-image
dom-to-image is a library that generates an image from a DOM node. It is similar to html2canvas but offers more customization options. However, it focuses on capturing the visual representation of the DOM rather than its structure and state, which is the primary focus of rrweb-snapshot.
rrweb-snapshot
Snapshot the DOM into a stateful and serializable data structure.
Also, provide the ability to rebuild the DOM via snapshot.
API
This module export following methods:
snapshot
snapshot
will traverse the DOM and return a stateful and serializable data structure which can represent the current DOM view.
There are several things will be done during snapshot:
- Inline some DOM states into HTML attributes, e.g, HTMLInputElement's value.
- Turn script tags into
noscript
tags to avoid scripts being executed. - Try to inline stylesheets to make sure local stylesheets can be used.
- Make relative paths in href, src, CSS to be absolute paths.
- Give an id to each Node, and return the id node map when snapshot finished.
rebuild
rebuild
will build the DOM according to the taken snapshot.
There are several things will be done during rebuild:
- Add data-rrid attribute if the Node is an Element.
- Create some extra DOM node like text node to place inline CSS and some states.
- Add data-extra-child-index attribute if Node has some extra child DOM.
serializeNodeWithId
serializeNodeWithId
can serialize a node into snapshot format with id.
buildNodeWithSN
buildNodeWithSN
will build DOM from serialized node and store serialized information in __sn
property.