99
Cloned,
100
} from './ReactFiberFlags';
101
import {
102
- getCommitTime,
103
- getCompleteTime,
102
+ commitTime,
103
+ completeTime,
104
pushNestedEffectDurations,
105
popNestedEffectDurations,
106
bubbleNestedEffectDurations,
107
+ resetComponentEffectTimers,
108
+ pushComponentEffectStart,
109
+ popComponentEffectStart,
110
+ componentEffectStartTime,
111
+ componentEffectEndTime,
112
} from './ReactProfilerTimer';
108
-import {logComponentRender} from './ReactFiberPerformanceTrack';
113
+import {
114
+ logComponentRender,
115
+ logComponentEffect,
116
+} from './ReactFiberPerformanceTrack';
117
import {ConcurrentMode, NoMode, ProfileMode} from './ReactTypeOfMode';
118
import {deferHiddenCallbacks} from './ReactFiberClassUpdateQueue';
119
import {
390
finishedWork: Fiber,
391
committedLanes: Lanes,
392
): void {
393
+ const prevEffectStart = pushComponentEffectStart();
394
+
395
// When updating this function, also update reappearLayoutEffects, which does
396
// most of the same things when an offscreen tree goes from hidden -> visible.
397
const flags = finishedWork.flags;
504
commitProfilerUpdate(
505
finishedWork,
506
current,
497
- getCommitTime(),
507
+ commitTime,
508
profilerInstance.effectDuration,
509
);
510
} else {
595
break;
596
}
597
}
598
+
599
+ if (
600
+ enableProfilerTimer &&
601
+ enableProfilerCommitHooks &&
602
+ enableComponentPerformanceTrack &&
603
+ (finishedWork.mode & ProfileMode) !== NoMode &&
604
+ componentEffectStartTime >= 0 &&
605
+ componentEffectEndTime >= 0
606
+ ) {
607
+ logComponentEffect(
608
+ finishedWork,
609
+ componentEffectStartTime,
610
+ componentEffectEndTime,
611
+ );
612
+ }
613
+
614
+ popComponentEffectStart(prevEffectStart);
615
}
616
617
function abortRootTransitions(
1557
inProgressLanes = committedLanes;
1558
inProgressRoot = root;
1559
1560
+ resetComponentEffectTimers();
1561
+
1562
commitMutationEffectsOnFiber(finishedWork, root, committedLanes);
1563
1564
inProgressLanes = null;
1599
root: FiberRoot,
1600
lanes: Lanes,
1601
) {
1602
+ const prevEffectStart = pushComponentEffectStart();
1603
+
1604
const current = finishedWork.alternate;
1605
const flags = finishedWork.flags;
1606
1629
HookLayout | HookHasEffect,
1630
);
1631
}
1601
- return;
1632
+ break;
1633
}
1634
case ClassComponent: {
1635
recursivelyTraverseMutationEffects(root, finishedWork, lanes);
1648
deferHiddenCallbacks(updateQueue);
1649
}
1650
}
1620
- return;
1651
+ break;
1652
}
1653
case HostHoistable: {
1654
if (supportsResources) {
1724
);
1725
}
1726
}
1696
- return;
1727
+ break;
1728
}
1729
// Fall through
1730
}
1787
}
1788
}
1789
}
1759
- return;
1790
+ break;
1791
}
1792
case HostText: {
1793
recursivelyTraverseMutationEffects(root, finishedWork, lanes);
1812
commitHostTextUpdate(finishedWork, newText, oldText);
1813
}
1814
}
1784
- return;
1815
+ break;
1816
}
1817
case HostRoot: {
1818
const prevEffectDuration = pushNestedEffectDurations();
1864
root.effectDuration += popNestedEffectDurations(prevEffectDuration);
1865
}
1866
1836
- return;
1867
+ break;
1868
}
1869
case HostPortal: {
1870
if (supportsResources) {
1889
);
1890
}
1891
}
1861
- return;
1892
+ break;
1893
}
1894
case Profiler: {
1895
const prevEffectDuration = pushNestedEffectDurations();
1904
profilerInstance.effectDuration +=
1905
bubbleNestedEffectDurations(prevEffectDuration);
1906
}
1876
- return;
1907
+ break;
1908
}
1909
case SuspenseComponent: {
1910
recursivelyTraverseMutationEffects(root, finishedWork, lanes);
1956
attachSuspenseRetryListeners(finishedWork, retryQueue);
1957
}
1958
}
1928
- return;
1959
+ break;
1960
}
1961
case OffscreenComponent: {
1962
if (flags & Ref) {
2049
}
2050
}
2051
}
2021
- return;
2052
+ break;
2053
}
2054
case SuspenseListComponent: {
2055
recursivelyTraverseMutationEffects(root, finishedWork, lanes);
2063
attachSuspenseRetryListeners(finishedWork, retryQueue);
2064
}
2065
}
2035
- return;
2066
+ break;
2067
}
2068
case ScopeComponent: {
2069
if (enableScopeAPI) {
2083
prepareScopeUpdate(scopeInstance, finishedWork);
2084
}
2085
}
2055
- return;
2086
+ break;
2087
}
2088
default: {
2089
recursivelyTraverseMutationEffects(root, finishedWork, lanes);
2090
commitReconciliationEffects(finishedWork);
2091
2061
- return;
2092
+ break;
2093
}
2094
}
2095
+
2096
+ if (
2097
+ enableProfilerTimer &&
2098
+ enableProfilerCommitHooks &&
2099
+ enableComponentPerformanceTrack &&
2100
+ (finishedWork.mode & ProfileMode) !== NoMode &&
2101
+ componentEffectStartTime >= 0 &&
2102
+ componentEffectEndTime >= 0
2103
+ ) {
2104
+ logComponentEffect(
2105
+ finishedWork,
2106
+ componentEffectStartTime,
2107
+ componentEffectEndTime,
2108
+ );
2109
+ }
2110
+
2111
+ popComponentEffectStart(prevEffectStart);
2112
}
2113
+
2114
function commitReconciliationEffects(finishedWork: Fiber) {
2115
// Placement effects (insertions, reorders) can be scheduled on any fiber
2116
// type. They needs to happen after the children effects have fired, but
2155
inProgressLanes = committedLanes;
2156
inProgressRoot = root;
2157
2158
+ resetComponentEffectTimers();
2159
+
2160
const current = finishedWork.alternate;
2161
commitLayoutEffectOnFiber(root, current, finishedWork, committedLanes);
2162
2342
commitProfilerUpdate(
2343
finishedWork,
2344
current,
2294
- getCommitTime(),
2345
+ commitTime,
2346
profilerInstance.effectDuration,
2347
);
2348
} else {
2566
committedLanes: Lanes,
2567
committedTransitions: Array<Transition> | null,
2568
): void {
2569
+ resetComponentEffectTimers();
2570
+
2571
commitPassiveMountOnFiber(
2572
root,
2573
finishedWork,
2574
committedLanes,
2575
committedTransitions,
2523
- enableProfilerTimer && enableComponentPerformanceTrack
2524
- ? getCompleteTime()
2525
- : 0,
2576
+ enableProfilerTimer && enableComponentPerformanceTrack ? completeTime : 0,
2577
);
2578
}
2579
2628
committedTransitions: Array<Transition> | null,
2629
endTime: number, // Profiling-only. The start time of the next Fiber or root completion.
2630
): void {
2631
+ const prevEffectStart = pushComponentEffectStart();
2632
+
2633
// If this component rendered in Profiling mode (DEV or in Profiler component) then log its
2634
// render time. We do this after the fact in the passive effect to avoid the overhead of this
2635
// getting in the way of the render characteristics and avoid the overhead of unwinding
2760
finishedWork.alternate,
2761
// This value will still reflect the previous commit phase.
2762
// It does not get reset until the start of the next commit phase.
2710
- getCommitTime(),
2763
+ commitTime,
2764
profilerInstance.passiveEffectDuration,
2765
);
2766
} else {
2913
break;
2914
}
2915
}
2916
+
2917
+ if (
2918
+ enableProfilerTimer &&
2919
+ enableProfilerCommitHooks &&
2920
+ enableComponentPerformanceTrack &&
2921
+ (finishedWork.mode & ProfileMode) !== NoMode &&
2922
+ componentEffectStartTime >= 0 &&
2923
+ componentEffectEndTime >= 0
2924
+ ) {
2925
+ logComponentEffect(
2926
+ finishedWork,
2927
+ componentEffectStartTime,
2928
+ componentEffectEndTime,
2929
+ );
2930
+ }
2931
+
2932
+ popComponentEffectStart(prevEffectStart);
2933
}
2934
2935
function recursivelyTraverseReconnectPassiveEffects(
3201
}
3202
3203
export function commitPassiveUnmountEffects(finishedWork: Fiber): void {
3204
+ resetComponentEffectTimers();
3205
commitPassiveUnmountOnFiber(finishedWork);
3206
}
3207
3360
}
3361
3362
function commitPassiveUnmountOnFiber(finishedWork: Fiber): void {
3363
+ const prevEffectStart = pushComponentEffectStart();
3364
+
3365
switch (finishedWork.tag) {
3366
case FunctionComponent:
3367
case ForwardRef:
3431
break;
3432
}
3433
}
3434
+
3435
+ if (
3436
+ enableProfilerTimer &&
3437
+ enableProfilerCommitHooks &&
3438
+ enableComponentPerformanceTrack &&
3439
+ (finishedWork.mode & ProfileMode) !== NoMode &&
3440
+ componentEffectStartTime >= 0 &&
3441
+ componentEffectEndTime >= 0
3442
+ ) {
3443
+ logComponentEffect(
3444
+ finishedWork,
3445
+ componentEffectStartTime,
3446
+ componentEffectEndTime,
3447
+ );
3448
+ }
3449
+
3450
+ popComponentEffectStart(prevEffectStart);
3451
}
3452
3453
function recursivelyTraverseDisconnectPassiveEffects(parentFiber: Fiber): void {