mirror of
https://github.com/facebook/react.git
synced 2025-11-01 09:12:30 +00:00
5deb78223a
In #26624, the ability to mark a client reference module as `async` in the React client manifest was removed because it was not utilized by Webpack, neither in `ReactFlightWebpackPlugin` nor in Next.js. However, some bundlers and frameworks are sophisticated enough to properly handle and identify async ESM modules (e.g., client component modules with top-level `await`), most notably Turbopack in Next.js. Therefore, we need to consider the `async` flag in the client manifest when resolving the client reference metadata on the server. The SSR manifest cannot override this flag, meaning that if a module is async, it must remain async in all client environments. x-ref: https://github.com/vercel/next.js/pull/70022
45 lines
1.3 KiB
JavaScript
45 lines
1.3 KiB
JavaScript
/**
|
|
* Copyright (c) Meta Platforms, Inc. and 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 type ImportManifestEntry = {
|
|
id: string,
|
|
// chunks is a double indexed array of chunkId / chunkFilename pairs
|
|
chunks: Array<string>,
|
|
name: string,
|
|
async?: boolean,
|
|
};
|
|
|
|
// This is the parsed shape of the wire format which is why it is
|
|
// condensed to only the essentialy information
|
|
export type ImportMetadata =
|
|
| [
|
|
/* id */ string,
|
|
/* chunks id/filename pairs, double indexed */ Array<string>,
|
|
/* name */ string,
|
|
/* async */ 1,
|
|
]
|
|
| [
|
|
/* id */ string,
|
|
/* chunks id/filename pairs, double indexed */ Array<string>,
|
|
/* name */ string,
|
|
];
|
|
|
|
export const ID = 0;
|
|
export const CHUNKS = 1;
|
|
export const NAME = 2;
|
|
// export const ASYNC = 3;
|
|
|
|
// This logic is correct because currently only include the 4th tuple member
|
|
// when the module is async. If that changes we will need to actually assert
|
|
// the value is true. We don't index into the 4th slot because flow does not
|
|
// like the potential out of bounds access
|
|
export function isAsyncImport(metadata: ImportMetadata): boolean {
|
|
return metadata.length === 4;
|
|
}
|