@samitouri / QOS-React-2 / commits / 79c5829813

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__