From e59c3a6eaac3450d978e40d666d1a64be641c329 Mon Sep 17 00:00:00 2001 From: Sophie Alpert Date: Mon, 5 Nov 2018 11:16:25 -0800 Subject: [PATCH] DCE hooks code when flag is off --- .../src/server/ReactPartialRenderer.js | 8 +++++++- .../src/server/ReactPartialRendererHooks.js | 3 +++ .../src/ReactFiberCommitWork.js | 4 ++++ .../src/ReactFiberDispatcher.js | 3 +++ .../react-reconciler/src/ReactFiberHooks.js | 12 ++++++++++++ .../react-reconciler/src/ReactFiberScheduler.js | 17 +++++++++++++---- 6 files changed, 42 insertions(+), 5 deletions(-) diff --git a/packages/react-dom/src/server/ReactPartialRenderer.js b/packages/react-dom/src/server/ReactPartialRenderer.js index 1ee885c68abc2..fddd4c0a06428 100644 --- a/packages/react-dom/src/server/ReactPartialRenderer.js +++ b/packages/react-dom/src/server/ReactPartialRenderer.js @@ -25,6 +25,7 @@ import describeComponentFrame from 'shared/describeComponentFrame'; import ReactSharedInternals from 'shared/ReactSharedInternals'; import { warnAboutDeprecatedLifecycles, + enableHooks, enableSuspenseServerRenderer, } from 'shared/ReactFeatureFlags'; @@ -52,6 +53,7 @@ import { prepareToUseHooks, finishHooks, Dispatcher, + DispatcherWithoutHooks, } from './ReactPartialRendererHooks'; import { Namespaces, @@ -819,7 +821,11 @@ class ReactDOMServerRenderer { return null; } - ReactCurrentOwner.currentDispatcher = Dispatcher; + if (enableHooks) { + ReactCurrentOwner.currentDispatcher = Dispatcher; + } else { + ReactCurrentOwner.currentDispatcher = DispatcherWithoutHooks; + } try { let out = ''; while (out.length < bytes) { diff --git a/packages/react-dom/src/server/ReactPartialRendererHooks.js b/packages/react-dom/src/server/ReactPartialRendererHooks.js index 1904249de3120..d3ddf0d6b6157 100644 --- a/packages/react-dom/src/server/ReactPartialRendererHooks.js +++ b/packages/react-dom/src/server/ReactPartialRendererHooks.js @@ -350,3 +350,6 @@ export const Dispatcher = { // Effects are not run in the server environment. useEffect: noop, }; +export const DispatcherWithoutHooks = { + readContext, +}; diff --git a/packages/react-reconciler/src/ReactFiberCommitWork.js b/packages/react-reconciler/src/ReactFiberCommitWork.js index d28b9f5936b83..b8e4ac203b66b 100644 --- a/packages/react-reconciler/src/ReactFiberCommitWork.js +++ b/packages/react-reconciler/src/ReactFiberCommitWork.js @@ -22,6 +22,7 @@ import type {SuspenseState} from './ReactFiberSuspenseComponent'; import type {FunctionComponentUpdateQueue} from './ReactFiberHooks'; import { + enableHooks, enableSchedulerTracing, enableProfilerTimer, } from 'shared/ReactFeatureFlags'; @@ -278,6 +279,9 @@ function commitHookEffectList( mountTag: number, finishedWork: Fiber, ) { + if (!enableHooks) { + return; + } const updateQueue: FunctionComponentUpdateQueue | null = (finishedWork.updateQueue: any); let lastEffect = updateQueue !== null ? updateQueue.lastEffect : null; if (lastEffect !== null) { diff --git a/packages/react-reconciler/src/ReactFiberDispatcher.js b/packages/react-reconciler/src/ReactFiberDispatcher.js index b5f27df334b7f..26ecac9cc5ff2 100644 --- a/packages/react-reconciler/src/ReactFiberDispatcher.js +++ b/packages/react-reconciler/src/ReactFiberDispatcher.js @@ -34,3 +34,6 @@ export const Dispatcher = { useRef, useState, }; +export const DispatcherWithoutHooks = { + readContext, +}; diff --git a/packages/react-reconciler/src/ReactFiberHooks.js b/packages/react-reconciler/src/ReactFiberHooks.js index ddd4bcac9b2fa..cd898e3e0f7b3 100644 --- a/packages/react-reconciler/src/ReactFiberHooks.js +++ b/packages/react-reconciler/src/ReactFiberHooks.js @@ -13,6 +13,7 @@ import type {ExpirationTime} from './ReactFiberExpirationTime'; import type {HookEffectTag} from './ReactHookEffectTags'; import {NoWork} from './ReactFiberExpirationTime'; +import {enableHooks} from 'shared/ReactFeatureFlags'; import {readContext} from './ReactFiberNewContext'; import { Snapshot as SnapshotEffect, @@ -124,6 +125,9 @@ export function prepareToUseHooks( workInProgress: Fiber, nextRenderExpirationTime: ExpirationTime, ): void { + if (!enableHooks) { + return; + } renderExpirationTime = nextRenderExpirationTime; currentlyRenderingFiber = workInProgress; firstCurrentHook = current !== null ? current.memoizedState : null; @@ -147,6 +151,10 @@ export function finishHooks( children: any, refOrContext: any, ): any { + if (!enableHooks) { + return children; + } + // This must be called after every function component to prevent hooks from // being used in classes. @@ -206,6 +214,10 @@ export function finishHooks( } export function resetHooks(): void { + if (!enableHooks) { + return; + } + // This is called instead of `finishHooks` if the component throws. It's also // called inside mountIndeterminateComponent if we determine the component // is a module-style component. diff --git a/packages/react-reconciler/src/ReactFiberScheduler.js b/packages/react-reconciler/src/ReactFiberScheduler.js index 866fa9cdcc655..75717b03d7d17 100644 --- a/packages/react-reconciler/src/ReactFiberScheduler.js +++ b/packages/react-reconciler/src/ReactFiberScheduler.js @@ -56,6 +56,7 @@ import { SimpleMemoComponent, } from 'shared/ReactWorkTags'; import { + enableHooks, enableSchedulerTracing, enableProfilerTimer, enableUserTimingAPI, @@ -164,7 +165,7 @@ import { commitDetachRef, commitPassiveHookEffects, } from './ReactFiberCommitWork'; -import {Dispatcher} from './ReactFiberDispatcher'; +import {Dispatcher, DispatcherWithoutHooks} from './ReactFiberDispatcher'; export type Thenable = { then(resolve: () => mixed, reject?: () => mixed): mixed, @@ -504,7 +505,7 @@ function commitAllLifeCycles( commitAttachRef(nextEffect); } - if (effectTag & Passive) { + if (enableHooks && effectTag & Passive) { rootWithPendingPassiveEffects = finishedRoot; } @@ -768,7 +769,11 @@ function commitRoot(root: FiberRoot, finishedWork: Fiber): void { } } - if (firstEffect !== null && rootWithPendingPassiveEffects !== null) { + if ( + enableHooks && + firstEffect !== null && + rootWithPendingPassiveEffects !== null + ) { // This commit included a passive effect. These do not need to fire until // after the next paint. Schedule an callback to fire them in an async // event. To ensure serial execution, the callback will be flushed early if @@ -1192,7 +1197,11 @@ function renderRoot(root: FiberRoot, isYieldy: boolean): void { flushPassiveEffects(); isWorking = true; - ReactCurrentOwner.currentDispatcher = Dispatcher; + if (enableHooks) { + ReactCurrentOwner.currentDispatcher = Dispatcher; + } else { + ReactCurrentOwner.currentDispatcher = DispatcherWithoutHooks; + } const expirationTime = root.nextExpirationTimeToWorkOn;