From 70facac7e68b5e039eb8b6891198255fe7c6728e Mon Sep 17 00:00:00 2001 From: Sebastian Markbage Date: Wed, 11 Dec 2024 17:32:24 -0500 Subject: [PATCH] Sort Server Components Track Group ahead of Client Scheduler/Components Tracks --- .../react-client/src/ReactFlightClient.js | 6 +++++- .../src/ReactFlightPerformanceTrack.js | 20 +++++++++++++++++++ .../src/ReactFiberPerformanceTrack.js | 8 ++++---- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/packages/react-client/src/ReactFlightClient.js b/packages/react-client/src/ReactFlightClient.js index 0456136a7e6cf..ccb8632289f20 100644 --- a/packages/react-client/src/ReactFlightClient.js +++ b/packages/react-client/src/ReactFlightClient.js @@ -69,7 +69,10 @@ import {createBoundServerReference} from './ReactFlightReplyClient'; import {readTemporaryReference} from './ReactFlightTemporaryReferences'; -import {logComponentRender} from './ReactFlightPerformanceTrack'; +import { + markAllTracksInOrder, + logComponentRender, +} from './ReactFlightPerformanceTrack'; import { REACT_LAZY_TYPE, @@ -643,6 +646,7 @@ export function reportGlobalError(response: Response, error: Error): void { } }); if (enableProfilerTimer && enableComponentPerformanceTrack) { + markAllTracksInOrder(); flushComponentPerformance(getChunk(response, 0), 0, -Infinity); } } diff --git a/packages/react-client/src/ReactFlightPerformanceTrack.js b/packages/react-client/src/ReactFlightPerformanceTrack.js index b8bd9ca2be935..cf78f7d7de03c 100644 --- a/packages/react-client/src/ReactFlightPerformanceTrack.js +++ b/packages/react-client/src/ReactFlightPerformanceTrack.js @@ -19,6 +19,26 @@ const supportsUserTiming = const COMPONENTS_TRACK = 'Server Components ⚛'; +const componentsTrackMarker = { + startTime: 0.001, + detail: { + devtools: { + color: 'primary-light', + track: 'Primary', + trackGroup: COMPONENTS_TRACK, + }, + }, +}; + +export function markAllTracksInOrder() { + if (supportsUserTiming) { + // Ensure we create the Server Component track groups earlier than the Client Scheduler + // and Client Components. We can always add the 0 time slot even if it's in the past. + // That's still considered for ordering. + performance.mark('Server Components Track', componentsTrackMarker); + } +} + // Reused to avoid thrashing the GC. const reusableComponentDevToolDetails = { color: 'primary', diff --git a/packages/react-reconciler/src/ReactFiberPerformanceTrack.js b/packages/react-reconciler/src/ReactFiberPerformanceTrack.js index 7e9e246d8beb2..d94fd5ee480b3 100644 --- a/packages/react-reconciler/src/ReactFiberPerformanceTrack.js +++ b/packages/react-reconciler/src/ReactFiberPerformanceTrack.js @@ -63,7 +63,7 @@ export function setCurrentTrackFromLanes(lanes: Lanes): void { } const blockingLaneMarker = { - startTime: 0, + startTime: 0.003, detail: { devtools: { color: 'primary-light', @@ -74,7 +74,7 @@ const blockingLaneMarker = { }; const transitionLaneMarker = { - startTime: 0, + startTime: 0.003, detail: { devtools: { color: 'primary-light', @@ -85,7 +85,7 @@ const transitionLaneMarker = { }; const suspenseLaneMarker = { - startTime: 0, + startTime: 0.003, detail: { devtools: { color: 'primary-light', @@ -96,7 +96,7 @@ const suspenseLaneMarker = { }; const idleLaneMarker = { - startTime: 0, + startTime: 0.003, detail: { devtools: { color: 'primary-light',