Use native scheduler if defined in global scope (#26554)
Co-authored-by: Dan Abramov <dan.abramov@gmail.com>
This commit is contained in:
parent
783e7fcfa3
commit
b00e27342d
|
@ -0,0 +1,12 @@
|
||||||
|
/**
|
||||||
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the
|
||||||
|
* LICENSE file in the root directory of this source tree.
|
||||||
|
*
|
||||||
|
* @flow
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
export * from './src/forks/SchedulerNative';
|
|
@ -0,0 +1,7 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
if (process.env.NODE_ENV === 'production') {
|
||||||
|
module.exports = require('./cjs/scheduler.native.production.min.js');
|
||||||
|
} else {
|
||||||
|
module.exports = require('./cjs/scheduler.native.development.js');
|
||||||
|
}
|
|
@ -2,7 +2,6 @@
|
||||||
"name": "scheduler",
|
"name": "scheduler",
|
||||||
"version": "0.23.0",
|
"version": "0.23.0",
|
||||||
"description": "Cooperative scheduler for the browser environment.",
|
"description": "Cooperative scheduler for the browser environment.",
|
||||||
"main": "index.js",
|
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/facebook/react.git",
|
"url": "https://github.com/facebook/react.git",
|
||||||
|
@ -23,6 +22,7 @@
|
||||||
"LICENSE",
|
"LICENSE",
|
||||||
"README.md",
|
"README.md",
|
||||||
"index.js",
|
"index.js",
|
||||||
|
"index.native.js",
|
||||||
"unstable_mock.js",
|
"unstable_mock.js",
|
||||||
"unstable_post_task.js",
|
"unstable_post_task.js",
|
||||||
"cjs/",
|
"cjs/",
|
||||||
|
|
|
@ -46,7 +46,7 @@ import {
|
||||||
|
|
||||||
export type Callback = boolean => ?Callback;
|
export type Callback = boolean => ?Callback;
|
||||||
|
|
||||||
type Task = {
|
export opaque type Task = {
|
||||||
id: number,
|
id: number,
|
||||||
callback: Callback | null,
|
callback: Callback | null,
|
||||||
priorityLevel: PriorityLevel,
|
priorityLevel: PriorityLevel,
|
||||||
|
|
|
@ -0,0 +1,112 @@
|
||||||
|
/**
|
||||||
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the
|
||||||
|
* LICENSE file in the root directory of this source tree.
|
||||||
|
*
|
||||||
|
* @flow strict
|
||||||
|
*/
|
||||||
|
|
||||||
|
import * as Scheduler from './Scheduler';
|
||||||
|
import type {Callback, Task} from './Scheduler';
|
||||||
|
import type {PriorityLevel} from '../SchedulerPriorities';
|
||||||
|
import typeof * as SchedulerExportsType from './Scheduler';
|
||||||
|
import typeof * as SchedulerNativeExportsType from './SchedulerNative';
|
||||||
|
|
||||||
|
// This type is supposed to reflect the actual methods and arguments currently supported by the C++ implementation:
|
||||||
|
// https://github.com/facebook/react-native/blob/main/packages/react-native/ReactCommon/react/renderer/runtimescheduler/RuntimeSchedulerBinding.cpp
|
||||||
|
type NativeSchedulerType = {
|
||||||
|
unstable_ImmediatePriority: PriorityLevel,
|
||||||
|
unstable_UserBlockingPriority: PriorityLevel,
|
||||||
|
unstable_NormalPriority: PriorityLevel,
|
||||||
|
unstable_IdlePriority: PriorityLevel,
|
||||||
|
unstable_LowPriority: PriorityLevel,
|
||||||
|
unstable_scheduleCallback: (
|
||||||
|
priorityLevel: PriorityLevel,
|
||||||
|
callback: Callback,
|
||||||
|
) => Task,
|
||||||
|
unstable_cancelCallback: (task: Task) => void,
|
||||||
|
unstable_getCurrentPriorityLevel: () => PriorityLevel,
|
||||||
|
unstable_shouldYield: () => boolean,
|
||||||
|
unstable_requestPaint: () => void,
|
||||||
|
unstable_now: () => DOMHighResTimeStamp,
|
||||||
|
};
|
||||||
|
|
||||||
|
declare var nativeRuntimeScheduler: void | NativeSchedulerType;
|
||||||
|
|
||||||
|
export const unstable_UserBlockingPriority: PriorityLevel =
|
||||||
|
typeof nativeRuntimeScheduler !== 'undefined'
|
||||||
|
? nativeRuntimeScheduler.unstable_UserBlockingPriority
|
||||||
|
: Scheduler.unstable_UserBlockingPriority;
|
||||||
|
|
||||||
|
export const unstable_NormalPriority: PriorityLevel =
|
||||||
|
typeof nativeRuntimeScheduler !== 'undefined'
|
||||||
|
? nativeRuntimeScheduler.unstable_NormalPriority
|
||||||
|
: Scheduler.unstable_NormalPriority;
|
||||||
|
|
||||||
|
export const unstable_IdlePriority: PriorityLevel =
|
||||||
|
typeof nativeRuntimeScheduler !== 'undefined'
|
||||||
|
? nativeRuntimeScheduler.unstable_IdlePriority
|
||||||
|
: Scheduler.unstable_IdlePriority;
|
||||||
|
|
||||||
|
export const unstable_LowPriority: PriorityLevel =
|
||||||
|
typeof nativeRuntimeScheduler !== 'undefined'
|
||||||
|
? nativeRuntimeScheduler.unstable_LowPriority
|
||||||
|
: Scheduler.unstable_LowPriority;
|
||||||
|
|
||||||
|
export const unstable_ImmediatePriority: PriorityLevel =
|
||||||
|
typeof nativeRuntimeScheduler !== 'undefined'
|
||||||
|
? nativeRuntimeScheduler.unstable_ImmediatePriority
|
||||||
|
: Scheduler.unstable_ImmediatePriority;
|
||||||
|
|
||||||
|
export const unstable_scheduleCallback: (
|
||||||
|
priorityLevel: PriorityLevel,
|
||||||
|
callback: Callback,
|
||||||
|
) => Task =
|
||||||
|
typeof nativeRuntimeScheduler !== 'undefined'
|
||||||
|
? nativeRuntimeScheduler.unstable_scheduleCallback
|
||||||
|
: Scheduler.unstable_scheduleCallback;
|
||||||
|
|
||||||
|
export const unstable_cancelCallback: (task: Task) => void =
|
||||||
|
typeof nativeRuntimeScheduler !== 'undefined'
|
||||||
|
? nativeRuntimeScheduler.unstable_cancelCallback
|
||||||
|
: Scheduler.unstable_cancelCallback;
|
||||||
|
|
||||||
|
export const unstable_getCurrentPriorityLevel: () => PriorityLevel =
|
||||||
|
typeof nativeRuntimeScheduler !== 'undefined'
|
||||||
|
? nativeRuntimeScheduler.unstable_getCurrentPriorityLevel
|
||||||
|
: Scheduler.unstable_getCurrentPriorityLevel;
|
||||||
|
|
||||||
|
export const unstable_shouldYield: () => boolean =
|
||||||
|
typeof nativeRuntimeScheduler !== 'undefined'
|
||||||
|
? nativeRuntimeScheduler.unstable_shouldYield
|
||||||
|
: Scheduler.unstable_shouldYield;
|
||||||
|
|
||||||
|
export const unstable_requestPaint: () => void =
|
||||||
|
typeof nativeRuntimeScheduler !== 'undefined'
|
||||||
|
? nativeRuntimeScheduler.unstable_requestPaint
|
||||||
|
: Scheduler.unstable_requestPaint;
|
||||||
|
|
||||||
|
export const unstable_now: () => number | DOMHighResTimeStamp =
|
||||||
|
typeof nativeRuntimeScheduler !== 'undefined'
|
||||||
|
? nativeRuntimeScheduler.unstable_now
|
||||||
|
: Scheduler.unstable_now;
|
||||||
|
|
||||||
|
// These were never implemented on the native scheduler because React never calls them.
|
||||||
|
// For consistency, let's disable them altogether and make them throw.
|
||||||
|
export const unstable_next: any = throwNotImplemented;
|
||||||
|
export const unstable_runWithPriority: any = throwNotImplemented;
|
||||||
|
export const unstable_wrapCallback: any = throwNotImplemented;
|
||||||
|
export const unstable_continueExecution: any = throwNotImplemented;
|
||||||
|
export const unstable_pauseExecution: any = throwNotImplemented;
|
||||||
|
export const unstable_getFirstCallbackNode: any = throwNotImplemented;
|
||||||
|
export const unstable_forceFrameRate: any = throwNotImplemented;
|
||||||
|
export const unstable_Profiling: any = null;
|
||||||
|
|
||||||
|
function throwNotImplemented() {
|
||||||
|
throw Error('Not implemented.');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Flow magic to verify the exports of this file match the original version.
|
||||||
|
export type {Callback, Task};
|
||||||
|
((((null: any): SchedulerExportsType): SchedulerNativeExportsType): SchedulerExportsType);
|
|
@ -935,6 +935,17 @@ const bundles = [
|
||||||
externals: ['ReactNativeInternalFeatureFlags'],
|
externals: ['ReactNativeInternalFeatureFlags'],
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/******* React Scheduler Native *******/
|
||||||
|
{
|
||||||
|
bundleTypes: [NODE_DEV, NODE_PROD],
|
||||||
|
moduleType: ISOMORPHIC,
|
||||||
|
entry: 'scheduler/index.native',
|
||||||
|
global: 'SchedulerNative',
|
||||||
|
minifyWithProdErrorCodes: false,
|
||||||
|
wrapWithModuleBoundaries: false,
|
||||||
|
externals: ['ReactNativeInternalFeatureFlags'],
|
||||||
|
},
|
||||||
|
|
||||||
/******* React Scheduler Post Task (experimental) *******/
|
/******* React Scheduler Post Task (experimental) *******/
|
||||||
{
|
{
|
||||||
bundleTypes: [
|
bundleTypes: [
|
||||||
|
|
|
@ -52,6 +52,9 @@ module.exports = {
|
||||||
|
|
||||||
// act
|
// act
|
||||||
IS_REACT_ACT_ENVIRONMENT: 'readonly',
|
IS_REACT_ACT_ENVIRONMENT: 'readonly',
|
||||||
|
|
||||||
|
// Native Scheduler
|
||||||
|
nativeRuntimeScheduler: 'readonly',
|
||||||
},
|
},
|
||||||
parserOptions: {
|
parserOptions: {
|
||||||
ecmaVersion: 2020,
|
ecmaVersion: 2020,
|
||||||
|
|
Loading…
Reference in New Issue