Skip to content

Commit 6cb2677

Browse files
authored
Enable hooks! (#14679)
* Turned enableHooks feature flag on everywhere * Removed useHooks feature flag from tests (now that it's on by default) * Remove useHooks feature flag entirely
1 parent 73962c3 commit 6cb2677

27 files changed

+32
-107
lines changed

Diff for: packages/react-debug-tools/src/__tests__/ReactHooksInspection-test.internal.js renamed to packages/react-debug-tools/src/__tests__/ReactHooksInspection-test.js

-3
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,6 @@ let ReactDebugTools;
1616
describe('ReactHooksInspection', () => {
1717
beforeEach(() => {
1818
jest.resetModules();
19-
let ReactFeatureFlags = require('shared/ReactFeatureFlags');
20-
// TODO: Switch this test to non-internal once the flag is on by default.
21-
ReactFeatureFlags.enableHooks = true;
2219
React = require('react');
2320
ReactDebugTools = require('react-debug-tools');
2421
});

Diff for: packages/react-debug-tools/src/__tests__/ReactHooksInspectionIntegration-test.internal.js renamed to packages/react-debug-tools/src/__tests__/ReactHooksInspectionIntegration-test.js

-3
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,6 @@ let ReactDebugTools;
1717
describe('ReactHooksInspectionIntergration', () => {
1818
beforeEach(() => {
1919
jest.resetModules();
20-
let ReactFeatureFlags = require('shared/ReactFeatureFlags');
21-
// TODO: Switch this test to non-internal once the flag is on by default.
22-
ReactFeatureFlags.enableHooks = true;
2320
React = require('react');
2421
ReactTestRenderer = require('react-test-renderer');
2522
ReactDebugTools = require('react-debug-tools');

Diff for: packages/react-dom/src/__tests__/ReactDOMServerIntegrationHooks-test.internal.js

-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ function initModules() {
3838

3939
ReactFeatureFlags = require('shared/ReactFeatureFlags');
4040
ReactFeatureFlags.debugRenderPhaseSideEffectsForStrictMode = false;
41-
ReactFeatureFlags.enableHooks = true;
4241
React = require('react');
4342
ReactDOM = require('react-dom');
4443
ReactDOMServer = require('react-dom/server');

Diff for: packages/react-dom/src/__tests__/ReactDOMSuspensePlaceholder-test.internal.js renamed to packages/react-dom/src/__tests__/ReactDOMSuspensePlaceholder-test.js

-3
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99

1010
'use strict';
1111

12-
let ReactFeatureFlags;
1312
let React;
1413
let ReactDOM;
1514
let Suspense;
@@ -21,8 +20,6 @@ describe('ReactDOMSuspensePlaceholder', () => {
2120

2221
beforeEach(() => {
2322
jest.resetModules();
24-
ReactFeatureFlags = require('shared/ReactFeatureFlags');
25-
ReactFeatureFlags.enableHooks = true;
2623
React = require('react');
2724
ReactDOM = require('react-dom');
2825
ReactCache = require('react-cache');

Diff for: packages/react-dom/src/__tests__/ReactErrorBoundaries-test.internal.js

-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ describe('ReactErrorBoundaries', () => {
4141
jest.resetModules();
4242
PropTypes = require('prop-types');
4343
ReactFeatureFlags = require('shared/ReactFeatureFlags');
44-
ReactFeatureFlags.enableHooks = true;
4544
ReactFeatureFlags.replayFailedUnitOfWorkWithInvokeGuardedCallback = false;
4645
ReactDOM = require('react-dom');
4746
React = require('react');

Diff for: packages/react-dom/src/server/ReactPartialRenderer.js

+1-7
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import describeComponentFrame from 'shared/describeComponentFrame';
2121
import ReactSharedInternals from 'shared/ReactSharedInternals';
2222
import {
2323
warnAboutDeprecatedLifecycles,
24-
enableHooks,
2524
enableSuspenseServerRenderer,
2625
} from 'shared/ReactFeatureFlags';
2726

@@ -55,7 +54,6 @@ import {
5554
prepareToUseHooks,
5655
finishHooks,
5756
Dispatcher,
58-
DispatcherWithoutHooks,
5957
currentThreadID,
6058
setCurrentThreadID,
6159
} from './ReactPartialRendererHooks';
@@ -786,11 +784,7 @@ class ReactDOMServerRenderer {
786784
const prevThreadID = currentThreadID;
787785
setCurrentThreadID(this.threadID);
788786
const prevDispatcher = ReactCurrentDispatcher.current;
789-
if (enableHooks) {
790-
ReactCurrentDispatcher.current = Dispatcher;
791-
} else {
792-
ReactCurrentDispatcher.current = DispatcherWithoutHooks;
793-
}
787+
ReactCurrentDispatcher.current = Dispatcher;
794788
try {
795789
// Markup generated within <Suspense> ends up buffered until we know
796790
// nothing in that boundary suspended

Diff for: packages/react-dom/src/server/ReactPartialRendererHooks.js

-3
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,3 @@ export const Dispatcher: DispatcherType = {
423423
// Debugging effect
424424
useDebugValue: noop,
425425
};
426-
export const DispatcherWithoutHooks = {
427-
readContext,
428-
};

Diff for: packages/react-reconciler/src/ReactFiberCommitWork.js

-4
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import type {Thenable} from './ReactFiberScheduler';
2424

2525
import {unstable_wrap as Schedule_tracing_wrap} from 'scheduler/tracing';
2626
import {
27-
enableHooks,
2827
enableSchedulerTracing,
2928
enableProfilerTimer,
3029
} from 'shared/ReactFeatureFlags';
@@ -312,9 +311,6 @@ function commitHookEffectList(
312311
mountTag: number,
313312
finishedWork: Fiber,
314313
) {
315-
if (!enableHooks) {
316-
return;
317-
}
318314
const updateQueue: FunctionComponentUpdateQueue | null = (finishedWork.updateQueue: any);
319315
let lastEffect = updateQueue !== null ? updateQueue.lastEffect : null;
320316
if (lastEffect !== null) {

Diff for: packages/react-reconciler/src/ReactFiberDispatcher.js

-3
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,3 @@ export const Dispatcher = {
3434
useRef,
3535
useState,
3636
};
37-
export const DispatcherWithoutHooks = {
38-
readContext,
39-
};

Diff for: packages/react-reconciler/src/ReactFiberHooks.js

-7
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import type {ExpirationTime} from './ReactFiberExpirationTime';
1313
import type {HookEffectTag} from './ReactHookEffectTags';
1414

1515
import {NoWork} from './ReactFiberExpirationTime';
16-
import {enableHooks} from 'shared/ReactFeatureFlags';
1716
import {
1817
readContext,
1918
stashContextDependencies,
@@ -296,9 +295,6 @@ export function renderWithHooks(
296295
refOrContext: any,
297296
nextRenderExpirationTime: ExpirationTime,
298297
): any {
299-
if (!enableHooks) {
300-
return Component(props, refOrContext);
301-
}
302298
renderExpirationTime = nextRenderExpirationTime;
303299
currentlyRenderingFiber = workInProgress;
304300
firstCurrentHook = current !== null ? current.memoizedState : null;
@@ -397,9 +393,6 @@ export function bailoutHooks(
397393
}
398394

399395
export function resetHooks(): void {
400-
if (!enableHooks) {
401-
return;
402-
}
403396
if (__DEV__) {
404397
flushHookMismatchWarnings();
405398
}

Diff for: packages/react-reconciler/src/ReactFiberScheduler.js

+4-13
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ import {
5656
SimpleMemoComponent,
5757
} from 'shared/ReactWorkTags';
5858
import {
59-
enableHooks,
6059
enableSchedulerTracing,
6160
enableProfilerTimer,
6261
enableUserTimingAPI,
@@ -165,7 +164,7 @@ import {
165164
commitDetachRef,
166165
commitPassiveHookEffects,
167166
} from './ReactFiberCommitWork';
168-
import {Dispatcher, DispatcherWithoutHooks} from './ReactFiberDispatcher';
167+
import {Dispatcher} from './ReactFiberDispatcher';
169168

170169
export type Thenable = {
171170
then(resolve: () => mixed, reject?: () => mixed): mixed,
@@ -510,7 +509,7 @@ function commitAllLifeCycles(
510509
commitAttachRef(nextEffect);
511510
}
512511

513-
if (enableHooks && effectTag & Passive) {
512+
if (effectTag & Passive) {
514513
rootWithPendingPassiveEffects = finishedRoot;
515514
}
516515

@@ -784,11 +783,7 @@ function commitRoot(root: FiberRoot, finishedWork: Fiber): void {
784783
}
785784
}
786785

787-
if (
788-
enableHooks &&
789-
firstEffect !== null &&
790-
rootWithPendingPassiveEffects !== null
791-
) {
786+
if (firstEffect !== null && rootWithPendingPassiveEffects !== null) {
792787
// This commit included a passive effect. These do not need to fire until
793788
// after the next paint. Schedule an callback to fire them in an async
794789
// event. To ensure serial execution, the callback will be flushed early if
@@ -1221,11 +1216,7 @@ function renderRoot(root: FiberRoot, isYieldy: boolean): void {
12211216
flushPassiveEffects();
12221217

12231218
isWorking = true;
1224-
if (enableHooks) {
1225-
ReactCurrentDispatcher.current = Dispatcher;
1226-
} else {
1227-
ReactCurrentDispatcher.current = DispatcherWithoutHooks;
1228-
}
1219+
ReactCurrentDispatcher.current = Dispatcher;
12291220

12301221
const expirationTime = root.nextExpirationTimeToWorkOn;
12311222

Diff for: packages/react-reconciler/src/__tests__/ReactHooks-test.internal.js

-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ describe('ReactHooks', () => {
2525

2626
ReactFeatureFlags = require('shared/ReactFeatureFlags');
2727
ReactFeatureFlags.debugRenderPhaseSideEffectsForStrictMode = false;
28-
ReactFeatureFlags.enableHooks = true;
2928
React = require('react');
3029
ReactTestRenderer = require('react-test-renderer');
3130
ReactDOMServer = require('react-dom/server');

Diff for: packages/react-reconciler/src/__tests__/ReactHooksWithNoopRenderer-test.internal.js

-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@ describe('ReactHooksWithNoopRenderer', () => {
5959

6060
ReactFeatureFlags = require('shared/ReactFeatureFlags');
6161
ReactFeatureFlags.debugRenderPhaseSideEffectsForStrictMode = false;
62-
ReactFeatureFlags.enableHooks = true;
6362
ReactFeatureFlags.enableSchedulerTracing = true;
6463
React = require('react');
6564
ReactNoop = require('react-noop-renderer');

Diff for: packages/react-reconciler/src/__tests__/ReactNewContext-test.internal.js

-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ describe('ReactNewContext', () => {
2121
jest.resetModules();
2222
ReactFeatureFlags = require('shared/ReactFeatureFlags');
2323
ReactFeatureFlags.debugRenderPhaseSideEffectsForStrictMode = false;
24-
ReactFeatureFlags.enableHooks = true;
2524
React = require('react');
2625
useContext = React.useContext;
2726
ReactNoop = require('react-noop-renderer');

Diff for: packages/react-reconciler/src/__tests__/ReactSuspense-test.internal.js

-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ describe('ReactSuspense', () => {
1717
ReactFeatureFlags = require('shared/ReactFeatureFlags');
1818
ReactFeatureFlags.debugRenderPhaseSideEffectsForStrictMode = false;
1919
ReactFeatureFlags.replayFailedUnitOfWorkWithInvokeGuardedCallback = false;
20-
ReactFeatureFlags.enableHooks = true;
2120
React = require('react');
2221
ReactTestRenderer = require('react-test-renderer');
2322
// JestReact = require('jest-react');

Diff for: packages/react-reconciler/src/__tests__/ReactSuspenseFuzz-test.internal.js

-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ describe('ReactSuspenseFuzz', () => {
2323
ReactFeatureFlags = require('shared/ReactFeatureFlags');
2424
ReactFeatureFlags.debugRenderPhaseSideEffectsForStrictMode = false;
2525
ReactFeatureFlags.replayFailedUnitOfWorkWithInvokeGuardedCallback = false;
26-
ReactFeatureFlags.enableHooks = true;
2726
React = require('react');
2827
Suspense = React.Suspense;
2928
ReactTestRenderer = require('react-test-renderer');

Diff for: packages/react-reconciler/src/__tests__/ReactSuspenseWithNoopRenderer-test.internal.js

-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ describe('ReactSuspenseWithNoopRenderer', () => {
1717
beforeEach(() => {
1818
jest.resetModules();
1919
ReactFeatureFlags = require('shared/ReactFeatureFlags');
20-
ReactFeatureFlags.enableHooks = true;
2120
ReactFeatureFlags.debugRenderPhaseSideEffectsForStrictMode = false;
2221
ReactFeatureFlags.replayFailedUnitOfWorkWithInvokeGuardedCallback = false;
2322
React = require('react');

Diff for: packages/react-test-renderer/src/ReactShallowRenderer.js

+16-27
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import shallowEqual from 'shared/shallowEqual';
1515
import invariant from 'shared/invariant';
1616
import checkPropTypes from 'prop-types/checkPropTypes';
1717
import ReactSharedInternals from 'shared/ReactSharedInternals';
18-
import {enableHooks} from 'shared/ReactFeatureFlags';
1918
import warning from 'shared/warning';
2019
import is from 'shared/objectIs';
2120

@@ -187,17 +186,15 @@ class ReactShallowRenderer {
187186
this._rendering = false;
188187
this._forcedUpdate = false;
189188
this._updater = new Updater(this);
190-
if (enableHooks) {
191-
this._dispatcher = this._createDispatcher();
192-
this._workInProgressHook = null;
193-
this._firstWorkInProgressHook = null;
194-
this._isReRender = false;
195-
this._didScheduleRenderPhaseUpdate = false;
196-
this._renderPhaseUpdates = null;
197-
this._currentlyRenderingComponent = null;
198-
this._numberOfReRenders = 0;
199-
this._previousComponentIdentity = null;
200-
}
189+
this._dispatcher = this._createDispatcher();
190+
this._workInProgressHook = null;
191+
this._firstWorkInProgressHook = null;
192+
this._isReRender = false;
193+
this._didScheduleRenderPhaseUpdate = false;
194+
this._renderPhaseUpdates = null;
195+
this._currentlyRenderingComponent = null;
196+
this._numberOfReRenders = 0;
197+
this._previousComponentIdentity = null;
201198
}
202199

203200
_context: null | Object;
@@ -560,27 +557,19 @@ class ReactShallowRenderer {
560557

561558
this._mountClassComponent(element, this._context);
562559
} else {
563-
if (enableHooks) {
564-
const prevDispatcher = ReactCurrentDispatcher.current;
565-
ReactCurrentDispatcher.current = this._dispatcher;
566-
this._prepareToUseHooks(element.type);
567-
try {
568-
this._rendered = element.type.call(
569-
undefined,
570-
element.props,
571-
this._context,
572-
);
573-
} finally {
574-
ReactCurrentDispatcher.current = prevDispatcher;
575-
}
576-
this._finishHooks(element, context);
577-
} else {
560+
const prevDispatcher = ReactCurrentDispatcher.current;
561+
ReactCurrentDispatcher.current = this._dispatcher;
562+
this._prepareToUseHooks(element.type);
563+
try {
578564
this._rendered = element.type.call(
579565
undefined,
580566
element.props,
581567
this._context,
582568
);
569+
} finally {
570+
ReactCurrentDispatcher.current = prevDispatcher;
583571
}
572+
this._finishHooks(element, context);
584573
}
585574
}
586575

Diff for: packages/react-test-renderer/src/__tests__/ReactShallowRendererHooks-test.internal.js renamed to packages/react-test-renderer/src/__tests__/ReactShallowRendererHooks-test.js

-3
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,6 @@ let React;
1616
describe('ReactShallowRenderer with hooks', () => {
1717
beforeEach(() => {
1818
jest.resetModules();
19-
let ReactFeatureFlags = require('shared/ReactFeatureFlags');
20-
// TODO: Switch this test to non-internal once the flag is on by default.
21-
ReactFeatureFlags.enableHooks = true;
2219
createRenderer = require('react-test-renderer/shallow').createRenderer;
2320
React = require('react');
2421
});

Diff for: packages/react/src/React.js

+11-14
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import {
1313
REACT_STRICT_MODE_TYPE,
1414
REACT_SUSPENSE_TYPE,
1515
} from 'shared/ReactSymbols';
16-
import {enableHooks} from 'shared/ReactFeatureFlags';
1716

1817
import {Component, PureComponent} from './ReactBaseClasses';
1918
import {createRef} from './ReactCreateRef';
@@ -66,6 +65,17 @@ const React = {
6665
lazy,
6766
memo,
6867

68+
useCallback,
69+
useContext,
70+
useEffect,
71+
useImperativeHandle,
72+
useDebugValue,
73+
useLayoutEffect,
74+
useMemo,
75+
useReducer,
76+
useRef,
77+
useState,
78+
6979
Fragment: REACT_FRAGMENT_TYPE,
7080
StrictMode: REACT_STRICT_MODE_TYPE,
7181
Suspense: REACT_SUSPENSE_TYPE,
@@ -95,17 +105,4 @@ if (enableStableConcurrentModeAPIs) {
95105
React.unstable_Profiler = undefined;
96106
}
97107

98-
if (enableHooks) {
99-
React.useCallback = useCallback;
100-
React.useContext = useContext;
101-
React.useEffect = useEffect;
102-
React.useImperativeHandle = useImperativeHandle;
103-
React.useDebugValue = useDebugValue;
104-
React.useLayoutEffect = useLayoutEffect;
105-
React.useMemo = useMemo;
106-
React.useReducer = useReducer;
107-
React.useRef = useRef;
108-
React.useState = useState;
109-
}
110-
111108
export default React;

Diff for: packages/shared/ReactFeatureFlags.js

-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99

1010
export const enableUserTimingAPI = __DEV__;
1111

12-
export const enableHooks = false;
1312
// Helps identify side effects in begin-phase lifecycle hooks and setState reducers:
1413
export const debugRenderPhaseSideEffects = false;
1514

Diff for: packages/shared/forks/ReactFeatureFlags.native-fb.js

-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import typeof * as FeatureFlagsShimType from './ReactFeatureFlags.native-fb';
1616
export const {debugRenderPhaseSideEffects} = require('ReactFeatureFlags');
1717

1818
// The rest of the flags are static for better dead code elimination.
19-
export const enableHooks = true;
2019
export const enableUserTimingAPI = __DEV__;
2120
export const enableProfilerTimer = __PROFILE__;
2221
export const enableSchedulerTracing = __PROFILE__;

Diff for: packages/shared/forks/ReactFeatureFlags.native-oss.js

-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import typeof * as FeatureFlagsShimType from './ReactFeatureFlags.native-oss';
1414

1515
export const debugRenderPhaseSideEffects = false;
1616
export const debugRenderPhaseSideEffectsForStrictMode = false;
17-
export const enableHooks = false;
1817
export const enableUserTimingAPI = __DEV__;
1918
export const replayFailedUnitOfWorkWithInvokeGuardedCallback = __DEV__;
2019
export const warnAboutDeprecatedLifecycles = false;

Diff for: packages/shared/forks/ReactFeatureFlags.persistent.js

-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import typeof * as PersistentFeatureFlagsType from './ReactFeatureFlags.persiste
1515
export const debugRenderPhaseSideEffects = false;
1616
export const debugRenderPhaseSideEffectsForStrictMode = false;
1717
export const enableUserTimingAPI = __DEV__;
18-
export const enableHooks = false;
1918
export const warnAboutDeprecatedLifecycles = false;
2019
export const replayFailedUnitOfWorkWithInvokeGuardedCallback = __DEV__;
2120
export const enableProfilerTimer = __PROFILE__;

0 commit comments

Comments
 (0)