top | item 32660724

(no title)

Juice10 | 3 years ago

Core team member of rrweb here. rrweb and other tools that do user session recording heavily depend on the mutation observer https://developer.mozilla.org/en-US/docs/Web/API/MutationObs... to surface changes to a webpage, each of those changes gets serialized into a JSON event and get captured for later viewing. Apart from the things we can get directly from the Mutation Observer we also end up monkey patching things like the https://developer.mozilla.org/en-US/docs/Web/API/WebGLRender... and record each call that is done to it so that we can play those back in the same order for replay.

Before we do all of the diff recording we start with a full snapshot of the webpage which captures every dom node. And it does a lot more than just your plain old `document.documentElement.outerHTML`, it captures contents of style sheets, images, scroll positions etc.. We use those full snapshots as keyframes to base our diffs off of. This works in a similar way to how video files work, but the snapshots don't contain any pixel data, just DOM information.

On replay we go ahead and rebuild the DOM as close to how it was recorded and we then animate the changes as they occurred.

Let me know if you'd like some more detail on a specific part of any of this.

There is also a video which explains some of this which might be helpful: https://youtu.be/cWxpp9HwLYw?t=1163

discuss

order

punkpeye|3 years ago

Very interesting! I was thinking of using this to record test execution instead of recording mp4 videos – like Cypress does. Is there a reason rrweb would be a poor choice of this use case? Mostly trying to understand why Cypress is not doing this already.

Juice10|3 years ago

Only downside I can think of is if the assets (images, fonts etc) that are being linked to change at a later date, your replay might look odd. There are ways to cache these so it’s not the end of the world. Big upside is being able to inspect your DOM and easily reproduce exactly what broke