Perf: Apply the latest text mutation only (#885)
* Perf: apply the latest text mutation only * Find unique text mutations in one iteration
This commit is contained in:
@@ -52,6 +52,7 @@ import {
|
|||||||
getBaseDimension,
|
getBaseDimension,
|
||||||
hasShadowRoot,
|
hasShadowRoot,
|
||||||
isSerializedIframe,
|
isSerializedIframe,
|
||||||
|
uniqueTextMutations,
|
||||||
} from '../utils';
|
} from '../utils';
|
||||||
import getInjectStyleRules from './styles/inject-style';
|
import getInjectStyleRules from './styles/inject-style';
|
||||||
import './styles/style.css';
|
import './styles/style.css';
|
||||||
@@ -179,9 +180,10 @@ export class Replayer {
|
|||||||
this.fragmentParentMap.forEach((parent, frag) =>
|
this.fragmentParentMap.forEach((parent, frag) =>
|
||||||
this.restoreRealParent(frag, parent),
|
this.restoreRealParent(frag, parent),
|
||||||
);
|
);
|
||||||
|
|
||||||
// apply text needs to happen before virtual style rules gets applied
|
// apply text needs to happen before virtual style rules gets applied
|
||||||
// as it can overwrite the contents of a stylesheet
|
// as it can overwrite the contents of a stylesheet
|
||||||
for (const d of mutationData.texts) {
|
for (const d of uniqueTextMutations(mutationData.texts)) {
|
||||||
this.applyText(d, mutationData);
|
this.applyText(d, mutationData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1613,7 +1615,7 @@ export class Replayer {
|
|||||||
Object.assign(this.legacy_missingNodeRetryMap, legacy_missingNodeMap);
|
Object.assign(this.legacy_missingNodeRetryMap, legacy_missingNodeMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
d.texts.forEach((mutation) => {
|
uniqueTextMutations(d.texts).forEach((mutation) => {
|
||||||
let target = this.mirror.getNode(mutation.id);
|
let target = this.mirror.getNode(mutation.id);
|
||||||
if (!target) {
|
if (!target) {
|
||||||
if (d.removes.find((r) => r.id === mutation.id)) {
|
if (d.removes.find((r) => r.id === mutation.id)) {
|
||||||
|
|||||||
@@ -587,3 +587,23 @@ export function hasShadowRoot<T extends Node>(
|
|||||||
): n is T & { shadowRoot: ShadowRoot } {
|
): n is T & { shadowRoot: ShadowRoot } {
|
||||||
return Boolean(((n as unknown) as Element)?.shadowRoot);
|
return Boolean(((n as unknown) as Element)?.shadowRoot);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the latest mutation in the queue for each node.
|
||||||
|
* @param {textMutation[]} mutations The text mutations to filter.
|
||||||
|
* @returns {textMutation[]} The filtered text mutations.
|
||||||
|
*/
|
||||||
|
export function uniqueTextMutations(mutations: textMutation[]): textMutation[] {
|
||||||
|
const idSet = new Set<number>();
|
||||||
|
const uniqueMutations: textMutation[] = [];
|
||||||
|
|
||||||
|
for (let i = mutations.length; i--; ) {
|
||||||
|
const mutation = mutations[i];
|
||||||
|
if (!idSet.has(mutation.id)) {
|
||||||
|
uniqueMutations.push(mutation);
|
||||||
|
idSet.add(mutation.id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return uniqueMutations;
|
||||||
|
}
|
||||||
|
|||||||
2
packages/rrweb/typings/utils.d.ts
vendored
2
packages/rrweb/typings/utils.d.ts
vendored
@@ -10,6 +10,7 @@ export declare function patch(source: {
|
|||||||
export declare function getWindowHeight(): number;
|
export declare function getWindowHeight(): number;
|
||||||
export declare function getWindowWidth(): number;
|
export declare function getWindowWidth(): number;
|
||||||
export declare function isBlocked(node: Node | null, blockClass: blockClass): boolean;
|
export declare function isBlocked(node: Node | null, blockClass: blockClass): boolean;
|
||||||
|
export declare function isSerialized(n: Node, mirror: Mirror): boolean;
|
||||||
export declare function isIgnored(n: Node, mirror: Mirror): boolean;
|
export declare function isIgnored(n: Node, mirror: Mirror): boolean;
|
||||||
export declare function isAncestorRemoved(target: Node, mirror: Mirror): boolean;
|
export declare function isAncestorRemoved(target: Node, mirror: Mirror): boolean;
|
||||||
export declare function isTouchEvent(event: MouseEvent | TouchEvent): event is TouchEvent;
|
export declare function isTouchEvent(event: MouseEvent | TouchEvent): event is TouchEvent;
|
||||||
@@ -62,4 +63,5 @@ export declare function getBaseDimension(node: Node, rootIframe: Node): Document
|
|||||||
export declare function hasShadowRoot<T extends Node>(n: T): n is T & {
|
export declare function hasShadowRoot<T extends Node>(n: T): n is T & {
|
||||||
shadowRoot: ShadowRoot;
|
shadowRoot: ShadowRoot;
|
||||||
};
|
};
|
||||||
|
export declare function getUniqueTextMutations(mutations: textMutation[]): textMutation[];
|
||||||
export {};
|
export {};
|
||||||
|
|||||||
Reference in New Issue
Block a user