From 6c6efc19d4e94215dc665441b11d60467d77c4c4 Mon Sep 17 00:00:00 2001 From: Dan Abramov Date: Wed, 12 Feb 2020 17:28:20 +0000 Subject: [PATCH 1/8] Build both stable and experimental WWW builds --- scripts/rollup/build.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/scripts/rollup/build.js b/scripts/rollup/build.js index 97fee0eab2853..7dc7825737be0 100644 --- a/scripts/rollup/build.js +++ b/scripts/rollup/build.js @@ -679,17 +679,17 @@ async function buildEverything() { [bundle, NODE_DEV], [bundle, NODE_PROD], [bundle, NODE_PROFILING], + [bundle, FB_WWW_DEV], + [bundle, FB_WWW_PROD], + [bundle, FB_WWW_PROFILING], [bundle, RN_OSS_DEV], [bundle, RN_OSS_PROD], - [bundle, RN_OSS_PROFILING] + [bundle, RN_OSS_PROFILING], ); if (__EXPERIMENTAL__) { - // FB specific builds are experimental-only. + // FB-specific RN builds are experimental-only. bundles.push( - [bundle, FB_WWW_DEV], - [bundle, FB_WWW_PROD], - [bundle, FB_WWW_PROFILING], [bundle, RN_FB_DEV], [bundle, RN_FB_PROD], [bundle, RN_FB_PROFILING] From c2fc53bf1e2bb32336bf19f86cbfab215ab93737 Mon Sep 17 00:00:00 2001 From: Dan Abramov Date: Wed, 12 Feb 2020 17:28:56 +0000 Subject: [PATCH 2/8] Flip already experimental WWW flags to true --- packages/shared/forks/ReactFeatureFlags.www.js | 4 ++-- scripts/rollup/build.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/shared/forks/ReactFeatureFlags.www.js b/packages/shared/forks/ReactFeatureFlags.www.js index 74f346b017b52..2ae72b0352090 100644 --- a/packages/shared/forks/ReactFeatureFlags.www.js +++ b/packages/shared/forks/ReactFeatureFlags.www.js @@ -40,12 +40,12 @@ export const disableSchedulerTimeoutBasedOnReactExpirationTime = false; export const enableTrainModelFix = true; -export const exposeConcurrentModeAPIs = __EXPERIMENTAL__; +export const exposeConcurrentModeAPIs = true; export const enableSuspenseServerRenderer = true; export const enableSelectiveHydration = true; -export const enableChunksAPI = __EXPERIMENTAL__; +export const enableChunksAPI = true; export const disableJavaScriptURLs = true; diff --git a/scripts/rollup/build.js b/scripts/rollup/build.js index 7dc7825737be0..efdc6bef1b35f 100644 --- a/scripts/rollup/build.js +++ b/scripts/rollup/build.js @@ -684,7 +684,7 @@ async function buildEverything() { [bundle, FB_WWW_PROFILING], [bundle, RN_OSS_DEV], [bundle, RN_OSS_PROD], - [bundle, RN_OSS_PROFILING], + [bundle, RN_OSS_PROFILING] ); if (__EXPERIMENTAL__) { From dd7b0ad5ae9d1d28e71c0ccebff9d8fa09dcaae3 Mon Sep 17 00:00:00 2001 From: Dan Abramov Date: Wed, 12 Feb 2020 17:33:07 +0000 Subject: [PATCH 3/8] Remove FB-specific internals from modern FB builds We think we're not going to need these. --- packages/react-dom/src/client/ReactDOMFB.js | 31 ++++++++++++--------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/packages/react-dom/src/client/ReactDOMFB.js b/packages/react-dom/src/client/ReactDOMFB.js index 877c7d2ea3f15..5acb45d81e9bb 100644 --- a/packages/react-dom/src/client/ReactDOMFB.js +++ b/packages/react-dom/src/client/ReactDOMFB.js @@ -13,19 +13,24 @@ import ReactDOM from './ReactDOM'; import {isEnabled} from '../events/ReactBrowserEventEmitter'; import {getClosestInstanceFromNode} from './ReactDOMComponentTree'; -Object.assign( - (ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: any), - { - // These are real internal dependencies that are trickier to remove: - ReactBrowserEventEmitter: { - isEnabled, +if (__EXPERIMENTAL__) { + // This is a modern WWW build. + // It should be the same as open source. Don't add new things here. +} else { + // For classic WWW builds, include a few internals that are already in use. + Object.assign( + (ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: any), + { + ReactBrowserEventEmitter: { + isEnabled, + }, + ReactDOMComponentTree: { + getClosestInstanceFromNode, + }, + // Perf experiment + addUserTimingListener, }, - ReactDOMComponentTree: { - getClosestInstanceFromNode, - }, - // Perf experiment - addUserTimingListener, - }, -); + ); +} export default ReactDOM; From 9aff12e12c93022a944537a6f3df69e49c679737 Mon Sep 17 00:00:00 2001 From: Dan Abramov Date: Wed, 12 Feb 2020 17:37:23 +0000 Subject: [PATCH 4/8] Disable classic features in modern WWW builds --- packages/shared/forks/ReactFeatureFlags.www.js | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/packages/shared/forks/ReactFeatureFlags.www.js b/packages/shared/forks/ReactFeatureFlags.www.js index 2ae72b0352090..0f7b3e6bd3441 100644 --- a/packages/shared/forks/ReactFeatureFlags.www.js +++ b/packages/shared/forks/ReactFeatureFlags.www.js @@ -19,13 +19,16 @@ export const { warnAboutShorthandPropertyCollision, } = require('ReactFeatureFlags'); +// On WWW, __EXPERIMENTAL__ is used for a new modern build. +// It's not used anywhere in production yet. + // In www, we have experimental support for gathering data // from User Timing API calls in production. By default, we // only emit performance.mark/measure calls in __DEV__. But if // somebody calls addUserTimingListener() which is exposed as an // experimental FB-only export, we call performance.mark/measure // as long as there is more than a single listener. -export let enableUserTimingAPI = __DEV__; +export let enableUserTimingAPI = !__EXPERIMENTAL__; export const enableProfilerTimer = __PROFILE__; export const enableSchedulerTracing = __PROFILE__; @@ -33,7 +36,7 @@ export const enableSchedulerDebugging = true; export const replayFailedUnitOfWorkWithInvokeGuardedCallback = false; export const warnAboutDeprecatedLifecycles = true; -export const disableLegacyContext = false; +export const disableLegacyContext = __EXPERIMENTAL__; export const warnAboutStringRefs = false; export const warnAboutDefaultPropsOnFunctionComponents = false; export const disableSchedulerTimeoutBasedOnReactExpirationTime = false; @@ -92,17 +95,17 @@ export const flushSuspenseFallbacksInTests = true; export const enableNativeTargetAsInstance = false; -export const disableCreateFactory = false; +export const disableCreateFactory = __EXPERIMENTAL__; -export const disableTextareaChildren = false; +export const disableTextareaChildren = __EXPERIMENTAL__; -export const disableMapsAsChildren = false; +export const disableMapsAsChildren = __EXPERIMENTAL__; -export const disableUnstableRenderSubtreeIntoContainer = false; +export const disableUnstableRenderSubtreeIntoContainer = __EXPERIMENTAL__; export const warnUnstableRenderSubtreeIntoContainer = false; -export const disableUnstableCreatePortal = false; +export const disableUnstableCreatePortal = __EXPERIMENTAL__; export const isTestEnvironment = false; From 84d04f6bd7094e225510e74836f6b7eab0104c6b Mon Sep 17 00:00:00 2001 From: Dan Abramov Date: Wed, 12 Feb 2020 17:49:37 +0000 Subject: [PATCH 5/8] Disable legacy ReactDOM API for modern WWW build --- packages/react-dom/src/client/ReactDOM.js | 14 ++++++++------ packages/react-reconciler/src/ReactFiber.js | 8 ++++++-- packages/shared/ReactFeatureFlags.js | 3 +++ .../shared/forks/ReactFeatureFlags.native-fb.js | 1 + .../shared/forks/ReactFeatureFlags.native-oss.js | 1 + .../shared/forks/ReactFeatureFlags.persistent.js | 1 + .../forks/ReactFeatureFlags.test-renderer.js | 1 + .../forks/ReactFeatureFlags.test-renderer.www.js | 1 + packages/shared/forks/ReactFeatureFlags.testing.js | 1 + packages/shared/forks/ReactFeatureFlags.www.js | 2 ++ 10 files changed, 25 insertions(+), 8 deletions(-) diff --git a/packages/react-dom/src/client/ReactDOM.js b/packages/react-dom/src/client/ReactDOM.js index ee54497f232af..f542aa752b1f5 100644 --- a/packages/react-dom/src/client/ReactDOM.js +++ b/packages/react-dom/src/client/ReactDOM.js @@ -56,6 +56,7 @@ import ReactVersion from 'shared/ReactVersion'; import invariant from 'shared/invariant'; import { exposeConcurrentModeAPIs, + disableLegacyReactDOMAPIs, disableUnstableCreatePortal, disableUnstableRenderSubtreeIntoContainer, warnUnstableRenderSubtreeIntoContainer, @@ -133,12 +134,6 @@ function createPortal( const ReactDOM: Object = { createPortal, - // Legacy - findDOMNode, - hydrate, - render, - unmountComponentAtNode, - unstable_batchedUpdates: batchedUpdates, flushSync: flushSync, @@ -166,6 +161,13 @@ const ReactDOM: Object = { version: ReactVersion, }; +if (!disableLegacyReactDOMAPIs) { + ReactDOM.findDOMNode = findDOMNode; + ReactDOM.hydrate = hydrate; + ReactDOM.render = render; + ReactDOM.unmountComponentAtNode = unmountComponentAtNode; +} + if (exposeConcurrentModeAPIs) { ReactDOM.createRoot = createRoot; ReactDOM.createBlockingRoot = createBlockingRoot; diff --git a/packages/react-reconciler/src/ReactFiber.js b/packages/react-reconciler/src/ReactFiber.js index 792cd1def4db5..a51116219927f 100644 --- a/packages/react-reconciler/src/ReactFiber.js +++ b/packages/react-reconciler/src/ReactFiber.js @@ -425,7 +425,9 @@ export function createWorkInProgress( if (__DEV__) { // DEV-only fields - workInProgress._debugID = current._debugID; + if (enableUserTimingAPI) { + workInProgress._debugID = current._debugID; + } workInProgress._debugSource = current._debugSource; workInProgress._debugOwner = current._debugOwner; workInProgress._debugHookTypes = current._debugHookTypes; @@ -958,7 +960,9 @@ export function assignFiberPropertiesInDEV( target.selfBaseDuration = source.selfBaseDuration; target.treeBaseDuration = source.treeBaseDuration; } - target._debugID = source._debugID; + if (enableUserTimingAPI) { + target._debugID = source._debugID; + } target._debugSource = source._debugSource; target._debugOwner = source._debugOwner; target._debugIsCurrentlyTiming = source._debugIsCurrentlyTiming; diff --git a/packages/shared/ReactFeatureFlags.js b/packages/shared/ReactFeatureFlags.js index c73997f1dcef9..0dd89f7674a5b 100644 --- a/packages/shared/ReactFeatureFlags.js +++ b/packages/shared/ReactFeatureFlags.js @@ -114,6 +114,9 @@ export const disableLegacyContext = false; // Disables React.createFactory export const disableCreateFactory = false; +// Disables hydrate, render, findDOMNode, unmountComponentAtNode +export const disableLegacyReactDOMAPIs = false; + // Disables children for