Skip to content

Commit f739642

Browse files
authored
[Fizz] Always load the external runtime if one is provided (facebook#33091)
Because we now decided whether to outline in the flushing phase, when we're writing the preamble we don't yet know if we will make that decision so we don't know if it's safe to omit the external runtime. However, if you are providing an external runtime it's probably a pretty safe bet you're streaming something dynamically that's likely to need it so we can always include it. The main thing is that this makes it hard to test it because it affects our tests in ways it wouldn't otherwise so we have to add a bunch of conditions.
1 parent 0ed6ceb commit f739642

File tree

5 files changed

+26
-24
lines changed

5 files changed

+26
-24
lines changed

packages/react-dom-bindings/src/server/ReactFizzConfigDOM.js

+1-6
Original file line numberDiff line numberDiff line change
@@ -5089,15 +5089,10 @@ export function writePreambleStart(
50895089
destination: Destination,
50905090
resumableState: ResumableState,
50915091
renderState: RenderState,
5092-
willFlushAllSegments: boolean,
50935092
skipExpect?: boolean, // Used as an override by ReactFizzConfigMarkup
50945093
): void {
50955094
// This function must be called exactly once on every request
5096-
if (
5097-
enableFizzExternalRuntime &&
5098-
!willFlushAllSegments &&
5099-
renderState.externalRuntimeScript
5100-
) {
5095+
if (enableFizzExternalRuntime && renderState.externalRuntimeScript) {
51015096
// If the root segment is incomplete due to suspended tasks
51025097
// (e.g. willFlushAllSegments = false) and we are using data
51035098
// streaming format, ensure the external runtime is sent.

packages/react-dom/src/__tests__/ReactDOMFizzServer-test.js

+21-8
Original file line numberDiff line numberDiff line change
@@ -3587,6 +3587,9 @@ describe('ReactDOMFizzServer', () => {
35873587
'<script type="importmap">' +
35883588
JSON.stringify(importMap) +
35893589
'</script><script async="" src="foo"></script>' +
3590+
(gate(flags => flags.shouldUseFizzExternalRuntime)
3591+
? '<script src="react-dom-bindings/src/server/ReactDOMServerExternalRuntime.js" async=""></script>'
3592+
: '') +
35903593
'<link rel="expect" href="#«R»" blocking="render">',
35913594
);
35923595
});
@@ -4501,7 +4504,8 @@ describe('ReactDOMFizzServer', () => {
45014504
expect(document.getElementsByTagName('script').length).toEqual(1);
45024505
});
45034506

4504-
it('does not send the external runtime for static pages', async () => {
4507+
// @gate shouldUseFizzExternalRuntime
4508+
it('does (unfortunately) send the external runtime for static pages', async () => {
45054509
await act(() => {
45064510
const {pipe} = renderToPipeableStream(
45074511
<html>
@@ -4515,11 +4519,11 @@ describe('ReactDOMFizzServer', () => {
45154519
});
45164520

45174521
// no scripts should be sent
4518-
expect(document.getElementsByTagName('script').length).toEqual(0);
4522+
expect(document.getElementsByTagName('script').length).toEqual(1);
45194523

45204524
// the html should be as-is
45214525
expect(document.documentElement.innerHTML).toEqual(
4522-
'<head><link rel="expect" href="#«R»" blocking="render"></head><body><p>hello world!</p><template id="«R»"></template></body>',
4526+
'<head><script src="react-dom-bindings/src/server/ReactDOMServerExternalRuntime.js" async=""></script><link rel="expect" href="#«R»" blocking="render"></head><body><p>hello world!</p><template id="«R»"></template></body>',
45234527
);
45244528
});
45254529

@@ -5317,7 +5321,9 @@ describe('ReactDOMFizzServer', () => {
53175321
});
53185322

53195323
expect(container.innerHTML).toEqual(
5320-
'<div>hello<b>world, <!-- -->Foo</b>!</div>',
5324+
(gate(flags => flags.shouldUseFizzExternalRuntime)
5325+
? '<script src="react-dom-bindings/src/server/ReactDOMServerExternalRuntime.js" async=""></script>'
5326+
: '') + '<div>hello<b>world, <!-- -->Foo</b>!</div>',
53215327
);
53225328
const errors = [];
53235329
ReactDOMClient.hydrateRoot(container, <App name="Foo" />, {
@@ -5518,7 +5524,7 @@ describe('ReactDOMFizzServer', () => {
55185524
pipe(writable);
55195525
});
55205526

5521-
expect(container.firstElementChild.outerHTML).toEqual(
5527+
expect(container.lastElementChild.outerHTML).toEqual(
55225528
'<div>hello<b>world<!-- --></b></div>',
55235529
);
55245530

@@ -5556,7 +5562,7 @@ describe('ReactDOMFizzServer', () => {
55565562
pipe(writable);
55575563
});
55585564

5559-
expect(container.firstElementChild.outerHTML).toEqual(
5565+
expect(container.lastElementChild.outerHTML).toEqual(
55605566
'<div>hello<b>world</b></div>',
55615567
);
55625568

@@ -5696,7 +5702,10 @@ describe('ReactDOMFizzServer', () => {
56965702
});
56975703

56985704
expect(container.innerHTML).toEqual(
5699-
'<div><!--$-->hello<!-- -->world<!-- --><!--/$--><!--$-->world<!-- --><!--/$--><!--$-->hello<!-- -->world<!-- --><br><!--/$--><!--$-->world<!-- --><br><!--/$--></div>',
5705+
(gate(flags => flags.shouldUseFizzExternalRuntime)
5706+
? '<script src="react-dom-bindings/src/server/ReactDOMServerExternalRuntime.js" async=""></script>'
5707+
: '') +
5708+
'<div><!--$-->hello<!-- -->world<!-- --><!--/$--><!--$-->world<!-- --><!--/$--><!--$-->hello<!-- -->world<!-- --><br><!--/$--><!--$-->world<!-- --><br><!--/$--></div>',
57005709
);
57015710

57025711
const errors = [];
@@ -6499,7 +6508,11 @@ describe('ReactDOMFizzServer', () => {
64996508
});
65006509

65016510
expect(document.documentElement.outerHTML).toEqual(
6502-
'<html><head><link rel="expect" href="#«R»" blocking="render"></head><body><script>try { foo() } catch (e) {} ;</script><template id="«R»"></template></body></html>',
6511+
'<html><head>' +
6512+
(gate(flags => flags.shouldUseFizzExternalRuntime)
6513+
? '<script src="react-dom-bindings/src/server/ReactDOMServerExternalRuntime.js" async=""></script>'
6514+
: '') +
6515+
'<link rel="expect" href="#«R»" blocking="render"></head><body><script>try { foo() } catch (e) {} ;</script><template id="«R»"></template></body></html>',
65036516
);
65046517
});
65056518

packages/react-dom/src/__tests__/ReactDOMFloat-test.js

+3
Original file line numberDiff line numberDiff line change
@@ -701,6 +701,9 @@ describe('ReactDOMFloat', () => {
701701
});
702702
expect(chunks).toEqual([
703703
'<!DOCTYPE html><html><head><script async="" src="foo"></script>' +
704+
(gate(flags => flags.shouldUseFizzExternalRuntime)
705+
? '<script src="react-dom/unstable_server-external-runtime" async=""></script>'
706+
: '') +
704707
'<link rel="expect" href="#«R»" blocking="render"/><title>foo</title></head>' +
705708
'<body>bar<template id="«R»"></template>',
706709
'</body></html>',

packages/react-markup/src/ReactFizzConfigMarkup.js

-2
Original file line numberDiff line numberDiff line change
@@ -208,14 +208,12 @@ export function writePreambleStart(
208208
destination: Destination,
209209
resumableState: ResumableState,
210210
renderState: RenderState,
211-
willFlushAllSegments: boolean,
212211
skipExpect?: boolean, // Used as an override by ReactFizzConfigMarkup
213212
): void {
214213
return writePreambleStartImpl(
215214
destination,
216215
resumableState,
217216
renderState,
218-
willFlushAllSegments,
219217
true, // skipExpect
220218
);
221219
}

packages/react-server/src/ReactFizzServer.js

+1-8
Original file line numberDiff line numberDiff line change
@@ -4835,14 +4835,7 @@ function flushPreamble(
48354835
preambleSegments: Array<Array<Segment>>,
48364836
) {
48374837
// The preamble is ready.
4838-
const willFlushAllSegments =
4839-
request.allPendingTasks === 0 && request.trackedPostpones === null;
4840-
writePreambleStart(
4841-
destination,
4842-
request.resumableState,
4843-
request.renderState,
4844-
willFlushAllSegments,
4845-
);
4838+
writePreambleStart(destination, request.resumableState, request.renderState);
48464839
for (let i = 0; i < preambleSegments.length; i++) {
48474840
const segments = preambleSegments[i];
48484841
for (let j = 0; j < segments.length; j++) {

0 commit comments

Comments
 (0)