Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Fizz] Assign an ID to the first DOM element in a fallback or insert a dummy (and testing infra) #21020

Merged
merged 4 commits into from Mar 16, 2021

Conversation

sebmarkbage
Copy link
Collaborator

We need some ID attribute so that we can quickly find a Suspense boundary. This approach tries to assign or reuse the ID of the first child element of a Suspense boundary. If the first child is not an element, we insert a dummy hidden span. This breaks CSS pseudo-selectors for this case ofc.

I'm not a fan of how invasive this solution is. It's also not deterministic because it's done in the render phase instead of writing phase. It also seems unnecessary to insert both a comment and a span in the cases where that applies.

As part of this PR I also add actual testing infra to make sure the basics work. It's creating an environment which both streams in the result and hydrates it at the same time. JSDOM can't do HTML streaming parsing so we have to do a bit of a hack to pretend we're streaming it in.

@facebook-github-bot facebook-github-bot added CLA Signed React Core Team Opened by a member of the React Core Team labels Mar 16, 2021
@sizebot
Copy link

sizebot commented Mar 16, 2021

Comparing: f8979e0...babefe9

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name +/- Base Current +/- gzip Base gzip Current gzip
oss-stable/react-dom/cjs/react-dom.production.min.js = 122.83 kB 122.83 kB = 39.52 kB 39.52 kB
oss-experimental/react-dom/cjs/react-dom.production.min.js = 129.33 kB 129.33 kB = 41.59 kB 41.58 kB
facebook-www/ReactDOM-prod.classic.js = 408.70 kB 408.70 kB = 75.80 kB 75.80 kB
facebook-www/ReactDOM-prod.modern.js = 396.96 kB 396.96 kB = 73.86 kB 73.86 kB
facebook-www/ReactDOMForked-prod.classic.js = 408.71 kB 408.71 kB = 75.80 kB 75.80 kB
oss-experimental/react-dom/cjs/react-dom-unstable-fizz.browser.production.min.js +6.45% 8.95 kB 9.53 kB +5.76% 3.42 kB 3.62 kB
oss-experimental/react-dom/cjs/react-dom-unstable-fizz.node.production.min.js +6.31% 9.15 kB 9.72 kB +6.10% 3.44 kB 3.65 kB
oss-experimental/react-dom/umd/react-dom-unstable-fizz.browser.production.min.js +6.28% 9.14 kB 9.72 kB +5.72% 3.50 kB 3.70 kB
oss-experimental/react-dom/cjs/react-dom-unstable-fizz.browser.development.js +4.91% 40.87 kB 42.88 kB +3.89% 10.40 kB 10.81 kB
oss-experimental/react-dom/cjs/react-dom-unstable-fizz.node.development.js +4.88% 41.12 kB 43.13 kB +3.90% 10.41 kB 10.82 kB
oss-experimental/react-dom/umd/react-dom-unstable-fizz.browser.development.js +4.88% 43.07 kB 45.17 kB +3.74% 10.57 kB 10.96 kB
oss-experimental/react-server/cjs/react-server.production.min.js +3.32% 7.36 kB 7.60 kB +2.82% 2.73 kB 2.81 kB
oss-stable/react-server/cjs/react-server.production.min.js +3.32% 7.36 kB 7.60 kB +2.82% 2.73 kB 2.81 kB
oss-experimental/react-server/cjs/react-server.development.js +2.53% 27.80 kB 28.51 kB +1.99% 7.15 kB 7.29 kB
oss-stable/react-server/cjs/react-server.development.js +2.53% 27.80 kB 28.51 kB +1.99% 7.15 kB 7.29 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name +/- Base Current +/- gzip Base gzip Current gzip
oss-experimental/react-dom/cjs/react-dom-unstable-fizz.browser.production.min.js +6.45% 8.95 kB 9.53 kB +5.76% 3.42 kB 3.62 kB
oss-experimental/react-dom/cjs/react-dom-unstable-fizz.node.production.min.js +6.31% 9.15 kB 9.72 kB +6.10% 3.44 kB 3.65 kB
oss-experimental/react-dom/umd/react-dom-unstable-fizz.browser.production.min.js +6.28% 9.14 kB 9.72 kB +5.72% 3.50 kB 3.70 kB
oss-experimental/react-dom/cjs/react-dom-unstable-fizz.browser.development.js +4.91% 40.87 kB 42.88 kB +3.89% 10.40 kB 10.81 kB
oss-experimental/react-dom/cjs/react-dom-unstable-fizz.node.development.js +4.88% 41.12 kB 43.13 kB +3.90% 10.41 kB 10.82 kB
oss-experimental/react-dom/umd/react-dom-unstable-fizz.browser.development.js +4.88% 43.07 kB 45.17 kB +3.74% 10.57 kB 10.96 kB
oss-experimental/react-server/cjs/react-server.production.min.js +3.32% 7.36 kB 7.60 kB +2.82% 2.73 kB 2.81 kB
oss-stable/react-server/cjs/react-server.production.min.js +3.32% 7.36 kB 7.60 kB +2.82% 2.73 kB 2.81 kB
oss-experimental/react-server/cjs/react-server.development.js +2.53% 27.80 kB 28.51 kB +1.99% 7.15 kB 7.29 kB
oss-stable/react-server/cjs/react-server.development.js +2.53% 27.80 kB 28.51 kB +1.99% 7.15 kB 7.29 kB

