Skip to content

Commit c0cd1be

Browse files
authored
[Flight] Move bundler configs to use Suspense instead of returning thenable (#18367)
* Move bundler configs to use suspense instead of returning thenable * Fix some Flow types
1 parent 4b7f849 commit c0cd1be

10 files changed

+39
-31
lines changed

packages/react-client/src/ReactFlightClient.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import {REACT_ELEMENT_TYPE} from 'shared/ReactSymbols';
1717
// import {
1818
// resolveModuleReference,
1919
// preloadModule,
20-
// loadModule,
2120
// requireModule,
2221
// } from './ReactFlightClientHostConfig';
2322

packages/react-client/src/forks/ReactFlightClientHostConfig.custom.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
declare var $$$hostConfig: any;
2727

2828
export opaque type ModuleMetaData = mixed; // eslint-disable-line no-undef
29+
export opaque type ModuleReference<T> = mixed; // eslint-disable-line no-undef
30+
export const resolveModuleReference = $$$hostConfig.resolveModuleReference;
2931
export const preloadModule = $$$hostConfig.preloadModule;
3032
export const requireModule = $$$hostConfig.requireModule;
3133

packages/react-flight-dom-relay/src/ReactFlightDOMRelayClientHostConfig.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
export {
1111
resolveModuleReference,
1212
preloadModule,
13-
loadModule,
1413
requireModule,
1514
} from 'ReactFlightDOMRelayClientIntegration';
1615

packages/react-flight-dom-relay/src/__mocks__/ReactFlightDOMRelayClientIntegration.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,6 @@ const ReactFlightDOMRelayClientIntegration = {
1818
return moduleData;
1919
},
2020
preloadModule(moduleReference) {},
21-
loadModule(moduleReference) {
22-
return null;
23-
},
2421
requireModule(moduleReference) {
2522
return getFakeModule();
2623
},

packages/react-flight-dom-webpack/src/ReactFlightClientWebpackBundlerConfig.js

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@
77
* @flow
88
*/
99

10-
export type ModuleMetaData = {
10+
export opaque type ModuleMetaData = {
1111
id: string,
1212
chunks: Array<string>,
1313
name: string,
1414
};
1515

1616
// eslint-disable-next-line no-unused-vars
17-
export type ModuleReference<T> = ModuleMetaData;
17+
export opaque type ModuleReference<T> = ModuleMetaData;
1818

1919
export function resolveModuleReference<T>(
2020
moduleData: ModuleMetaData,
@@ -23,40 +23,45 @@ export function resolveModuleReference<T>(
2323
}
2424

2525
type Thenable = {
26-
then(resolve: () => mixed, reject: (mixed) => mixed): mixed,
26+
then(resolve: (any) => mixed, reject?: (Error) => mixed): Thenable,
2727
...
2828
};
2929

3030
// The chunk cache contains all the chunks we've preloaded so far.
3131
// If they're still pending they're a thenable. This map also exists
3232
// in Webpack but unfortunately it's not exposed so we have to
3333
// replicate it in user space. null means that it has already loaded.
34-
const chunkCache: Map<string, null | Thenable> = new Map();
34+
const chunkCache: Map<string, null | Thenable | Error> = new Map();
3535

3636
// Returning null means that all dependencies are fulfilled and we
3737
// can synchronously require the module now. A thenable is returned
3838
// that when resolved, means we can try again.
3939
export function preloadModule<T>(moduleData: ModuleReference<T>): void {
40-
loadModule(moduleData);
41-
}
42-
43-
export function loadModule<T>(moduleData: ModuleReference<T>): null | Thenable {
4440
let chunks = moduleData.chunks;
45-
let anyRemainingThenable = null;
4641
for (let i = 0; i < chunks.length; i++) {
4742
let chunkId = chunks[i];
4843
let entry = chunkCache.get(chunkId);
4944
if (entry === undefined) {
50-
anyRemainingThenable = __webpack_chunk_load__(chunkId);
51-
chunkCache.set(chunkId, anyRemainingThenable);
52-
anyRemainingThenable.then(chunkCache.set.bind(chunkCache, chunkId, null));
53-
} else if (entry !== null) {
54-
anyRemainingThenable = entry;
45+
let thenable = __webpack_chunk_load__(chunkId);
46+
let resolve = chunkCache.set.bind(chunkCache, chunkId, null);
47+
let reject = chunkCache.set.bind(chunkCache, chunkId);
48+
thenable.then(resolve, reject);
49+
chunkCache.set(chunkId, thenable);
5550
}
5651
}
57-
return anyRemainingThenable;
5852
}
5953

6054
export function requireModule<T>(moduleData: ModuleReference<T>): T {
55+
let chunks = moduleData.chunks;
56+
for (let i = 0; i < chunks.length; i++) {
57+
let chunkId = chunks[i];
58+
let entry = chunkCache.get(chunkId);
59+
if (entry !== null) {
60+
// We assume that preloadModule has been called before.
61+
// So we don't expect to see entry being undefined here, that's an error.
62+
// Let's throw either an error or the Promise.
63+
throw entry;
64+
}
65+
}
6166
return __webpack_require__(moduleData.id)[moduleData.name];
6267
}

packages/react-flight-dom-webpack/src/ReactFlightServerWebpackBundlerConfig.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export type ModuleReference = string;
1818
export type ModuleMetaData = {
1919
id: string,
2020
chunks: Array<string>,
21+
name: string,
2122
};
2223

2324
export function resolveModuleMetaData(

packages/react-noop-renderer/src/ReactNoopFlightClient.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,15 @@ const {
2727
close,
2828
} = ReactFlightClient({
2929
supportsBinaryStreams: false,
30+
resolveModuleReference(name: string) {
31+
return name;
32+
},
33+
preloadModule(name: string) {},
34+
requireModule(name: string) {
35+
return function FakeModule() {
36+
return name;
37+
};
38+
},
3039
});
3140

3241
function read<T>(source: Source): ReactModelRoot<T> {

packages/react-server/src/ReactFlightServerBundlerConfigCustom.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,5 @@ declare var $$$hostConfig: any;
1111

1212
export opaque type BundlerConfig = mixed; // eslint-disable-line no-undef
1313
export opaque type ModuleReference = mixed; // eslint-disable-line no-undef
14-
export opaque type ModuleMetaData = mixed; // eslint-disable-line no-undef
14+
export opaque type ModuleMetaData: any = mixed; // eslint-disable-line no-undef
1515
export const resolveModuleMetaData = $$$hostConfig.resolveModuleMetaData;

scripts/flow/environment.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,5 +67,9 @@ declare module 'EventListener' {
6767
};
6868
}
6969

70-
declare function __webpack_chunk_load__(id: string): {then(() => mixed): mixed};
70+
type Thenable = {
71+
then(resolve: (mixed) => mixed, reject?: (Error) => mixed): Thenable,
72+
};
73+
74+
declare function __webpack_chunk_load__(id: string): Thenable;
7175
declare function __webpack_require__(id: string): {default: any};

scripts/flow/react-relay-hooks.js

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,6 @@ type JSONValue =
1515
| {[key: string]: JSONValue}
1616
| Array<JSONValue>;
1717

18-
type Thenable = {
19-
then(resolve: () => mixed, reject: (error: Error) => mixed): mixed,
20-
...
21-
};
22-
2318
declare module 'ReactFlightDOMRelayServerIntegration' {
2419
declare export opaque type Destination;
2520
declare export function emitModel(
@@ -43,17 +38,14 @@ declare module 'ReactFlightDOMRelayServerIntegration' {
4338
}
4439

4540
declare module 'ReactFlightDOMRelayClientIntegration' {
46-
declare export opaque type ModuleReference;
41+
declare export opaque type ModuleReference<T>;
4742
declare export opaque type ModuleMetaData;
4843
declare export function resolveModuleReference<T>(
4944
moduleData: ModuleMetaData,
5045
): ModuleReference<T>;
5146
declare export function preloadModule<T>(
5247
moduleReference: ModuleReference<T>,
5348
): void;
54-
declare export function loadModule<T>(
55-
moduleReference: ModuleReference<T>,
56-
): null | Thenable;
5749
declare export function requireModule<T>(
5850
moduleReference: ModuleReference<T>,
5951
): T;

0 commit comments

Comments
 (0)