mirror of
https://github.com/facebook/react.git
synced 2025-11-01 09:12:30 +00:00
97c90ed883
Stacked on #28771 ReactDOMCurrentDispatcher has longer property names for various methods. These methods are only ever called internally and don't need to be represented with as many characters. This change shortens the names and aligns them with the hint codes we use in Flight. This alignment is passive since not all dispatcher methods will exist as flight instructions but where they can line up it seems reasonable to make them do so
136 lines
3.9 KiB
JavaScript
136 lines
3.9 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
|
|
*/
|
|
|
|
// This client file is in the shared folder because it applies to both SSR and browser contexts.
|
|
// It is the configuration of the FlightClient behavior which can run in either environment.
|
|
|
|
import type {HintCode, HintModel} from '../server/ReactFlightServerConfigDOM';
|
|
|
|
import ReactDOMSharedInternals from 'shared/ReactDOMSharedInternals';
|
|
|
|
import {getCrossOriginString} from './crossOriginStrings';
|
|
|
|
export function dispatchHint<Code: HintCode>(
|
|
code: Code,
|
|
model: HintModel<Code>,
|
|
): void {
|
|
const dispatcher = ReactDOMSharedInternals.d; /* ReactDOMCurrentDispatcher */
|
|
switch (code) {
|
|
case 'D': {
|
|
const refined = refineModel(code, model);
|
|
const href = refined;
|
|
dispatcher.D(/* prefetchDNS */ href);
|
|
return;
|
|
}
|
|
case 'C': {
|
|
const refined = refineModel(code, model);
|
|
if (typeof refined === 'string') {
|
|
const href = refined;
|
|
dispatcher.C(/* preconnect */ href);
|
|
} else {
|
|
const href = refined[0];
|
|
const crossOrigin = refined[1];
|
|
dispatcher.C(/* preconnect */ href, crossOrigin);
|
|
}
|
|
return;
|
|
}
|
|
case 'L': {
|
|
const refined = refineModel(code, model);
|
|
const href = refined[0];
|
|
const as = refined[1];
|
|
if (refined.length === 3) {
|
|
const options = refined[2];
|
|
dispatcher.L(/* preload */ href, as, options);
|
|
} else {
|
|
dispatcher.L(/* preload */ href, as);
|
|
}
|
|
return;
|
|
}
|
|
case 'm': {
|
|
const refined = refineModel(code, model);
|
|
if (typeof refined === 'string') {
|
|
const href = refined;
|
|
dispatcher.m(/* preloadModule */ href);
|
|
} else {
|
|
const href = refined[0];
|
|
const options = refined[1];
|
|
dispatcher.m(/* preloadModule */ href, options);
|
|
}
|
|
return;
|
|
}
|
|
case 'X': {
|
|
const refined = refineModel(code, model);
|
|
if (typeof refined === 'string') {
|
|
const href = refined;
|
|
dispatcher.X(/* preinitScript */ href);
|
|
} else {
|
|
const href = refined[0];
|
|
const options = refined[1];
|
|
dispatcher.X(/* preinitScript */ href, options);
|
|
}
|
|
return;
|
|
}
|
|
case 'S': {
|
|
const refined = refineModel(code, model);
|
|
if (typeof refined === 'string') {
|
|
const href = refined;
|
|
dispatcher.S(/* preinitStyle */ href);
|
|
} else {
|
|
const href = refined[0];
|
|
const precedence = refined[1] === 0 ? undefined : refined[1];
|
|
const options = refined.length === 3 ? refined[2] : undefined;
|
|
dispatcher.S(/* preinitStyle */ href, precedence, options);
|
|
}
|
|
return;
|
|
}
|
|
case 'M': {
|
|
const refined = refineModel(code, model);
|
|
if (typeof refined === 'string') {
|
|
const href = refined;
|
|
dispatcher.M(/* preinitModuleScript */ href);
|
|
} else {
|
|
const href = refined[0];
|
|
const options = refined[1];
|
|
dispatcher.M(/* preinitModuleScript */ href, options);
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Flow is having trouble refining the HintModels so we help it a bit.
|
|
// This should be compiled out in the production build.
|
|
function refineModel<T>(code: T, model: HintModel<any>): HintModel<T> {
|
|
return model;
|
|
}
|
|
|
|
export function preinitModuleForSSR(
|
|
href: string,
|
|
nonce: ?string,
|
|
crossOrigin: ?string,
|
|
) {
|
|
ReactDOMSharedInternals.d /* ReactDOMCurrentDispatcher */
|
|
.M(/* preinitModuleScript */ href, {
|
|
crossOrigin: getCrossOriginString(crossOrigin),
|
|
nonce,
|
|
});
|
|
}
|
|
|
|
export function preinitScriptForSSR(
|
|
href: string,
|
|
nonce: ?string,
|
|
crossOrigin: ?string,
|
|
) {
|
|
ReactDOMSharedInternals.d /* ReactDOMCurrentDispatcher */
|
|
.X(/* preinitScript */ href, {
|
|
crossOrigin: getCrossOriginString(crossOrigin),
|
|
nonce,
|
|
});
|
|
}
|