Sync scheduling by default, with an async opt-in (#11771)
Removes the `useSyncScheduling` option from the HostConfig, since it's no longer needed. Instead of globally flipping between sync and async, our strategy will be to opt-in specific trees and subtrees.
Andrew Clark committed
Jan 8, 2018 at 18:50 UTC
13c5e2b53112c1cd77dd52e028a4bb33dc492d1b
14 files changed
+9
-37
packages/react-art/src/ReactART.js
-2
@@ -478,8 +478,6 @@ const ARTRenderer = ReactFiberReconciler({
478
479
now: ReactDOMFrameScheduling.now,
480
481
- useSyncScheduling: true,
482
-
481
mutation: {
482
appendChild(parentInstance, child) {
483
if (child.parentNode === parentInstance) {
packages/react-cs-renderer/src/ReactNativeCS.js
-2
@@ -182,8 +182,6 @@ const ReactNativeCSFiberRenderer = ReactFiberReconciler({
182
return false;
183
},
184
185
- useSyncScheduling: false,
186
-
185
now(): number {
186
// TODO: Enable expiration by implementing this method.
187
return 0;
packages/react-dom/src/client/ReactDOM.js
+1
-6
@@ -28,10 +28,7 @@ import * as EventPluginHub from 'events/EventPluginHub';
28
import * as EventPluginRegistry from 'events/EventPluginRegistry';
29
import * as EventPropagators from 'events/EventPropagators';
30
import * as ReactInstanceMap from 'shared/ReactInstanceMap';
31
-import {
32
- enableAsyncSchedulingByDefaultInReactDOM,
33
- enableCreateRoot,
34
-} from 'shared/ReactFeatureFlags';
31
+import {enableCreateRoot} from 'shared/ReactFeatureFlags';
32
import ReactVersion from 'shared/ReactVersion';
33
import * as ReactDOMFrameScheduling from 'shared/ReactDOMFrameScheduling';
34
import {ReactCurrentOwner} from 'shared/ReactGlobalSharedState';
@@ -990,8 +987,6 @@ const DOMRenderer = ReactFiberReconciler({
987
988
scheduleDeferredCallback: ReactDOMFrameScheduling.rIC,
989
cancelDeferredCallback: ReactDOMFrameScheduling.cIC,
993
-
994
- useSyncScheduling: !enableAsyncSchedulingByDefaultInReactDOM,
990
});
991
992
ReactGenericBatching.injection.injectFiberBatchedUpdates(
packages/react-native-renderer/src/ReactNativeFiberRenderer.js
-2
@@ -193,8 +193,6 @@ const NativeRenderer = ReactFiberReconciler({
193
return false;
194
},
195
196
- useSyncScheduling: true,
197
-
196
mutation: {
197
appendChild(
198
parentInstance: Instance,
packages/react-reconciler/src/ReactFiberBeginWork.js
+3
-6
@@ -58,6 +58,7 @@ import {
58
invalidateContextProvider,
59
} from './ReactFiberContext';
60
import {NoWork, Never} from './ReactFiberExpirationTime';
61
+import {AsyncUpdates} from './ReactTypeOfInternalContext';
62
63
let warnedAboutStatelessRefs;
64
@@ -72,11 +73,7 @@ export default function<T, P, I, TI, HI, PI, C, CC, CX, PL>(
73
scheduleWork: (fiber: Fiber, expirationTime: ExpirationTime) => void,
74
computeExpirationForFiber: (fiber: Fiber) => ExpirationTime,
75
) {
75
- const {
76
- shouldSetTextContent,
77
- useSyncScheduling,
78
- shouldDeprioritizeSubtree,
79
- } = config;
76
+ const {shouldSetTextContent, shouldDeprioritizeSubtree} = config;
77
78
const {pushHostContext, pushHostContainer} = hostContext;
79
@@ -414,7 +411,7 @@ export default function<T, P, I, TI, HI, PI, C, CC, CX, PL>(
411
// Check the host config to see if the children are offscreen/hidden.
412
if (
413
renderExpirationTime !== Never &&
417
- !useSyncScheduling &&
414
+ workInProgress.internalContextTag & AsyncUpdates &&
415
shouldDeprioritizeSubtree(type, nextProps)
416
) {
417
// Down-prioritize the children.
packages/react-reconciler/src/ReactFiberReconciler.js
-2
@@ -98,8 +98,6 @@ export type HostConfig<T, P, I, TI, HI, PI, C, CC, CX, PL> = {
98
99
now(): number,
100
101
- useSyncScheduling?: boolean,
102
-
101
+hydration?: HydrationHostConfig<T, P, I, TI, HI, C, CX, PL>,
102
103
+mutation?: MutableUpdatesHostConfig<T, P, I, TI, C, PL>,
packages/react-reconciler/src/ReactFiberScheduler.js
+4
-5
@@ -187,7 +187,6 @@ export default function<T, P, I, TI, HI, PI, C, CC, CX, PL>(
187
now,
188
scheduleDeferredCallback,
189
cancelDeferredCallback,
190
- useSyncScheduling,
190
prepareForCommit,
191
resetAfterCommit,
192
} = config;
@@ -1178,12 +1177,12 @@ export default function<T, P, I, TI, HI, PI, C, CC, CX, PL>(
1177
} else {
1178
// No explicit expiration context was set, and we're not currently
1179
// performing work. Calculate a new expiration time.
1181
- if (useSyncScheduling && !(fiber.internalContextTag & AsyncUpdates)) {
1182
- // This is a sync update
1183
- expirationTime = Sync;
1184
- } else {
1180
+ if (fiber.internalContextTag & AsyncUpdates) {
1181
// This is an async update
1182
expirationTime = computeAsyncExpiration();
1183
+ } else {
1184
+ // This is a sync update
1185
+ expirationTime = Sync;
1186
}
1187
}
1188
return expirationTime;
packages/react-reconciler/src/__tests__/ReactFiberHostContext-test.js
-1
@@ -46,7 +46,6 @@ describe('ReactFiberHostContext', () => {
46
now: function() {
47
return 0;
48
},
49
- useSyncScheduling: true,
49
mutation: {
50
appendChildToContainer: function() {
51
return null;
packages/react-rt-renderer/src/ReactNativeRTFiberRenderer.js
-2
@@ -153,8 +153,6 @@ const NativeRTRenderer = ReactFiberReconciler({
153
return false;
154
},
155
156
- useSyncScheduling: true,
157
-
156
now(): number {
157
// TODO: Enable expiration by implementing this method.
158
return 0;
packages/react-test-renderer/src/ReactTestRenderer.js
-2
@@ -203,8 +203,6 @@ const TestRenderer = ReactFiberReconciler({
203
clearTimeout(timeoutID);
204
},
205
206
- useSyncScheduling: true,
207
-
206
getPublicInstance,
207
208
now(): number {
packages/shared/ReactFeatureFlags.js
-1
@@ -10,7 +10,6 @@
10
import invariant from 'fbjs/lib/invariant';
11
12
export const enableAsyncSubtreeAPI = true;
13
-export const enableAsyncSchedulingByDefaultInReactDOM = false;
13
// Exports ReactDOM.createRoot
14
export const enableCreateRoot = false;
15
export const enableUserTimingAPI = __DEV__;
packages/shared/forks/ReactFeatureFlags.native-cs.js
-1
@@ -14,7 +14,6 @@ import typeof * as CSFeatureFlagsType from './ReactFeatureFlags.native-cs';
14
15
export const debugRenderPhaseSideEffects = false;
16
export const enableAsyncSubtreeAPI = true;
17
-export const enableAsyncSchedulingByDefaultInReactDOM = false;
17
export const enableCreateRoot = false;
18
export const enableUserTimingAPI = __DEV__;
19
packages/shared/forks/ReactFeatureFlags.native.js
-1
@@ -17,7 +17,6 @@ export const {debugRenderPhaseSideEffects} = require('ReactFeatureFlags');
17
18
// The rest of the flags are static for better dead code elimination.
19
export const enableAsyncSubtreeAPI = true;
20
-export const enableAsyncSchedulingByDefaultInReactDOM = false;
20
export const enableCreateRoot = false;
21
export const enableUserTimingAPI = __DEV__;
22
export const enableMutatingReconciler = true;
packages/shared/forks/ReactFeatureFlags.www.js
+1
-4
@@ -11,10 +11,7 @@ import typeof * as FeatureFlagsType from 'shared/ReactFeatureFlags';
11
import typeof * as FeatureFlagsShimType from './ReactFeatureFlags.www';
12
13
// Re-export dynamic flags from the www version.
14
-export const {
15
- debugRenderPhaseSideEffects,
16
- enableAsyncSchedulingByDefaultInReactDOM,
17
-} = require('ReactFeatureFlags');
14
+export const {debugRenderPhaseSideEffects} = require('ReactFeatureFlags');
15
16
// The rest of the flags are static for better dead code elimination.
17
export const enableAsyncSubtreeAPI = true;