Add explicit invariant when ReactDOM is loaded w/o React (#10449)
Brandon Dail committed
Aug 13, 2017 at 13:16 UTC
5ff5700625e8a1b340a0d01ff9c88afb07e00bf6
5 files changed
+77
-46
scripts/rollup/results.json
+46
-46
@@ -1,8 +1,8 @@
1
{
2
"bundleSizes": {
3
"react.development.js (UMD_DEV)": {
4
- "size": 65905,
5
- "gzip": 16729
4
+ "size": 65990,
5
+ "gzip": 16792
6
},
7
"react.production.min.js (UMD_PROD)": {
8
"size": 6359,
@@ -25,40 +25,40 @@
25
"gzip": 6703
26
},
27
"react-dom.development.js (UMD_DEV)": {
28
- "size": 635283,
29
- "gzip": 144613
28
+ "size": 635358,
29
+ "gzip": 144868
30
},
31
"react-dom.production.min.js (UMD_PROD)": {
32
- "size": 108379,
33
- "gzip": 33966
32
+ "size": 108806,
33
+ "gzip": 34152
34
},
35
"react-dom.development.js (NODE_DEV)": {
36
- "size": 594095,
37
- "gzip": 135122
36
+ "size": 594767,
37
+ "gzip": 135242
38
},
39
"react-dom.production.min.js (NODE_PROD)": {
40
- "size": 112397,
41
- "gzip": 35476
40
+ "size": 112503,
41
+ "gzip": 35538
42
},
43
"ReactDOMFiber-dev.js (FB_DEV)": {
44
- "size": 590915,
45
- "gzip": 134583
44
+ "size": 591587,
45
+ "gzip": 134688
46
},
47
"ReactDOMFiber-prod.js (FB_PROD)": {
48
- "size": 424931,
49
- "gzip": 95294
48
+ "size": 425507,
49
+ "gzip": 95372
50
},
51
"react-dom-test-utils.development.js (NODE_DEV)": {
52
- "size": 53359,
53
- "gzip": 13402
52
+ "size": 53332,
53
+ "gzip": 13396
54
},
55
"ReactTestUtils-dev.js (FB_DEV)": {
56
- "size": 53151,
57
- "gzip": 13364
56
+ "size": 53124,
57
+ "gzip": 13357
58
},
59
"react-dom-unstable-native-dependencies.development.js (UMD_DEV)": {
60
- "size": 88196,
61
- "gzip": 22328
60
+ "size": 88285,
61
+ "gzip": 22345
62
},
63
"react-dom-unstable-native-dependencies.production.min.js (UMD_PROD)": {
64
"size": 15149,
@@ -81,84 +81,84 @@
81
"gzip": 15736
82
},
83
"react-dom-server.browser.development.js (UMD_DEV)": {
84
- "size": 124076,
85
- "gzip": 31288
84
+ "size": 123203,
85
+ "gzip": 31145
86
},
87
"react-dom-server.browser.production.min.js (UMD_PROD)": {
88
"size": 19874,
89
"gzip": 7592
90
},
91
"react-dom-server.browser.development.js (NODE_DEV)": {
92
- "size": 92358,
93
- "gzip": 23695
92
+ "size": 92379,
93
+ "gzip": 23736
94
},
95
"react-dom-server.browser.production.min.js (NODE_PROD)": {
96
"size": 18930,
97
"gzip": 7264
98
},
99
"ReactDOMServer-dev.js (FB_DEV)": {
100
- "size": 91551,
101
- "gzip": 23617
100
+ "size": 91572,
101
+ "gzip": 23660
102
},
103
"ReactDOMServer-prod.js (FB_PROD)": {
104
"size": 49652,
105
"gzip": 13866
106
},
107
"react-dom-server.node.development.js (NODE_DEV)": {
108
- "size": 95135,
109
- "gzip": 24258
108
+ "size": 95156,
109
+ "gzip": 24301
110
},
111
"react-dom-server.node.production.min.js (NODE_PROD)": {
112
"size": 19986,
113
"gzip": 7613
114
},
115
"react-art.development.js (UMD_DEV)": {
116
- "size": 307891,
117
- "gzip": 66652
116
+ "size": 373742,
117
+ "gzip": 82778
118
},
119
"react-art.production.min.js (UMD_PROD)": {
120
- "size": 47498,
121
- "gzip": 14839
120
+ "size": 83498,
121
+ "gzip": 25838
122
},
123
"react-art.development.js (NODE_DEV)": {
124
- "size": 295222,
125
- "gzip": 62807
124
+ "size": 295131,
125
+ "gzip": 62776
126
},
127
"react-art.production.min.js (NODE_PROD)": {
128
"size": 52520,
129
"gzip": 16419
130
},
131
"ReactARTFiber-dev.js (FB_DEV)": {
132
- "size": 294163,
133
- "gzip": 62866
132
+ "size": 294072,
133
+ "gzip": 62835
134
},
135
"ReactARTFiber-prod.js (FB_PROD)": {
136
"size": 220269,
137
"gzip": 45845
138
},
139
"ReactNativeStack-dev.js (RN_DEV)": {
140
- "size": 201067,
141
- "gzip": 37391
140
+ "size": 201077,
141
+ "gzip": 37401
142
},
143
"ReactNativeStack-prod.js (RN_PROD)": {
144
"size": 136715,
145
"gzip": 26222
146
},
147
"ReactNativeFiber-dev.js (RN_DEV)": {
148
- "size": 305992,
149
- "gzip": 52996
148
+ "size": 306002,
149
+ "gzip": 52993
150
},
151
"ReactNativeFiber-prod.js (RN_PROD)": {
152
"size": 221418,
153
"gzip": 38321
154
},
155
"react-test-renderer.development.js (NODE_DEV)": {
156
- "size": 299690,
157
- "gzip": 63255
156
+ "size": 299567,
157
+ "gzip": 63217
158
},
159
"ReactTestRendererFiber-dev.js (FB_DEV)": {
160
- "size": 298616,
161
- "gzip": 63330
160
+ "size": 298493,
161
+ "gzip": 63294
162
},
163
"react-test-renderer-shallow.development.js (NODE_DEV)": {
164
"size": 9556,
@@ -169,8 +169,8 @@
169
"gzip": 2338
170
},
171
"react-noop-renderer.development.js (NODE_DEV)": {
172
- "size": 286933,
173
- "gzip": 60117
172
+ "size": 286842,
173
+ "gzip": 60085
174
},
175
"react-dom-server.development.js (UMD_DEV)": {
176
"size": 120897,
src/renderers/dom/ReactDOMStackEntry.js
+1
@@ -13,6 +13,7 @@
13
14
'use strict';
15
16
+require('checkReact');
17
var ReactDOMComponentTree = require('ReactDOMComponentTree');
18
var ReactGenericBatching = require('ReactGenericBatching');
19
var ReactMount = require('ReactMount');
src/renderers/dom/fiber/ReactDOMFiberEntry.js
+1
@@ -15,6 +15,7 @@
15
import type {Fiber} from 'ReactFiber';
16
import type {ReactNodeList} from 'ReactTypes';
17
18
+require('checkReact');
19
var ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');
20
var ReactBrowserEventEmitter = require('ReactBrowserEventEmitter');
21
var ReactControlledComponent = require('ReactControlledComponent');
src/renderers/dom/fiber/__tests__/ReactDOMFiber-test.js
+9
@@ -1136,4 +1136,13 @@ describe('disableNewFiberFeatures', () => {
1136
ReactDOM.render(<Mocked />, container);
1137
expect(container.textContent).toEqual('');
1138
});
1139
+
1140
+ it('throws if the React package cannot be loaded', () => {
1141
+ jest.resetModules();
1142
+ jest.mock('react', () => undefined);
1143
+ expect(() => require('react-dom')).toThrow(
1144
+ 'ReactDOM was loaded before React.',
1145
+ );
1146
+ jest.resetModules();
1147
+ });
1148
});
src/renderers/dom/shared/checkReact.js
new
+20
@@ -0,0 +1,20 @@
1
+/**
2
+ * Copyright 2013-present, Facebook, Inc.
3
+ * All rights reserved.
4
+ *
5
+ * This source code is licensed under the BSD-style license found in the
6
+ * LICENSE file in the root directory of this source tree. An additional grant
7
+ * of patent rights can be found in the PATENTS file in the same directory.
8
+ *
9
+ * @providesModule checkReact
10
+ * @flow
11
+ */
12
+
13
+var React = require('react');
14
+var invariant = require('fbjs/lib/invariant');
15
+
16
+invariant(
17
+ React,
18
+ 'ReactDOM was loaded before React. Make sure you load ' +
19
+ 'the React package before loading ReactDOM.',
20
+);