Skip to content

Commit d000261

Browse files
authored
[Tracks] Annotate devtools.performanceIssue for Cascading Updates in DEV (facebook#34961)
1 parent f646e8f commit d000261

8 files changed

+28
-0
lines changed

packages/react-reconciler/src/ReactFiberPerformanceTrack.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import {
3636
import {
3737
enableProfilerTimer,
3838
enableGestureTransition,
39+
enablePerformanceIssueReporting,
3940
} from 'shared/ReactFeatureFlags';
4041

4142
const supportsUserTiming =
@@ -203,6 +204,15 @@ const reusableComponentOptions: PerformanceMeasureOptions = {
203204

204205
const reusableChangedPropsEntry = ['Changed Props', ''];
205206

207+
const reusableCascadingUpdateIssue = {
208+
name: 'React: Cascading Update',
209+
severity: 'warning',
210+
description:
211+
'A cascading update is an update that is triggered during an ongoing render. This can lead to performance issues.',
212+
learnMoreUrl:
213+
'https://react.dev/reference/dev-tools/react-performance-tracks#cascading-updates',
214+
};
215+
206216
const DEEP_EQUALITY_WARNING =
207217
'This component received deeply equal props. It might benefit from useMemo or the React Compiler in its owner.';
208218

@@ -761,6 +771,11 @@ export function logBlockingStart(
761771
},
762772
},
763773
};
774+
if (enablePerformanceIssueReporting && isSpawnedUpdate) {
775+
// $FlowFixMe[prop-missing] - detail is untyped
776+
measureOptions.detail.devtools.performanceIssue =
777+
reusableCascadingUpdateIssue;
778+
}
764779

765780
if (debugTask) {
766781
debugTask.run(

packages/shared/ReactFeatureFlags.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,11 @@ export const enableProfilerTimer = __PROFILE__;
232232
// All calls should also be gated on enableProfilerTimer.
233233
export const enableComponentPerformanceTrack: boolean = true;
234234

235+
// Enables annotating of React performance track events with `performanceIssue`
236+
// metadata, to more prominently highlight performance issues to users
237+
// (initially, an experimental feature in React Native).
238+
export const enablePerformanceIssueReporting: boolean = false;
239+
235240
// Adds user timing marks for e.g. state updates, suspense, and work loop stuff,
236241
// for an experimental timeline tool.
237242
export const enableSchedulingProfiler: boolean =

packages/shared/forks/ReactFeatureFlags.native-fb.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ export const enableDefaultTransitionIndicator: boolean = true;
8383
export const ownerStackLimit = 1e4;
8484
export const enableComponentPerformanceTrack: boolean =
8585
__PROFILE__ && dynamicFlags.enableComponentPerformanceTrack;
86+
export const enablePerformanceIssueReporting: boolean =
87+
enableComponentPerformanceTrack;
8688

8789
// Flow magic to verify the exports of this file match the original version.
8890
((((null: any): ExportsType): FeatureFlagsType): ExportsType);

packages/shared/forks/ReactFeatureFlags.native-oss.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ export const enablePostpone: boolean = false;
4242
export const enableReactTestRendererWarning: boolean = false;
4343
export const enableRetryLaneExpiration: boolean = false;
4444
export const enableComponentPerformanceTrack: boolean = true;
45+
export const enablePerformanceIssueReporting: boolean = false;
4546
export const enableSchedulingProfiler: boolean =
4647
!enableComponentPerformanceTrack && __PROFILE__;
4748
export const enableScopeAPI: boolean = false;

packages/shared/forks/ReactFeatureFlags.test-renderer.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ export const enableProfilerTimer: boolean = __PROFILE__;
1616
export const enableProfilerCommitHooks: boolean = __PROFILE__;
1717
export const enableProfilerNestedUpdatePhase: boolean = __PROFILE__;
1818
export const enableComponentPerformanceTrack: boolean = true;
19+
export const enablePerformanceIssueReporting: boolean = false;
1920
export const enableUpdaterTracking: boolean = false;
2021
export const enableLegacyCache: boolean = __EXPERIMENTAL__;
2122
export const enableAsyncIterableChildren: boolean = false;

packages/shared/forks/ReactFeatureFlags.test-renderer.native-fb.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ export const enableReactTestRendererWarning = false;
4141
export const enableRetryLaneExpiration = false;
4242
export const enableSchedulingProfiler = __PROFILE__;
4343
export const enableComponentPerformanceTrack = false;
44+
export const enablePerformanceIssueReporting = false;
4445
export const enableScopeAPI = false;
4546
export const enableEagerAlternateStateNodeCleanup = true;
4647
export const enableSuspenseAvoidThisFallback = false;

packages/shared/forks/ReactFeatureFlags.test-renderer.www.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ export const enableProfilerTimer: boolean = __PROFILE__;
1616
export const enableProfilerCommitHooks: boolean = __PROFILE__;
1717
export const enableProfilerNestedUpdatePhase: boolean = __PROFILE__;
1818
export const enableComponentPerformanceTrack: boolean = false;
19+
export const enablePerformanceIssueReporting: boolean = false;
1920
export const enableUpdaterTracking: boolean = false;
2021
export const enableLegacyCache: boolean = true;
2122
export const enableAsyncIterableChildren: boolean = false;

packages/shared/forks/ReactFeatureFlags.www.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ export const enableThrottledScheduling: boolean = false;
5959

6060
export const enableHydrationLaneScheduling: boolean = true;
6161

62+
export const enablePerformanceIssueReporting: boolean = false;
63+
6264
// Logs additional User Timing API marks for use with an experimental profiling tool.
6365
export const enableSchedulingProfiler: boolean =
6466
__PROFILE__ && dynamicFeatureFlags.enableSchedulingProfiler;

0 commit comments

Comments
 (0)