Generated by 🚫 dangerJS against babefe9

@sebmarkbage
Copy link
Collaborator Author

sebmarkbage commented Mar 16, 2021

Not sure what's up with that test failure.

@gaearon
Copy link
Collaborator

gaearon commented Mar 16, 2021

Does unstable_createRoot work?

}
}

function getVisibleChildren(element) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

😍

// But it is not yet hydrated.
expect(ref.current).toBe(null);

Scheduler.unstable_flushAll();
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe you could have two acts: one for Fizz, one for the Scheduler/reconciler?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was kind of expecting to have them all be like one act that does both the server and the client in that act. E.g. I didn't include anything like "scheduler.yield" here.

This was ported from another test though. Not sure if this will come up more.


if (Array.isArray(node)) {
for (let i = 0; i < node.length; i++) {
renderNode(request, parentBoundary, segment, node[i]);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, so nice to be able to use the actual JS stack 😆

@acdlite
Copy link
Collaborator

acdlite commented Mar 16, 2021

Does unstable_createRoot work?

Yeah createRoot doesn't exist in the experimental builds. Only the FB ones. So either gate the test or switch to unstable_createRoot.

Copy link
Collaborator

@acdlite acdlite left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Neat. Agree it's a bit invasive but fine to land this until you think of something better.

@acdlite
Copy link
Collaborator

acdlite commented Mar 16, 2021

Love the tests, btw.

@sebmarkbage sebmarkbage merged commit 1d1e49c into facebook:master Mar 16, 2021
zhengjitf pushed a commit to zhengjitf/react that referenced this pull request Mar 23, 2021
…a dummy (and testing infra) (facebook#21020)

* Patches

* Add Fizz testing infra structure

* Assign an ID to the first DOM node in a fallback or insert a dummy

* unstable_createRoot
facebook-github-bot pushed a commit to facebook/react-native that referenced this pull request Mar 23, 2021
Summary:
This sync includes the following changes:
- **[6d3ecb70d](facebook/react@6d3ecb70d )**: Remove unstable_changedBits ([#20953](facebook/react#20953)) //<Andrew Clark>//
- **[754e30728](facebook/react@754e30728 )**: Delete immediateQueueCallbackNode ([#20980](facebook/react#20980)) //<Andrew Clark>//
- **[be5a2e231](facebook/react@be5a2e231 )**: Land enableSyncMicrotasks ([#20979](facebook/react#20979)) //<Andrew Clark>//
- **[f6bc9c824](facebook/react@f6bc9c824 )**: [Fizz] Expose maxBoundarySize as an option ([#21029](facebook/react#21029)) //<Sebastian Markbåge>//
- **[154b85213](facebook/react@154b85213 )**: [Fizz] Expose a method to explicitly start writing to a Node stream ([#21028](facebook/react#21028)) //<Sebastian Markbåge>//
- **[cf485e6f6](facebook/react@cf485e6f6 )**: [Fizz] Expose a method to abort a pending request ([#21027](facebook/react#21027)) //<Sebastian Markbåge>//
- **[3fb11eed9](facebook/react@3fb11eed9 )**: React Native: Touch Instrumentation Interface ([#21024](facebook/react#21024)) //<Timothy Yung>//
- **[825c3021f](facebook/react@825c3021f )**: Don't delete trailing mismatches during hydration at the root ([#21021](facebook/react#21021)) //<Sebastian Markbåge>//
- **[1d1e49cfa](facebook/react@1d1e49cfa )**: [Fizz] Assign an ID to the first DOM element in a fallback or insert a dummy (and testing infra) ([#21020](facebook/react#21020)) //<Sebastian Markbåge>//
- **[466b26c92](facebook/react@466b26c92 )**: Store commit durations on HostRoot for DevTools access ([#20983](facebook/react#20983)) //<Brian Vaughn>//
- **[89acfa639](facebook/react@89acfa639 )**: Fix native event batching in concurrent mode ([#21010](facebook/react#21010)) //<Ricky>//
- **[0203b6567](facebook/react@0203b6567 )**: chore: update react-reconciler README ([#21016](facebook/react#21016)) //<susiwen8>//

Changelog:
[General][Changed] - React Native sync for revisions c9f6d0a...6d3ecb7

jest_e2e[run_all_tests]

Reviewed By: JoshuaGross, kacieb

Differential Revision: D27231625

fbshipit-source-id: 89c0c0662e69044ae8890486a693013bee6005dd
koto pushed a commit to koto/react that referenced this pull request Jun 15, 2021
…a dummy (and testing infra) (facebook#21020)

* Patches

* Add Fizz testing infra structure

* Assign an ID to the first DOM node in a fallback or insert a dummy

* unstable_createRoot
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
CLA Signed React Core Team Opened by a member of the React Core Team
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

5 participants