mirror of
https://github.com/zebrajr/react.git
synced 2026-01-15 12:15:22 +00:00
* Temporary fix for grabbing wrong rAF polyfill in ReactScheduler **what is the change?:** For now... We need to grab a slightly different implementation of rAF internally at FB than in Open Source. Making rAF a dependency of the ReactScheduler module allows us to fork the dependency at FB. NOTE: After this lands we have an alternative plan to make this module separate from React and require it before our Facebook timer polyfills are applied. But want to land this now to keep master in a working state and fix bugs folks are seeing at Facebook. Thanks @sebmarkbage @acdlite and @sophiebits for discussing the options and trade-offs for solving this issue. **why make this change?:** This fixes a problem we're running into when experimenting with ReactScheduler internally at Facebook, **and* it's part of our long term plan to use dependency injection with the scheduler to make it easier to test and adjust. **test plan:** Ran tests, lint, flow, and will manually test when syncing into Facebook's codebase. **issue:** See internal task T29442940 * ran prettier
168 lines
5.4 KiB
JavaScript
168 lines
5.4 KiB
JavaScript
'use strict';
|
|
|
|
const bundleTypes = require('./bundles').bundleTypes;
|
|
|
|
const UMD_DEV = bundleTypes.UMD_DEV;
|
|
const UMD_PROD = bundleTypes.UMD_PROD;
|
|
const FB_WWW_DEV = bundleTypes.FB_WWW_DEV;
|
|
const FB_WWW_PROD = bundleTypes.FB_WWW_PROD;
|
|
const RN_OSS_DEV = bundleTypes.RN_OSS_DEV;
|
|
const RN_OSS_PROD = bundleTypes.RN_OSS_PROD;
|
|
const RN_FB_DEV = bundleTypes.RN_FB_DEV;
|
|
const RN_FB_PROD = bundleTypes.RN_FB_PROD;
|
|
|
|
// If you need to replace a file with another file for a specific environment,
|
|
// add it to this list with the logic for choosing the right replacement.
|
|
const forks = Object.freeze({
|
|
// Optimization: for UMDs, use object-assign polyfill that is already a part
|
|
// of the React package instead of bundling it again.
|
|
'object-assign': (bundleType, entry, dependencies) => {
|
|
if (bundleType !== UMD_DEV && bundleType !== UMD_PROD) {
|
|
// It's only relevant for UMD bundles since that's where the duplication
|
|
// happens. Other bundles just require('object-assign') anyway.
|
|
return null;
|
|
}
|
|
if (dependencies.indexOf('react') === -1) {
|
|
// We can only apply the optimizations to bundle that depend on React
|
|
// because we read assign() from an object exposed on React internals.
|
|
return null;
|
|
}
|
|
// We can use the fork!
|
|
return 'shared/forks/object-assign.umd.js';
|
|
},
|
|
|
|
// We have a few forks for different environments.
|
|
'shared/ReactFeatureFlags': (bundleType, entry) => {
|
|
switch (entry) {
|
|
case 'react-native-renderer':
|
|
switch (bundleType) {
|
|
case RN_FB_DEV:
|
|
case RN_FB_PROD:
|
|
return 'shared/forks/ReactFeatureFlags.native-fb.js';
|
|
case RN_OSS_DEV:
|
|
case RN_OSS_PROD:
|
|
return 'shared/forks/ReactFeatureFlags.native-oss.js';
|
|
default:
|
|
throw Error(
|
|
`Unexpected entry (${entry}) and bundleType (${bundleType})`
|
|
);
|
|
}
|
|
case 'react-native-renderer/fabric':
|
|
switch (bundleType) {
|
|
case RN_FB_DEV:
|
|
case RN_FB_PROD:
|
|
return 'shared/forks/ReactFeatureFlags.native-fabric-fb.js';
|
|
case RN_OSS_DEV:
|
|
case RN_OSS_PROD:
|
|
return 'shared/forks/ReactFeatureFlags.native-fabric-oss.js';
|
|
default:
|
|
throw Error(
|
|
`Unexpected entry (${entry}) and bundleType (${bundleType})`
|
|
);
|
|
}
|
|
case 'react-reconciler/persistent':
|
|
return 'shared/forks/ReactFeatureFlags.persistent.js';
|
|
case 'react-test-renderer':
|
|
return 'shared/forks/ReactFeatureFlags.test-renderer.js';
|
|
default:
|
|
switch (bundleType) {
|
|
case FB_WWW_DEV:
|
|
case FB_WWW_PROD:
|
|
return 'shared/forks/ReactFeatureFlags.www.js';
|
|
}
|
|
}
|
|
return null;
|
|
},
|
|
|
|
// This logic is forked on www to use the 'acrossTransitions' version.
|
|
'shared/requestAnimationFrameForReact': (bundleType, entry) => {
|
|
switch (bundleType) {
|
|
case FB_WWW_DEV:
|
|
case FB_WWW_PROD:
|
|
return 'shared/forks/requestAnimationFrameForReact.www.js';
|
|
default:
|
|
return null;
|
|
}
|
|
},
|
|
|
|
// This logic is forked on www to blacklist warnings.
|
|
'shared/lowPriorityWarning': (bundleType, entry) => {
|
|
switch (bundleType) {
|
|
case FB_WWW_DEV:
|
|
case FB_WWW_PROD:
|
|
return 'shared/forks/lowPriorityWarning.www.js';
|
|
default:
|
|
return null;
|
|
}
|
|
},
|
|
|
|
// In FB bundles, we preserve an inline require to ReactCurrentOwner.
|
|
// See the explanation in FB version of ReactCurrentOwner in www:
|
|
'react/src/ReactCurrentOwner': (bundleType, entry) => {
|
|
switch (bundleType) {
|
|
case FB_WWW_DEV:
|
|
case FB_WWW_PROD:
|
|
return 'react/src/forks/ReactCurrentOwner.www.js';
|
|
default:
|
|
return null;
|
|
}
|
|
},
|
|
|
|
// Different wrapping/reporting for caught errors.
|
|
'shared/invokeGuardedCallback': (bundleType, entry) => {
|
|
switch (bundleType) {
|
|
case FB_WWW_DEV:
|
|
case FB_WWW_PROD:
|
|
return 'shared/forks/invokeGuardedCallback.www.js';
|
|
default:
|
|
return null;
|
|
}
|
|
},
|
|
|
|
// Different dialogs for caught errors.
|
|
'react-reconciler/src/ReactFiberErrorDialog': (bundleType, entry) => {
|
|
switch (bundleType) {
|
|
case FB_WWW_DEV:
|
|
case FB_WWW_PROD:
|
|
// Use the www fork which shows an error dialog.
|
|
return 'react-reconciler/src/forks/ReactFiberErrorDialog.www.js';
|
|
case RN_OSS_DEV:
|
|
case RN_OSS_PROD:
|
|
case RN_FB_DEV:
|
|
case RN_FB_PROD:
|
|
switch (entry) {
|
|
case 'react-native-renderer':
|
|
case 'react-native-renderer/fabric':
|
|
// Use the RN fork which plays well with redbox.
|
|
return 'react-reconciler/src/forks/ReactFiberErrorDialog.native.js';
|
|
default:
|
|
return null;
|
|
}
|
|
default:
|
|
return null;
|
|
}
|
|
},
|
|
|
|
// We wrap top-level listeners into guards on www.
|
|
'react-dom/src/events/EventListener': (bundleType, entry) => {
|
|
switch (bundleType) {
|
|
case FB_WWW_DEV:
|
|
case FB_WWW_PROD:
|
|
// Use the www fork which is integrated with TimeSlice profiling.
|
|
return 'react-dom/src/events/forks/EventListener-www.js';
|
|
default:
|
|
return null;
|
|
}
|
|
},
|
|
|
|
// React DOM uses different top level event names and supports mouse events.
|
|
'events/ResponderTopLevelEventTypes': (bundleType, entry) => {
|
|
if (entry === 'react-dom' || entry.startsWith('react-dom/')) {
|
|
return 'events/forks/ResponderTopLevelEventTypes.dom.js';
|
|
}
|
|
return null;
|
|
},
|
|
});
|
|
|
|
module.exports = forks;
|