Skip to content

Commit

Permalink
Add flight specific entry point for react package (facebook#20304)
Browse files Browse the repository at this point in the history
This configures the Flight fixture to use the "react-server" environment.

This allows the package.json exports field to specify a different resolution
in this environment.

I use this in the "react" package to resolve to a new bundle that excludes
the Hooks that aren't relevant in this environment like useState and useEffect.

This allows us to error early if these names are imported. If we actually
published ESM, it would we a static error. Now it's a runtime error.

You can test this by importing useState in Container.js which is used
by the client and server.
  • Loading branch information
sebmarkbage authored and koto committed Jun 15, 2021
1 parent 76a61b3 commit 665fe3c
Show file tree
Hide file tree
Showing 7 changed files with 84 additions and 4 deletions.
2 changes: 1 addition & 1 deletion fixtures/flight/package.json
Expand Up @@ -67,7 +67,7 @@
"prebuild": "cp -r ../../build/node_modules/* ./node_modules/",
"start": "concurrently \"npm run start:server\" \"npm run start:client\"",
"start:client": "node scripts/start.js",
"start:server": "NODE_ENV=development node --experimental-loader ./loader/index.js server",
"start:server": "NODE_ENV=development node --experimental-loader ./loader/index.js --conditions=react-server server",
"start:prod": "node scripts/build.js && NODE_ENV=production node server",
"build": "node scripts/build.js",
"test": "node scripts/test.js --env=jsdom"
Expand Down
7 changes: 7 additions & 0 deletions packages/react/npm/unstable-index.server.js
@@ -0,0 +1,7 @@
'use strict';

if (process.env.NODE_ENV === 'production') {
module.exports = require('./cjs/react-unstable-index.server.production.min.js');
} else {
module.exports = require('./cjs/react-unstable-index.server.development.js');
}
15 changes: 15 additions & 0 deletions packages/react/package.json
Expand Up @@ -17,9 +17,24 @@
"umd/",
"jsx-runtime.js",
"jsx-dev-runtime.js",
"unstable-index.server.js",
"unstable-cache.js"
],
"main": "index.js",
"exports": {
".": {
"react-server": "./unstable-index.server.js",
"default": "./index.js"
},
"./index": {
"react-server": "./unstable-index.server.js",
"default": "./index.js"
},
"./build-info.json": "./build-info.json",
"./jsx-runtime": "./jsx-runtime.js",
"./jsx-dev-runtime": "./jsx-dev-runtime.js",
"./": "./"
},
"repository": {
"type": "git",
"url": "https://github.com/facebook/react.git",
Expand Down
37 changes: 37 additions & 0 deletions packages/react/unstable-index.server.experimental.js
@@ -0,0 +1,37 @@
/**
* 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 {
Children,
createRef,
forwardRef,
lazy,
memo,
useCallback,
useContext,
useDebugValue,
useMemo,
useMutableSource as unstable_useMutableSource,
createMutableSource as unstable_createMutableSource,
Fragment,
Profiler,
StrictMode,
Suspense,
createElement,
cloneElement,
isValidElement,
version,
__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,
// exposeConcurrentModeAPIs
useDeferredValue as unstable_useDeferredValue,
SuspenseList as unstable_SuspenseList,
unstable_useOpaqueIdentifier,
// enableDebugTracing
unstable_DebugTracingMode,
} from './src/React';
12 changes: 12 additions & 0 deletions packages/react/unstable-index.server.js
@@ -0,0 +1,12 @@
/**
* 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
*/

throw new Error(
'This entry point is not yet supported outside of experimental channels',
);
9 changes: 9 additions & 0 deletions scripts/rollup/bundles.js
Expand Up @@ -90,6 +90,15 @@ const bundles = [
externals: [],
},

/******* Isomorphic Server Only *******/
{
bundleTypes: [NODE_DEV, NODE_PROD],
moduleType: ISOMORPHIC,
entry: 'react/unstable-index.server',
global: 'React',
externals: [],
},

/******* React JSX Runtime *******/
{
bundleTypes: [
Expand Down
6 changes: 3 additions & 3 deletions scripts/rollup/forks.js
Expand Up @@ -43,7 +43,7 @@ const forks = Object.freeze({
// happens. Other bundles just require('object-assign') anyway.
return null;
}
if (entry === 'react') {
if (entry === 'react' || entry === 'react/unstable-index.server') {
// Use the forked version that uses ES modules instead of CommonJS.
return 'shared/forks/object-assign.inline-umd.js';
}
Expand All @@ -64,8 +64,8 @@ const forks = Object.freeze({
// Without this fork, importing `shared/ReactSharedInternals` inside
// the `react` package itself would not work due to a cyclical dependency.
'shared/ReactSharedInternals': (bundleType, entry, dependencies) => {
if (entry === 'react') {
return 'react/src/ReactSharedInternals';
if (entry === 'react' || entry === 'react/unstable-index.server') {
return 'react/src/ReactSharedInternals.js';
}
if (!entry.startsWith('react/') && dependencies.indexOf('react') === -1) {
// React internals are unavailable if we can't reference the package.
Expand Down

0 comments on commit 665fe3c

Please sign in to comment.