mirror of
https://github.com/facebook/react.git
synced 2026-02-24 20:53:03 +00:00
* Import Scheduler directly, not via host config We currently schedule asynchronous tasks via the host config. (The host config is a static/build-time dependency injection system that varies across different renderers — DOM, native, test, and so on.) Instead of calling platform APIs like `requestIdleCallback` directly, each renderer implements a method called `scheduleDeferredCallback`. We've since discovered that when scheduling tasks, it's crucial that React work is placed in the same queue as other, non-React work on the main thread. Otherwise, you easily end up in a starvation scenario where rendering is constantly interrupted by less important tasks. You need a centralized coordinator that is used both by React and by other frameworks and application code. This coordinator must also have a consistent API across all the different host environments, for convention's sake and so product code is portable — e.g. so the same component can work in both React Native and React Native Web. This turned into the Scheduler package. We will have different builds of Scheduler for each of our target platforms. With this approach, we treat Scheduler like a built-in platform primitive that exists wherever React is supported. Now that we have this consistent interface, the indirection of the host config no longer makes sense for the purpose of scheduling tasks. In fact, we explicitly do not want renderers to scheduled task via any system except the Scheduler package. So, this PR removes `scheduleDeferredCallback` and its associated methods from the host config in favor of directly importing Scheduler. * Missed an extraneous export
86 lines
1.8 KiB
JavaScript
86 lines
1.8 KiB
JavaScript
/**
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @flow
|
|
*/
|
|
|
|
import type {Fiber} from './ReactFiber';
|
|
|
|
import {enableProfilerTimer} from 'shared/ReactFeatureFlags';
|
|
|
|
// Intentionally not named imports because Rollup would use dynamic dispatch for
|
|
// CommonJS interop named imports.
|
|
import * as Scheduler from 'scheduler';
|
|
|
|
const {unstable_now: now} = Scheduler;
|
|
|
|
export type ProfilerTimer = {
|
|
getCommitTime(): number,
|
|
recordCommitTime(): void,
|
|
startProfilerTimer(fiber: Fiber): void,
|
|
stopProfilerTimerIfRunning(fiber: Fiber): void,
|
|
stopProfilerTimerIfRunningAndRecordDelta(fiber: Fiber): void,
|
|
};
|
|
|
|
let commitTime: number = 0;
|
|
let profilerStartTime: number = -1;
|
|
|
|
function getCommitTime(): number {
|
|
return commitTime;
|
|
}
|
|
|
|
function recordCommitTime(): void {
|
|
if (!enableProfilerTimer) {
|
|
return;
|
|
}
|
|
commitTime = now();
|
|
}
|
|
|
|
function startProfilerTimer(fiber: Fiber): void {
|
|
if (!enableProfilerTimer) {
|
|
return;
|
|
}
|
|
|
|
profilerStartTime = now();
|
|
|
|
if (((fiber.actualStartTime: any): number) < 0) {
|
|
fiber.actualStartTime = now();
|
|
}
|
|
}
|
|
|
|
function stopProfilerTimerIfRunning(fiber: Fiber): void {
|
|
if (!enableProfilerTimer) {
|
|
return;
|
|
}
|
|
profilerStartTime = -1;
|
|
}
|
|
|
|
function stopProfilerTimerIfRunningAndRecordDelta(
|
|
fiber: Fiber,
|
|
overrideBaseTime: boolean,
|
|
): void {
|
|
if (!enableProfilerTimer) {
|
|
return;
|
|
}
|
|
|
|
if (profilerStartTime >= 0) {
|
|
const elapsedTime = now() - profilerStartTime;
|
|
fiber.actualDuration += elapsedTime;
|
|
if (overrideBaseTime) {
|
|
fiber.selfBaseDuration = elapsedTime;
|
|
}
|
|
profilerStartTime = -1;
|
|
}
|
|
}
|
|
|
|
export {
|
|
getCommitTime,
|
|
recordCommitTime,
|
|
startProfilerTimer,
|
|
stopProfilerTimerIfRunning,
|
|
stopProfilerTimerIfRunningAndRecordDelta,
|
|
};
|