From edfedf3ae9453c646afe5e77c75bd2a53159e262 Mon Sep 17 00:00:00 2001 From: Andrew Clark Date: Fri, 10 May 2019 13:51:39 -0700 Subject: [PATCH] Fork ReactSharedInternals for UMD builds (#15617) --- packages/react/src/ReactSharedInternals.js | 14 ------ .../src/forks/ReactSharedInternals.umd.js | 44 +++++++++++++++++++ .../SchedulerUMDBundle-test.internal.js | 6 ++- .../__tests__/ReactDOMFrameScheduling-test.js | 2 +- scripts/rollup/forks.js | 11 +++++ 5 files changed, 60 insertions(+), 17 deletions(-) create mode 100644 packages/react/src/forks/ReactSharedInternals.umd.js diff --git a/packages/react/src/ReactSharedInternals.js b/packages/react/src/ReactSharedInternals.js index c6d5010cb9..1d1e0a0bfc 100644 --- a/packages/react/src/ReactSharedInternals.js +++ b/packages/react/src/ReactSharedInternals.js @@ -6,8 +6,6 @@ */ import assign from 'object-assign'; -import * as Scheduler from 'scheduler'; -import * as SchedulerTracing from 'scheduler/tracing'; import ReactCurrentDispatcher from './ReactCurrentDispatcher'; import ReactCurrentOwner from './ReactCurrentOwner'; import ReactDebugCurrentFrame from './ReactDebugCurrentFrame'; @@ -21,18 +19,6 @@ const ReactSharedInternals = { assign, }; -if (__UMD__) { - // Re-export the schedule API(s) for UMD bundles. - // This avoids introducing a dependency on a new UMD global in a minor update, - // Since that would be a breaking change (e.g. for all existing CodeSandboxes). - // This re-export is only required for UMD bundles; - // CJS bundles use the shared NPM package. - Object.assign(ReactSharedInternals, { - Scheduler, - SchedulerTracing, - }); -} - if (__DEV__) { Object.assign(ReactSharedInternals, { // These should not be included in production. diff --git a/packages/react/src/forks/ReactSharedInternals.umd.js b/packages/react/src/forks/ReactSharedInternals.umd.js new file mode 100644 index 0000000000..d229434036 --- /dev/null +++ b/packages/react/src/forks/ReactSharedInternals.umd.js @@ -0,0 +1,44 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import assign from 'object-assign'; +import * as Scheduler from 'scheduler'; +import * as SchedulerTracing from 'scheduler/tracing'; +import ReactCurrentDispatcher from '../ReactCurrentDispatcher'; +import ReactCurrentOwner from '../ReactCurrentOwner'; +import ReactDebugCurrentFrame from '../ReactDebugCurrentFrame'; + +const ReactSharedInternals = { + ReactCurrentDispatcher, + ReactCurrentOwner, + // used by act() + ReactShouldWarnActingUpdates: {current: false}, + // Used by renderers to avoid bundling object-assign twice in UMD bundles: + assign, +}; + +if (__DEV__) { + Object.assign(ReactSharedInternals, { + // These should not be included in production. + ReactDebugCurrentFrame, + // Shim for React DOM 16.0.0 which still destructured (but not used) this. + // TODO: remove in React 17.0. + ReactComponentTreeHook: {}, + }); +} + +// Re-export the schedule API(s) for UMD bundles. +// This avoids introducing a dependency on a new UMD global in a minor update, +// Since that would be a breaking change (e.g. for all existing CodeSandboxes). +// This re-export is only required for UMD bundles; +// CJS bundles use the shared NPM package. +Object.assign(ReactSharedInternals, { + Scheduler, + SchedulerTracing, +}); + +export default ReactSharedInternals; diff --git a/packages/scheduler/src/__tests__/SchedulerUMDBundle-test.internal.js b/packages/scheduler/src/__tests__/SchedulerUMDBundle-test.internal.js index 9812ac55b9..001cd8f82e 100644 --- a/packages/scheduler/src/__tests__/SchedulerUMDBundle-test.internal.js +++ b/packages/scheduler/src/__tests__/SchedulerUMDBundle-test.internal.js @@ -55,7 +55,8 @@ describe('Scheduling UMD bundle', () => { const umdAPIDev = require('../../npm/umd/scheduler.development'); const umdAPIProd = require('../../npm/umd/scheduler.production.min'); const umdAPIProfiling = require('../../npm/umd/scheduler.profiling.min'); - const secretAPI = require('react/src/ReactSharedInternals').default; + const secretAPI = require('react/src/forks/ReactSharedInternals.umd') + .default; validateForwardedAPIs(api, [ umdAPIDev, umdAPIProd, @@ -69,7 +70,8 @@ describe('Scheduling UMD bundle', () => { const umdAPIDev = require('../../npm/umd/scheduler-tracing.development'); const umdAPIProd = require('../../npm/umd/scheduler-tracing.production.min'); const umdAPIProfiling = require('../../npm/umd/scheduler-tracing.profiling.min'); - const secretAPI = require('react/src/ReactSharedInternals').default; + const secretAPI = require('react/src/forks/ReactSharedInternals.umd') + .default; validateForwardedAPIs(api, [ umdAPIDev, umdAPIProd, diff --git a/packages/shared/__tests__/ReactDOMFrameScheduling-test.js b/packages/shared/__tests__/ReactDOMFrameScheduling-test.js index 04fb16221c..fa3d145e6c 100644 --- a/packages/shared/__tests__/ReactDOMFrameScheduling-test.js +++ b/packages/shared/__tests__/ReactDOMFrameScheduling-test.js @@ -35,7 +35,7 @@ describe('ReactDOMFrameScheduling', () => { }; spyOnDevAndProd(console, 'error'); require('react-dom'); - expect(console.error.calls.count()).toEqual(2); + expect(console.error.calls.count()).toEqual(1); expect(console.error.calls.argsFor(0)[0]).toMatch( "This browser doesn't support requestAnimationFrame.", ); diff --git a/scripts/rollup/forks.js b/scripts/rollup/forks.js index c93ac87559..96790a1c1e 100644 --- a/scripts/rollup/forks.js +++ b/scripts/rollup/forks.js @@ -230,6 +230,17 @@ const forks = Object.freeze({ } }, + 'react/src/ReactSharedInternals.js': (bundleType, entry) => { + switch (bundleType) { + case UMD_DEV: + case UMD_PROD: + case UMD_PROFILING: + return 'react/src/forks/ReactSharedInternals.umd.js'; + default: + return null; + } + }, + // Different wrapping/reporting for caught errors. 'shared/invokeGuardedCallbackImpl': (bundleType, entry) => { switch (bundleType) {