# 序列化 如果仅仅需要在本地录制和回放浏览器内的变化,那么我们可以简单地通过深拷贝 DOM 来实现当前视图的保存。例如通过以下的代码实现(使用 jQuery 简化示例,仅保存 body 部分): ```javascript // record const snapshot = $('body').clone(); // replay $('body').replaceWith(snapshot); ``` 我们通过将 DOM 对象整体保存在内存中实现了快照。 但是这个对象本身并不是**可序列化**的,因此我们不能将其保存为特定的文本格式(例如 JSON)进行传输,也就无法做到远程录制,所以我们首先需要实现将 DOM 及其视图状态序列化的方法。在这里我们不使用一些开源方案例如 [parse5](https://github.com/inikulin/parse5) 的原因包含两个方面: 1. 我们需要实现一个“非标准”的序列化方法,下文会详细展开。 2. 此部分代码需要运行在被录制的页面中,要尽可能的控制代码量,只保留必要功能。 ## 序列化中的特殊处理 之所以说我们的序列化方法是非标准的是因为我们还需要做以下几部分的处理: 1. 去脚本化。被录制页面中的所有 JavaScript 都不应该被执行,例如我们会在重建快照时将 `script` 标签改为 `noscript` 标签,此时 script 内部的内容就不再重要,录制时可以简单记录一个标记值而不需要将可能存在的大量脚本内容全部记录。 2. 记录没有反映在 HTML 中的视图状态。例如 `` 输入后的值不会反映在其 HTML 中,而是通过 `value` 属性记录,我们在序列化时就需要读出该值并且以属性的形式回放成 ``。 3. 相对路径转换为绝对路径。回放时我们会将被录制的页面放置在一个 `