Skip to content

Commit e284ac8

Browse files
authored
feat: components tree (#240)
* feat: components tree - add re-renders to components tree - improve widget resizing - improve header UI - improve biome checks
1 parent 09d5181 commit e284ac8

File tree

13 files changed

+408
-367
lines changed

13 files changed

+408
-367
lines changed

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
"dev": "node scripts/workspace.mjs dev",
99
"pack": "node scripts/workspace.mjs pack",
1010
"pack:bump": "pnpm --filter scan pack:bump",
11-
"lint": "biome lint .",
11+
"lint": "pnpm -r lint",
12+
"lint:all": "biome lint .",
1213
"format": "biome format . --write",
1314
"check": "biome check . --write"
1415
},

packages/extension/package.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,11 @@
1515
"pack:chrome": "pnpm clean && pnpm build && pnpm mkdir && cd dist && zip -r \"../build/chrome-extension-v$npm_package_version.zip\" .",
1616
"pack:firefox": "pnpm clean && BROWSER=firefox pnpm build && pnpm mkdir && cd dist && zip -r \"../build/firefox-extension-v$npm_package_version.zip\" .",
1717
"pack:brave": "pnpm clean && BROWSER=brave pnpm build && pnpm mkdir && cd dist && zip -r \"../build/brave-extension-v$npm_package_version.zip\" .",
18-
"pack:all": "rm -rf build && pnpm pack:chrome && pnpm pack:firefox && pnpm pack:brave"
18+
"pack:all": "rm -rf build && pnpm pack:chrome && pnpm pack:firefox && pnpm pack:brave",
19+
"lint": "biome lint src && pnpm typecheck",
20+
"format": "biome format . --write",
21+
"check": "biome check . --write",
22+
"typecheck": "tsc --noEmit"
1923
},
2024
"dependencies": {
2125
"@pivanov/utils": "^0.0.1",

packages/scan/package.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,11 @@
238238
"pack:bump": "bun scripts/bump-version.js && nr pack && echo $(pwd)/react-scan-$(node -p \"require('./package.json').version\").tgz | pbcopy",
239239
"prettier": "prettier --config .prettierrc.mjs -w src",
240240
"publint": "publint",
241-
"test": "vitest"
241+
"test": "vitest",
242+
"lint": "biome lint src && pnpm typecheck",
243+
"format": "biome format . --write",
244+
"check": "biome check . --write",
245+
"typecheck": "tsc --noEmit"
242246
},
243247
"dependencies": {
244248
"@babel/core": "^7.26.0",

packages/scan/src/core/instrumentation.ts

Lines changed: 61 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,48 @@ export const isRenderUnnecessary = (fiber: Fiber) => {
419419

420420
const TRACK_UNNECESSARY_RENDERS = false;
421421

422+
export interface RenderData {
423+
selfTime: number;
424+
totalTime: number;
425+
renderCount: number;
426+
lastRenderTimestamp: number;
427+
}
428+
429+
const RENDER_DEBOUNCE_MS = 16;
430+
431+
export const renderDataMap = new WeakMap<object, RenderData>();
432+
433+
const trackRender = (
434+
type: unknown,
435+
fiberSelfTime: number,
436+
fiberTotalTime: number,
437+
hasChanges: boolean,
438+
hasDomMutations: boolean,
439+
) => {
440+
const currentTimestamp = Date.now();
441+
const existingData = renderDataMap.get(type as object);
442+
443+
if (
444+
(hasChanges || hasDomMutations) &&
445+
(!existingData ||
446+
currentTimestamp - (existingData.lastRenderTimestamp || 0) >
447+
RENDER_DEBOUNCE_MS)
448+
) {
449+
const renderData: RenderData = existingData || {
450+
selfTime: 0,
451+
totalTime: 0,
452+
renderCount: 0,
453+
lastRenderTimestamp: currentTimestamp,
454+
};
455+
456+
renderData.renderCount = (renderData.renderCount || 0) + 1;
457+
renderData.selfTime = fiberSelfTime || 0;
458+
renderData.totalTime = fiberTotalTime || 0;
459+
renderData.lastRenderTimestamp = currentTimestamp;
460+
461+
renderDataMap.set(type as object, { ...renderData });
462+
}
463+
};
422464

423465
export const createInstrumentation = (
424466
instanceKey: string,
@@ -522,25 +564,41 @@ export const createInstrumentation = (
522564
);
523565
}
524566

525-
const { selfTime } = getTimings(fiber);
567+
// Get timing information for this render
568+
const { selfTime: fiberSelfTime, totalTime: fiberTotalTime } =
569+
getTimings(fiber);
526570

527571
const fps = getFPS();
528572
const render: Render = {
529573
phase: RENDER_PHASE_STRING_TO_ENUM[phase],
530574
componentName: getDisplayName(type),
531575
count: 1,
532576
changes,
533-
time: selfTime,
577+
time: fiberSelfTime,
534578
forget: hasMemoCache(fiber),
535579
// todo: allow this to be toggle-able through toolbar
536580
// todo: performance optimization: if the last fiber measure was very off screen, do not run isRenderUnnecessary
537581
unnecessary: TRACK_UNNECESSARY_RENDERS
538582
? isRenderUnnecessary(fiber)
539583
: null,
540-
541584
didCommit: didFiberCommit(fiber),
542585
fps,
543586
};
587+
588+
// First, determine if this is a real render we should track
589+
const hasChanges = changes.length > 0;
590+
const hasDomMutations = getMutatedHostFibers(fiber).length > 0;
591+
592+
if (phase === 'update') {
593+
trackRender(
594+
type,
595+
fiberSelfTime,
596+
fiberTotalTime,
597+
hasChanges,
598+
hasDomMutations,
599+
);
600+
}
601+
544602
for (let i = 0, len = validInstancesIndicies.length; i < len; i++) {
545603
const index = validInstancesIndicies[i];
546604
const instance = allInstances[index];

packages/scan/src/web/assets/css/styles.tailwind.css

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ svg {
224224
@apply flex items-center gap-x-2;
225225
@apply pl-3 pr-2;
226226
@apply min-h-9;
227-
@apply border-b-1 border-white/10;
227+
@apply border-b-1 border-[#222];
228228
@apply whitespace-nowrap overflow-hidden;
229229
}
230230

@@ -554,12 +554,11 @@ svg {
554554
@apply min-w-5 max-w-5;
555555
@apply w-full h-full;
556556
@apply transition-colors;
557-
@apply cursor-col-resize;
558557

559558
&:hover,
560559
&:active {
561560
> span {
562-
@apply bg-white/10;
561+
@apply bg-[#222];
563562
}
564563

565564
svg {
@@ -571,7 +570,7 @@ svg {
571570
@apply content-[""];
572571
@apply absolute inset-0 left-1/2 -translate-x-1/2;
573572
@apply w-[1px];
574-
@apply bg-white/10;
573+
@apply bg-[#222];
575574
@apply transition-colors;
576575
}
577576

packages/scan/src/web/views/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ export const Content = () => {
6464
'bg-[#0A0A0A]',
6565
'transition-opacity delay-150',
6666
'overflow-hidden',
67-
'border-b border-white/10',
67+
'border-b border-[#222]',
6868
)}
6969
>
7070

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

Lines changed: 0 additions & 132 deletions
This file was deleted.

0 commit comments

Comments
 (0)