Let ReactDOM initialize in RSC (#25503)
With the `react-dom/server-rendering-stub` you can import `react-dom` in RSC so that you can call `preload` and `preinit` but if you don't alias it, then requiring it breaks because we React.Component which doesn't exist in the react subset.
Sebastian Markbåge committed
Oct 21, 2022 at 10:41 UTC
79c5829813d07371d0f99a43a47c88e2b444fb1d
5 files changed
+48
-2
packages/react-dom/src/__tests__/ReactDOMInReactServer-test.js
new
+24
@@ -0,0 +1,24 @@
1
+/**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ * @emails react-core
8
+ */
9
+
10
+'use strict';
11
+
12
+describe('ReactDOMInReactServer', () => {
13
+ beforeEach(() => {
14
+ jest.resetModules();
15
+ jest.mock('react', () => require('react/react.shared-subset'));
16
+ });
17
+
18
+ // @gate experimental && !www
19
+ it('can require react-dom', () => {
20
+ // In RSC this will be aliased.
21
+ require('react');
22
+ require('react-dom');
23
+ });
24
+});
packages/react-reconciler/src/ReactFiberClassComponent.new.js
+3
-1
@@ -82,7 +82,9 @@ const fakeInternalInstance = {};
82
83
// React.Component uses a shared frozen object by default.
84
// We'll use it to determine whether we need to initialize legacy refs.
85
-export const emptyRefsObject: $FlowFixMe = new React.Component().refs;
85
+export const emptyRefsObject: $FlowFixMe = React.Component
86
+ ? new React.Component().refs
87
+ : {};
88
89
let didWarnAboutStateAssignmentForComponent;
90
let didWarnAboutUninitializedState;
packages/react-reconciler/src/ReactFiberClassComponent.old.js
+3
-1
@@ -82,7 +82,9 @@ const fakeInternalInstance = {};
82
83
// React.Component uses a shared frozen object by default.
84
// We'll use it to determine whether we need to initialize legacy refs.
85
-export const emptyRefsObject: $FlowFixMe = new React.Component().refs;
85
+export const emptyRefsObject: $FlowFixMe = React.Component
86
+ ? new React.Component().refs
87
+ : {};
88
89
let didWarnAboutStateAssignmentForComponent;
90
let didWarnAboutUninitializedState;
packages/react/react.shared-subset.js
new
+10
@@ -0,0 +1,10 @@
1
+/**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ * @flow
8
+ */
9
+
10
+export * from './src/ReactSharedSubset';
scripts/jest/setupHostConfigs.js
+8
@@ -50,6 +50,14 @@ jest.mock('react', () => {
50
return jest.requireActual(resolvedEntryPoint);
51
});
52
53
+jest.mock('react/react.shared-subset', () => {
54
+ const resolvedEntryPoint = resolveEntryFork(
55
+ require.resolve('react/src/ReactSharedSubset'),
56
+ global.__WWW__
57
+ );
58
+ return jest.requireActual(resolvedEntryPoint);
59
+});
60
+
61
jest.mock('react-reconciler/src/ReactFiberReconciler', () => {
62
return jest.requireActual(
63
__VARIANT__