mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
306edff62c
Summary: The `Systrace` and `Refresh` dependencies are injected into the `metroRequire` implementation by assigning the values to e.g. `require.Systrace = ...`. The issue with this approach is that some `require` implementations might not support extending the `require` object or doing so results in a degraded performance. An example where this is the case is Hermes where changing the `require` object forces Hermes to opt out of the static require optimization. This diff extends Metro so that the `Systrace` and `Refresh` implementation can either be injected by assigning to `require.Systrace` or by exposing the implementation in the global scope. It further changes the `Systrace` and `Refresh` modules to inject the instances using the global scope instead of extending `require`. Changelog: [Internal][Changed] - Expose Systrace and ReactRefresh as globals instead of extending require. Reviewed By: motiz88 Differential Revision: D25693381 fbshipit-source-id: 254d66d43e7a56d3310cf1a17d5146b8d1307562
52 lines
1.5 KiB
JavaScript
52 lines
1.5 KiB
JavaScript
/**
|
|
* 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.
|
|
*
|
|
* @flow
|
|
* @format
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
if (__DEV__) {
|
|
const DevSettings = require('../Utilities/DevSettings');
|
|
|
|
if (typeof DevSettings.reload !== 'function') {
|
|
throw new Error('Could not find the reload() implementation.');
|
|
}
|
|
|
|
// This needs to run before the renderer initializes.
|
|
const ReactRefreshRuntime = require('react-refresh/runtime');
|
|
ReactRefreshRuntime.injectIntoGlobalHook(global);
|
|
|
|
const Refresh = {
|
|
performFullRefresh(reason: string) {
|
|
DevSettings.reload(reason);
|
|
},
|
|
|
|
createSignatureFunctionForTransform:
|
|
ReactRefreshRuntime.createSignatureFunctionForTransform,
|
|
|
|
isLikelyComponentType: ReactRefreshRuntime.isLikelyComponentType,
|
|
|
|
getFamilyByType: ReactRefreshRuntime.getFamilyByType,
|
|
|
|
register: ReactRefreshRuntime.register,
|
|
|
|
performReactRefresh() {
|
|
if (ReactRefreshRuntime.hasUnrecoverableErrors()) {
|
|
DevSettings.reload('Fast Refresh - Unrecoverable');
|
|
return;
|
|
}
|
|
ReactRefreshRuntime.performReactRefresh();
|
|
DevSettings.onFastRefresh();
|
|
},
|
|
};
|
|
|
|
// The metro require polyfill can not have dependencies (applies for all polyfills).
|
|
// Expose `Refresh` by assigning it to global to make it available in the polyfill.
|
|
global[(global.__METRO_GLOBAL_PREFIX__ || '') + '__ReactRefresh'] = Refresh;
|
|
}
|