mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-01-30 09:08:40 +08:00
Make the packager work with babel strict mode transform
Summary: At the moment we have to disable strict mode for the transform-es2015-modules-commonjs because strict mode leaks to the global scope and breaks the bridge. It was due to the way the polyfills were bundled in the package. To fix it, I wrapped the polyfill modules in an IIFE. Then when strict mode was enabled some polyfills were broken due to strict mode errors so that was fixed too. Also removed the IIFE from the polyfills that included one. This diff doesn't enable the strict mode transform since some internal facebook modules depend on it not being enabled. When #5214 lands we could make the default babel config shipped with OSS react-native use strict mode modules and facebook could just modify the babel config to disable it if needed. This will allow removing `"strict": false` from https://github.com/facebook/react-native/blob/master/packager/react-packager/.babelrc#L16 Fixes #5316 Closes https://github.com/facebook/react-native/pull/5422 Reviewed By: svcscm Differential Revision: D2846422 Pulled By: davidaurelio fb-gh-sync-id: a3e2f8909aa87dabab2b872c61b887e80220fb56
This commit is contained in:
committed by
facebook-github-bot-4
parent
d806b75544
commit
d33b554f5d
@@ -25,11 +25,11 @@
|
||||
require('regenerator/runtime');
|
||||
|
||||
if (typeof GLOBAL === 'undefined') {
|
||||
GLOBAL = this;
|
||||
global.GLOBAL = this;
|
||||
}
|
||||
|
||||
if (typeof window === 'undefined') {
|
||||
window = GLOBAL;
|
||||
global.window = GLOBAL;
|
||||
}
|
||||
|
||||
function setUpConsole() {
|
||||
@@ -70,6 +70,15 @@ function polyfillGlobal(name, newValue, scope = GLOBAL) {
|
||||
Object.defineProperty(scope, name, {...descriptor, value: newValue});
|
||||
}
|
||||
|
||||
/**
|
||||
* Polyfill a module if it is not already defined in `scope`.
|
||||
*/
|
||||
function polyfillIfNeeded(name, polyfill, scope = GLOBAL, descriptor = {}) {
|
||||
if (scope[name] === undefined) {
|
||||
Object.defineProperty(scope, name, {...descriptor, value: polyfill});
|
||||
}
|
||||
}
|
||||
|
||||
function setUpErrorHandler() {
|
||||
if (global.__fbDisableExceptionsManager) {
|
||||
return;
|
||||
@@ -78,7 +87,7 @@ function setUpErrorHandler() {
|
||||
function handleError(e, isFatal) {
|
||||
try {
|
||||
require('ExceptionsManager').handleException(e, isFatal);
|
||||
} catch(ee) {
|
||||
} catch (ee) {
|
||||
console.log('Failed to print error: ', ee.message);
|
||||
}
|
||||
}
|
||||
@@ -146,7 +155,11 @@ function setUpXHR() {
|
||||
}
|
||||
|
||||
function setUpGeolocation() {
|
||||
GLOBAL.navigator = GLOBAL.navigator || {};
|
||||
polyfillIfNeeded('navigator', {}, GLOBAL, {
|
||||
writable: true,
|
||||
enumerable: true,
|
||||
configurable: true,
|
||||
});
|
||||
polyfillGlobal('geolocation', require('Geolocation'), GLOBAL.navigator);
|
||||
}
|
||||
|
||||
@@ -179,9 +192,9 @@ function setUpProcessEnv() {
|
||||
}
|
||||
|
||||
function setUpNumber() {
|
||||
Number.EPSILON = Number.EPSILON || Math.pow(2, -52);
|
||||
Number.MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || Math.pow(2, 53) - 1;
|
||||
Number.MIN_SAFE_INTEGER = Number.MIN_SAFE_INTEGER || -(Math.pow(2, 53) - 1);
|
||||
polyfillIfNeeded('EPSILON', Math.pow(2, -52), Number);
|
||||
polyfillIfNeeded('MAX_SAFE_INTEGER', Math.pow(2, 53) - 1, Number);
|
||||
polyfillIfNeeded('MIN_SAFE_INTEGER', -(Math.pow(2, 53) - 1), Number);
|
||||
}
|
||||
|
||||
function setUpDevTools() {
|
||||
|
||||
@@ -1,34 +1,30 @@
|
||||
/* eslint global-strict: 0 */
|
||||
(function(GLOBAL) {
|
||||
/**
|
||||
* The document must be shimmed before anything else that might define the
|
||||
* `ExecutionEnvironment` module (which checks for `document.createElement`).
|
||||
*/
|
||||
/* eslint strict: 0 */
|
||||
|
||||
// The browser defines Text and Image globals by default. If you forget to
|
||||
// require them, then the error message is very confusing.
|
||||
function getInvalidGlobalUseError(name) {
|
||||
return new Error(
|
||||
'You are trying to render the global ' + name + ' variable as a ' +
|
||||
'React element. You probably forgot to require ' + name + '.'
|
||||
);
|
||||
}
|
||||
GLOBAL.Text = {
|
||||
get defaultProps() {
|
||||
throw getInvalidGlobalUseError('Text');
|
||||
}
|
||||
};
|
||||
GLOBAL.Image = {
|
||||
get defaultProps() {
|
||||
throw getInvalidGlobalUseError('Image');
|
||||
}
|
||||
};
|
||||
// Force `ExecutionEnvironment.canUseDOM` to be false.
|
||||
if (GLOBAL.document) {
|
||||
GLOBAL.document.createElement = null;
|
||||
}
|
||||
// TODO: Remove document polyfill now that chrome debugging is in a web worker.
|
||||
|
||||
// There is no DOM so MutationObserver doesn't make sense. It is used
|
||||
// as feature detection in Bluebird Promise implementation
|
||||
GLOBAL.MutationObserver = undefined;
|
||||
})(this);
|
||||
// The browser defines Text and Image globals by default. If you forget to
|
||||
// require them, then the error message is very confusing.
|
||||
function getInvalidGlobalUseError(name) {
|
||||
return new Error(
|
||||
'You are trying to render the global ' + name + ' variable as a ' +
|
||||
'React element. You probably forgot to require ' + name + '.'
|
||||
);
|
||||
}
|
||||
global.Text = {
|
||||
get defaultProps() {
|
||||
throw getInvalidGlobalUseError('Text');
|
||||
}
|
||||
};
|
||||
global.Image = {
|
||||
get defaultProps() {
|
||||
throw getInvalidGlobalUseError('Image');
|
||||
}
|
||||
};
|
||||
// Force `ExecutionEnvironment.canUseDOM` to be false.
|
||||
if (global.document) {
|
||||
global.document.createElement = null;
|
||||
}
|
||||
|
||||
// There is no DOM so MutationObserver doesn't make sense. It is used
|
||||
// as feature detection in Bluebird Promise implementation
|
||||
global.MutationObserver = undefined;
|
||||
|
||||
Reference in New Issue
Block a user