-
Notifications
You must be signed in to change notification settings - Fork 46.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Server render fork for react-dom (#25436)
Publish an aliasable entry for `react-dom` top level package exports for use in server environments. This is a stub containing only the exports that we expect to retain in the top level once 19 is released
- Loading branch information
Showing
10 changed files
with
169 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
'use strict'; | ||
|
||
if (process.env.NODE_ENV === 'production') { | ||
module.exports = require('./cjs/react-dom-server-rendering-stub.production.min.js'); | ||
} else { | ||
module.exports = require('./cjs/react-dom-server-rendering-stub.development.js'); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
/** | ||
* 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 | ||
*/ | ||
|
||
// Export all exports so that they're available in tests. | ||
// We can't use export * from in Flow for some reason. | ||
|
||
import ReactVersion from 'shared/ReactVersion'; | ||
export {ReactVersion as version}; | ||
|
||
export {default as __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED} from './src/ReactDOMSharedInternals'; | ||
|
||
export { | ||
createPortal, | ||
flushSync, | ||
} from './src/server/ReactDOMServerRenderingStub'; | ||
export {preinit, preload} from 'react-dom-bindings/src/shared/ReactDOMFloat'; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
/** | ||
* 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 | ||
*/ | ||
|
||
// Export all exports so that they're available in tests. | ||
// We can't use export * from in Flow for some reason. | ||
|
||
import ReactVersion from 'shared/ReactVersion'; | ||
export {ReactVersion as version}; | ||
|
||
export {default as __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED} from './src/ReactDOMSharedInternals'; | ||
|
||
export { | ||
createPortal, | ||
flushSync, | ||
} from './src/server/ReactDOMServerRenderingStub'; |
74 changes: 74 additions & 0 deletions
74
packages/react-dom/src/__tests__/react-dom-server-rendering-stub-test.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
/** | ||
* 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. | ||
* | ||
* @emails react-core | ||
*/ | ||
|
||
'use strict'; | ||
|
||
let React; | ||
let ReactDOM; | ||
let ReactDOMFizzServer; | ||
|
||
describe('react-dom-server-rendering-stub', () => { | ||
beforeEach(() => { | ||
jest.mock('react-dom', () => require('react-dom/server-rendering-stub')); | ||
|
||
React = require('react'); | ||
ReactDOM = require('react-dom'); | ||
ReactDOMFizzServer = require('react-dom/server'); | ||
}); | ||
|
||
it('exports a version', () => { | ||
expect(ReactDOM.version).toBeTruthy(); | ||
}); | ||
|
||
it('exports that are expected to be client only in the future are not exported', () => { | ||
expect(ReactDOM.createRoot).toBe(undefined); | ||
expect(ReactDOM.hydrateRoot).toBe(undefined); | ||
expect(ReactDOM.findDOMNode).toBe(undefined); | ||
expect(ReactDOM.hydrate).toBe(undefined); | ||
expect(ReactDOM.render).toBe(undefined); | ||
expect(ReactDOM.unmountComponentAtNode).toBe(undefined); | ||
expect(ReactDOM.unstable_batchedUpdates).toBe(undefined); | ||
expect(ReactDOM.unstable_createEventHandle).toBe(undefined); | ||
expect(ReactDOM.unstable_flushControlled).toBe(undefined); | ||
expect(ReactDOM.unstable_isNewReconciler).toBe(undefined); | ||
expect(ReactDOM.unstable_renderSubtreeIntoContainer).toBe(undefined); | ||
expect(ReactDOM.unstable_runWithPriority).toBe(undefined); | ||
}); | ||
|
||
// @gate enableFloat | ||
it('provides preload and preinit exports', async () => { | ||
function App() { | ||
ReactDOM.preload('foo', {as: 'style'}); | ||
ReactDOM.preinit('bar', {as: 'style'}); | ||
return <div>foo</div>; | ||
} | ||
const html = ReactDOMFizzServer.renderToString(<App />); | ||
expect(html).toEqual( | ||
'<link href="foo" rel="preload" as="style"/><link rel="stylesheet" href="bar" data-rprec="default"/><div>foo</div>', | ||
); | ||
}); | ||
|
||
it('provides a stub for createPortal', async () => { | ||
expect(() => { | ||
ReactDOM.createPortal(); | ||
}).toThrow( | ||
'createPortal was called on the server. Portals are not currently supported on the server. Update your program to conditionally call createPortal on the client only.', | ||
); | ||
}); | ||
|
||
it('provides a stub for flushSync', async () => { | ||
let x = false; | ||
expect(() => { | ||
ReactDOM.flushSync(() => (x = true)); | ||
}).toThrow( | ||
'flushSync was called on the server. This is likely caused by a function being called during render or in module scope that was intended to be called from an effect or event handler. Update your to not call flushSync no the server.', | ||
); | ||
expect(x).toBe(false); | ||
}); | ||
}); |
25 changes: 25 additions & 0 deletions
25
packages/react-dom/src/server/ReactDOMServerRenderingStub.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
/** | ||
* 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 | ||
*/ | ||
|
||
export function createPortal() { | ||
throw new Error( | ||
'createPortal was called on the server. Portals are not currently' + | ||
' supported on the server. Update your program to conditionally call' + | ||
' createPortal on the client only.', | ||
); | ||
} | ||
|
||
export function flushSync() { | ||
throw new Error( | ||
'flushSync was called on the server. This is likely caused by a' + | ||
' function being called during render or in module scope that was' + | ||
' intended to be called from an effect or event handler. Update your' + | ||
' to not call flushSync no the server.', | ||
); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters