Skip to content
10 changes: 9 additions & 1 deletion packages/react-dom-bindings/src/server/ReactDOMFloatServer.js
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ type BaseResource = {
flushed: boolean,
};

export type LinkTagResource = PreloadResource | StyleResource | LinkResource;
export type Resource = PreloadResource | StyleResource | ScriptResource;
export type HeadResource =
| TitleResource
Expand All @@ -128,6 +129,8 @@ export type Resources = {
preconnects: Set<LinkResource>,
fontPreloads: Set<PreloadResource>,
// usedImagePreloads: Set<PreloadResource>,
firstPrecedence: string,
firstPrecedenceFlushed: boolean,
precedences: Map<string, Set<StyleResource>>,
usedStylePreloads: Set<PreloadResource>,
scripts: Set<ScriptResource>,
Expand Down Expand Up @@ -160,6 +163,8 @@ export function createResources(): Resources {
preconnects: new Set(),
fontPreloads: new Set(),
// usedImagePreloads: new Set(),
firstPrecedence: '',
firstPrecedenceFlushed: false,
precedences: new Map(),
usedStylePreloads: new Set(),
scripts: new Set(),
Expand Down Expand Up @@ -484,14 +489,17 @@ function createStyleResource(
);
}
}
const {stylesMap, preloadsMap, precedences} = resources;
const {stylesMap, preloadsMap, precedences, firstPrecedence} = resources;

// If this is the first time we've seen this precedence we encode it's position in our set even though
// we don't add the resource to this set yet
let precedenceSet = precedences.get(precedence);
if (!precedenceSet) {
precedenceSet = new Set();
precedences.set(precedence, precedenceSet);
if (!firstPrecedence) {
resources.firstPrecedence = precedence;
}
}

let hint = preloadsMap.get(href);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,12 @@
import {
clientRenderBoundary,
completeBoundaryWithStyles,
completeContainerWithStyles,
completeBoundary,
completeContainer,
completeSegment,
} from './fizz-instruction-set/ReactDOMFizzInstructionSetExternalRuntime';

if (!window.$RC) {
// TODO: Eventually remove, we currently need to set these globals for
// compatibility with ReactDOMFizzInstructionSet
window.$RC = completeBoundary;
window.$RM = new Map();
}

if (document.readyState === 'loading') {
if (document.body != null) {
installFizzInstrObserver(document.body);
Expand Down Expand Up @@ -74,34 +69,47 @@ function installFizzInstrObserver(target /*: Node */) {
}

function handleNode(node_ /*: Node */) {
// $FlowFixMe[incompatible-cast]
if (node_.nodeType !== 1 || !(node_ /*: HTMLElement*/).dataset) {
if (
node_.nodeType !== 1 ||
// $FlowFixMe[incompatible-cast]
!(node_ /*: HTMLElement*/).dataset
) {
return;
}
// $FlowFixMe[incompatible-cast]
const node = (node_ /*: HTMLElement*/);
const dataset = node.dataset;
if (dataset['rxi'] != null) {
clientRenderBoundary(
dataset['bid'],

if (dataset['ix'] != null) {
node.remove();
return clientRenderBoundary(
dataset['ix'],
dataset['dgst'],
dataset['msg'],
dataset['stck'],
);
} else if (dataset['is'] != null) {
node.remove();
return completeSegment(dataset['is'], dataset['p']);
} else if (dataset['ir'] != null) {
node.remove();
} else if (dataset['rri'] != null) {
// Convert styles here, since its type is Array<Array<string>>
completeBoundaryWithStyles(
dataset['bid'],
dataset['sid'],
JSON.parse(dataset['sty']),
return completeBoundaryWithStyles(
dataset['ir'],
dataset['s'],
JSON.parse(dataset['r']),
);
} else if (dataset['ib'] != null) {
node.remove();
} else if (dataset['rci'] != null) {
completeBoundary(dataset['bid'], dataset['sid']);
return completeBoundary(dataset['ib'], dataset['s']);
} else if (dataset['ik'] != null) {
node.remove();
} else if (dataset['rsi'] != null) {
completeSegment(dataset['sid'], dataset['pid']);
return completeContainerWithStyles(
dataset['ik'],
dataset['s'],
JSON.parse(dataset['r']),
);
} else if (dataset['ic'] != null) {
node.remove();
return completeContainer(dataset['ic'], dataset['s']);
}
}
Loading