Skip to content

Commit ca7746e

Browse files
authored
fix: duplicate render count when one component is reused multiple times (#369)
1 parent b62c43c commit ca7746e

File tree

2 files changed

+36
-7
lines changed

2 files changed

+36
-7
lines changed

packages/scan/src/core/instrumentation.ts

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -438,17 +438,46 @@ export interface OldRenderData {
438438

439439
const RENDER_DEBOUNCE_MS = 16;
440440

441-
export const renderDataMap = new WeakMap<object, RenderData>();
441+
export const renderDataMap = new WeakMap<object, Map<string, RenderData>>();
442+
443+
function getFiberIdentifier(fiber: Fiber) {
444+
return `${fiber.key}::${fiber.index}`;
445+
}
446+
447+
export function getRenderData(type: unknown, fiber: Fiber) {
448+
const id = getFiberIdentifier(fiber);
449+
const keyMap = renderDataMap.get(type as object);
450+
451+
if (keyMap) {
452+
return keyMap.get(id);
453+
}
454+
455+
return undefined;
456+
}
457+
458+
export function setRenderData(fiber: Fiber, value: RenderData) {
459+
const type = getType(fiber.type)
460+
const id = getFiberIdentifier(fiber);
461+
let keyMap = renderDataMap.get(type as object);
462+
463+
if (!keyMap) {
464+
keyMap = new Map();
465+
renderDataMap.set(type as object, keyMap);
466+
}
467+
468+
keyMap.set(id, value);
469+
}
442470

443471
const trackRender = (
444-
type: unknown,
472+
fiber: Fiber,
445473
fiberSelfTime: number,
446474
fiberTotalTime: number,
447475
hasChanges: boolean,
448476
hasDomMutations: boolean,
449477
) => {
450478
const currentTimestamp = Date.now();
451-
const existingData = renderDataMap.get(type as object);
479+
const type = getType(fiber.type)
480+
const existingData = getRenderData(type, fiber);
452481

453482
if (
454483
(hasChanges || hasDomMutations) &&
@@ -468,7 +497,7 @@ const trackRender = (
468497
renderData.totalTime = fiberTotalTime || 0;
469498
renderData.lastRenderTimestamp = currentTimestamp;
470499

471-
renderDataMap.set(type as object, { ...renderData });
500+
setRenderData(fiber, { ...renderData });
472501
}
473502
};
474503

@@ -598,7 +627,7 @@ export const createInstrumentation = (
598627

599628
if (phase === 'update') {
600629
trackRender(
601-
type,
630+
fiber,
602631
fiberSelfTime,
603632
fiberTotalTime,
604633
hasChanges,

packages/scan/src/web/views/inspector/components-tree/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {
66
useState,
77
} from 'preact/hooks';
88
import { Store } from '~core/index';
9-
import { renderDataMap } from '~core/instrumentation';
9+
import { getRenderData } from '~core/instrumentation';
1010
import { Icon } from '~web/components/icon';
1111
import {
1212
LOCALSTORAGE_KEY,
@@ -44,7 +44,7 @@ const flattenTree = (
4444
: `${parentPath}-${index}`;
4545

4646
const renderData = node.fiber?.type
47-
? renderDataMap.get(node.fiber.type)
47+
? getRenderData(node.fiber.type, node.fiber)
4848
: undefined;
4949

5050
const flatNode: FlattenedNode = {

0 commit comments

Comments
 (0)