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

Model Float on Hoistables semantics #26106

Merged
merged 10 commits into from
Feb 10, 2023
Merged

Model Float on Hoistables semantics #26106

merged 10 commits into from
Feb 10, 2023

Conversation

gnoff
Copy link
Collaborator

@gnoff gnoff commented Feb 3, 2023

Hoistables

In the original implementation of Float, all hoisted elements were treated like Resources. They had deduplication semantics and hydrated based on a key. This made certain kinds of hoists very challenging such as sequences of meta tags for og:image:... metadata. The reason is each tag along is not dedupable based on only it's intrinsic properties. two identical tags may need to be included and hoisted together with preceding meta tags that describe a semantic object with a linear set of html nodes.

It was clear that the concept of Browser Resources (stylesheets / scripts / preloads) did not extend universally to all hoistable tags (title, meta, other links, etc...)

Additionally while Resources benefit from deduping they suffer an inability to update because while we may have multiple rendered elements that refer to a single Resource it isn't unambiguous which element owns the props on the underlying resource. We could try merging props, but that is still really hard to reason about for authors. Instead we restrict Resource semantics to freezing the props at the time the Resource is first constructed and warn if you attempt to render the same Resource with different props via another rendered element or by updating an existing element for that Resource.

This lack of updating restriction is however way more extreme than necessary for instances that get hoisted but otherwise do not dedupe; where there is a well defined DOM instance for each rendered element. We should be able to update props on these instances.

Hoistable is a generalization of what Float tries to model for hoisting. Instead of assuming every hoistable element is a Resource we now have two distinct categories, hoistable elements and hoistable resources. As one might guess the former has semantics that match regular Host Components except the placement of the node is usually in the <head>. The latter continues to behave how the original implementation of HostResource behaved with the first iteration of Float

Hoistable Element

On the server hoistable elements render just like regular tags except the output is stored in special queues that can be emitted in the stream earlier than they otherwise would be if rendered in place. This also allow for instance the ability to render a hoistable before even rendering the tag because the queues for hoistable elements won't flush until after we have flushed the preamble (<DOCTYPE html><html><head>).

On the client, hoistable elements largely operate like HostComponents. The most notable difference is in the hydration strategy. If we are hydrating and encounter a hoistable element we will look for all tags in the document that could potentially be a match and we check whether the attributes match the props for this particular instance. We also do this in the commit phase rather than the render phase. The reason hydration can be done for HostComponents in render is the instance will be removed from the document if hydration fails so mutating it in render is safe. For hoistables the nodes are not in a hydration boundary (Root or SuspenseBoundary at time of writing) and thus if hydration fails and we may have an instance marked as bound to some Fiber when that Fiber never commits. Moving the hydration matching to commit ensures we will always succeed in pairing the hoisted DOM instance with a Fiber that has committed.

Hoistable Resource

On the server and client the semantics of Resources are largely the same they just don't apply to title, meta, and most link tags anymore. Resources hoist and dedupe via an href key and are ref counted. In a future update we will add a garbage collector so we can clean up Resources that no longer have any references

<style> support

In earlier implementations there was no support for <style> tags. This PR adds support for treating <style href="..." precedence="...">...</style> as a Resource analagous to <link rel="stylesheet" href="..." precedence="..." />

It may seem odd at first to require an href to get Resource semantics for a style tag. The rationale is that these are for inlining of actual external stylesheets as an optimization and for URI like scoping of inline styles for css-in-js libraries. The href indicates that the key space for <style> and <link rel="stylesheet" /> Resources is shared. and the precedence is there to allow for interleaving of both kinds of Style resources. This is an advanced feature that we do not expect most app developers to use directly but will be quite handy for various styling libraries and for folks who want to inline as much as possible once Fizz supports this feature.

refactor notes

  • HostResource Fiber type is renamed HostHoistable to reflect the generalization of the concept
  • The Resource object representation is modified to reduce hidden class checks and to use less memory overall
  • The thing that distinguishes a resource from an element is whether the Fiber has a memoizedState. If it does, it will use resource semantics, otherwise element semantics
  • The time complexity of matching hositable elements for hydration should be improved

@facebook-github-bot facebook-github-bot added CLA Signed React Core Team Opened by a member of the React Core Team labels Feb 3, 2023
@sebmarkbage sebmarkbage self-requested a review February 6, 2023 04:49
@gnoff gnoff force-pushed the float-hoistable branch 2 times, most recently from e3322e4 to 607f54d Compare February 7, 2023 22:50
@react-sizebot
Copy link

react-sizebot commented Feb 7, 2023

Comparing: ef9f6e7...032fd66

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 = 154.83 kB 154.56 kB = 49.12 kB 48.84 kB
oss-experimental/react-dom/cjs/react-dom.production.min.js = 156.83 kB 156.56 kB = 49.73 kB 49.46 kB
facebook-www/ReactDOM-prod.classic.js = 533.54 kB 529.69 kB = 94.99 kB 94.36 kB
facebook-www/ReactDOM-prod.modern.js = 518.81 kB 514.91 kB = 92.84 kB 92.16 kB
oss-experimental/react-dom/unstable_server-external-runtime.js +14.83% 2.50 kB 2.87 kB +10.56% 1.14 kB 1.26 kB
oss-stable-semver/react-dom/unstable_server-external-runtime.js +14.83% 2.50 kB 2.87 kB +10.56% 1.14 kB 1.26 kB
oss-stable/react-dom/unstable_server-external-runtime.js +14.83% 2.50 kB 2.87 kB +10.56% 1.14 kB 1.26 kB
facebook-www/ReactDOMServerStreaming-dev.modern.js +6.07% 332.80 kB 353.00 kB +4.81% 74.16 kB 77.73 kB
facebook-www/ReactDOMServer-dev.modern.js +6.00% 337.64 kB 357.90 kB +4.92% 75.26 kB 78.96 kB
facebook-www/ReactDOMServer-dev.classic.js +5.89% 344.30 kB 364.57 kB +4.49% 76.67 kB 80.12 kB
oss-stable-semver/react-dom/cjs/react-dom-server.bun.development.js +5.32% 317.18 kB 334.06 kB +4.14% 72.94 kB 75.96 kB
oss-stable/react-dom/cjs/react-dom-server.bun.development.js +5.32% 317.20 kB 334.08 kB +4.14% 72.96 kB 75.98 kB
oss-experimental/react-dom/cjs/react-dom-server.bun.development.js +5.30% 318.53 kB 335.41 kB +4.13% 73.32 kB 76.35 kB
oss-stable-semver/react-dom/cjs/react-dom-server-legacy.browser.development.js +5.30% 319.97 kB 336.92 kB +4.30% 73.36 kB 76.52 kB
oss-stable/react-dom/cjs/react-dom-server-legacy.browser.development.js +5.30% 319.99 kB 336.94 kB +4.30% 73.39 kB 76.54 kB
oss-experimental/react-dom/cjs/react-dom-server-legacy.browser.development.js +5.28% 321.32 kB 338.27 kB +4.28% 73.75 kB 76.90 kB
oss-stable-semver/react-dom/cjs/react-dom-server.browser.development.js +5.27% 320.20 kB 337.08 kB +4.06% 73.75 kB 76.74 kB
oss-stable/react-dom/cjs/react-dom-server.browser.development.js +5.27% 320.23 kB 337.11 kB +4.06% 73.77 kB 76.76 kB
oss-stable-semver/react-dom/cjs/react-dom-server.edge.development.js +5.27% 320.35 kB 337.23 kB +4.05% 73.79 kB 76.79 kB
oss-stable/react-dom/cjs/react-dom-server.edge.development.js +5.27% 320.37 kB 337.25 kB +4.05% 73.82 kB 76.81 kB
oss-stable-semver/react-dom/cjs/react-dom-server-legacy.node.development.js +5.27% 321.81 kB 338.76 kB +4.28% 73.85 kB 77.01 kB
oss-stable/react-dom/cjs/react-dom-server-legacy.node.development.js +5.27% 321.84 kB 338.79 kB +4.28% 73.88 kB 77.04 kB
oss-experimental/react-dom/cjs/react-dom-static.browser.development.js +5.26% 320.86 kB 337.74 kB +4.06% 73.94 kB 76.94 kB
oss-experimental/react-dom/cjs/react-dom-static.edge.development.js +5.26% 321.01 kB 337.89 kB +4.06% 73.98 kB 76.98 kB
oss-experimental/react-dom/cjs/react-dom-server.browser.development.js +5.25% 321.56 kB 338.44 kB +4.05% 74.13 kB 77.13 kB
oss-stable-semver/react-dom/cjs/react-dom-server.node.development.js +5.25% 321.63 kB 338.51 kB +4.06% 73.77 kB 76.76 kB
oss-stable/react-dom/cjs/react-dom-server.node.development.js +5.25% 321.65 kB 338.53 kB +4.05% 73.79 kB 76.79 kB
oss-experimental/react-dom/cjs/react-dom-server.edge.development.js +5.25% 321.70 kB 338.58 kB +4.05% 74.17 kB 77.17 kB
oss-experimental/react-dom/cjs/react-dom-server-legacy.node.development.js +5.24% 323.17 kB 340.12 kB +4.26% 74.24 kB 77.40 kB
oss-experimental/react-dom/cjs/react-dom-static.node.development.js +5.23% 322.94 kB 339.82 kB +4.05% 74.24 kB 77.24 kB
oss-experimental/react-dom/cjs/react-dom-server.node.development.js +5.23% 322.98 kB 339.86 kB +4.05% 74.15 kB 77.15 kB
oss-stable-semver/react-dom/umd/react-dom-server-legacy.browser.development.js +5.13% 335.52 kB 352.73 kB +4.26% 74.18 kB 77.34 kB
oss-stable/react-dom/umd/react-dom-server-legacy.browser.development.js +5.13% 335.54 kB 352.75 kB +4.26% 74.20 kB 77.36 kB
oss-experimental/react-dom/umd/react-dom-server-legacy.browser.development.js +5.11% 336.95 kB 354.16 kB +4.24% 74.57 kB 77.73 kB
oss-stable-semver/react-dom/umd/react-dom-server.browser.development.js +5.10% 335.76 kB 352.89 kB +4.07% 74.54 kB 77.57 kB
oss-stable/react-dom/umd/react-dom-server.browser.development.js +5.10% 335.79 kB 352.92 kB +4.07% 74.56 kB 77.59 kB
oss-experimental/react-dom/umd/react-dom-server.browser.development.js +5.08% 337.20 kB 354.33 kB +4.07% 74.91 kB 77.96 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.production.min.js +3.28% 23.71 kB 24.49 kB +1.58% 8.28 kB 8.41 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.production.min.js +3.28% 23.71 kB 24.49 kB +1.58% 8.28 kB 8.41 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.production.min.js +3.28% 23.75 kB 24.53 kB +1.57% 8.30 kB 8.43 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.min.js +3.26% 23.87 kB 24.65 kB +1.60% 8.34 kB 8.47 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.min.js +3.26% 23.87 kB 24.65 kB +1.60% 8.34 kB 8.47 kB
oss-stable-semver/react-server-dom-webpack/umd/react-server-dom-webpack-server.browser.production.min.js +3.25% 23.90 kB 24.68 kB +1.52% 8.37 kB 8.50 kB
oss-stable/react-server-dom-webpack/umd/react-server-dom-webpack-server.browser.production.min.js +3.25% 23.90 kB 24.68 kB +1.52% 8.37 kB 8.50 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.min.js +3.25% 23.92 kB 24.70 kB +1.60% 8.36 kB 8.50 kB
oss-experimental/react-server-dom-webpack/umd/react-server-dom-webpack-server.browser.production.min.js +3.25% 23.94 kB 24.72 kB +1.48% 8.39 kB 8.52 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.min.js +3.21% 24.25 kB 25.03 kB +1.56% 8.44 kB 8.57 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.min.js +3.21% 24.25 kB 25.03 kB +1.56% 8.44 kB 8.57 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.min.js +3.20% 24.29 kB 25.07 kB +1.60% 8.46 kB 8.59 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/unstable_server-external-runtime.js +14.83% 2.50 kB 2.87 kB +10.56% 1.14 kB 1.26 kB
oss-stable-semver/react-dom/unstable_server-external-runtime.js +14.83% 2.50 kB 2.87 kB +10.56% 1.14 kB 1.26 kB
oss-stable/react-dom/unstable_server-external-runtime.js +14.83% 2.50 kB 2.87 kB +10.56% 1.14 kB 1.26 kB
facebook-www/ReactDOMServerStreaming-dev.modern.js +6.07% 332.80 kB 353.00 kB +4.81% 74.16 kB 77.73 kB
facebook-www/ReactDOMServer-dev.modern.js +6.00% 337.64 kB 357.90 kB +4.92% 75.26 kB 78.96 kB
facebook-www/ReactDOMServer-dev.classic.js +5.89% 344.30 kB 364.57 kB +4.49% 76.67 kB 80.12 kB
oss-stable-semver/react-dom/cjs/react-dom-server.bun.development.js +5.32% 317.18 kB 334.06 kB +4.14% 72.94 kB 75.96 kB
oss-stable/react-dom/cjs/react-dom-server.bun.development.js +5.32% 317.20 kB 334.08 kB +4.14% 72.96 kB 75.98 kB
oss-experimental/react-dom/cjs/react-dom-server.bun.development.js +5.30% 318.53 kB 335.41 kB +4.13% 73.32 kB 76.35 kB
oss-stable-semver/react-dom/cjs/react-dom-server-legacy.browser.development.js +5.30% 319.97 kB 336.92 kB +4.30% 73.36 kB 76.52 kB
oss-stable/react-dom/cjs/react-dom-server-legacy.browser.development.js +5.30% 319.99 kB 336.94 kB +4.30% 73.39 kB 76.54 kB
oss-experimental/react-dom/cjs/react-dom-server-legacy.browser.development.js +5.28% 321.32 kB 338.27 kB +4.28% 73.75 kB 76.90 kB
oss-stable-semver/react-dom/cjs/react-dom-server.browser.development.js +5.27% 320.20 kB 337.08 kB +4.06% 73.75 kB 76.74 kB
oss-stable/react-dom/cjs/react-dom-server.browser.development.js +5.27% 320.23 kB 337.11 kB +4.06% 73.77 kB 76.76 kB
oss-stable-semver/react-dom/cjs/react-dom-server.edge.development.js +5.27% 320.35 kB 337.23 kB +4.05% 73.79 kB 76.79 kB
oss-stable/react-dom/cjs/react-dom-server.edge.development.js +5.27% 320.37 kB 337.25 kB +4.05% 73.82 kB 76.81 kB
oss-stable-semver/react-dom/cjs/react-dom-server-legacy.node.development.js +5.27% 321.81 kB 338.76 kB +4.28% 73.85 kB 77.01 kB
oss-stable/react-dom/cjs/react-dom-server-legacy.node.development.js +5.27% 321.84 kB 338.79 kB +4.28% 73.88 kB 77.04 kB
oss-experimental/react-dom/cjs/react-dom-static.browser.development.js +5.26% 320.86 kB 337.74 kB +4.06% 73.94 kB 76.94 kB
oss-experimental/react-dom/cjs/react-dom-static.edge.development.js +5.26% 321.01 kB 337.89 kB +4.06% 73.98 kB 76.98 kB
oss-experimental/react-dom/cjs/react-dom-server.browser.development.js +5.25% 321.56 kB 338.44 kB +4.05% 74.13 kB 77.13 kB
oss-stable-semver/react-dom/cjs/react-dom-server.node.development.js +5.25% 321.63 kB 338.51 kB +4.06% 73.77 kB 76.76 kB
oss-stable/react-dom/cjs/react-dom-server.node.development.js +5.25% 321.65 kB 338.53 kB +4.05% 73.79 kB 76.79 kB
oss-experimental/react-dom/cjs/react-dom-server.edge.development.js +5.25% 321.70 kB 338.58 kB +4.05% 74.17 kB 77.17 kB
oss-experimental/react-dom/cjs/react-dom-server-legacy.node.development.js +5.24% 323.17 kB 340.12 kB +4.26% 74.24 kB 77.40 kB
oss-experimental/react-dom/cjs/react-dom-static.node.development.js +5.23% 322.94 kB 339.82 kB +4.05% 74.24 kB 77.24 kB
oss-experimental/react-dom/cjs/react-dom-server.node.development.js +5.23% 322.98 kB 339.86 kB +4.05% 74.15 kB 77.15 kB
oss-stable-semver/react-dom/umd/react-dom-server-legacy.browser.development.js +5.13% 335.52 kB 352.73 kB +4.26% 74.18 kB 77.34 kB
oss-stable/react-dom/umd/react-dom-server-legacy.browser.development.js +5.13% 335.54 kB 352.75 kB +4.26% 74.20 kB 77.36 kB
oss-experimental/react-dom/umd/react-dom-server-legacy.browser.development.js +5.11% 336.95 kB 354.16 kB +4.24% 74.57 kB 77.73 kB
oss-stable-semver/react-dom/umd/react-dom-server.browser.development.js +5.10% 335.76 kB 352.89 kB +4.07% 74.54 kB 77.57 kB
oss-stable/react-dom/umd/react-dom-server.browser.development.js +5.10% 335.79 kB 352.92 kB +4.07% 74.56 kB 77.59 kB
oss-experimental/react-dom/umd/react-dom-server.browser.development.js +5.08% 337.20 kB 354.33 kB +4.07% 74.91 kB 77.96 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.production.min.js +3.28% 23.71 kB 24.49 kB +1.58% 8.28 kB 8.41 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.production.min.js +3.28% 23.71 kB 24.49 kB +1.58% 8.28 kB 8.41 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.production.min.js +3.28% 23.75 kB 24.53 kB +1.57% 8.30 kB 8.43 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.min.js +3.26% 23.87 kB 24.65 kB +1.60% 8.34 kB 8.47 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.min.js +3.26% 23.87 kB 24.65 kB +1.60% 8.34 kB 8.47 kB
oss-stable-semver/react-server-dom-webpack/umd/react-server-dom-webpack-server.browser.production.min.js +3.25% 23.90 kB 24.68 kB +1.52% 8.37 kB 8.50 kB
oss-stable/react-server-dom-webpack/umd/react-server-dom-webpack-server.browser.production.min.js +3.25% 23.90 kB 24.68 kB +1.52% 8.37 kB 8.50 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.min.js +3.25% 23.92 kB 24.70 kB +1.60% 8.36 kB 8.50 kB
oss-experimental/react-server-dom-webpack/umd/react-server-dom-webpack-server.browser.production.min.js +3.25% 23.94 kB 24.72 kB +1.48% 8.39 kB 8.52 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.min.js +3.21% 24.25 kB 25.03 kB +1.56% 8.44 kB 8.57 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.min.js +3.21% 24.25 kB 25.03 kB +1.56% 8.44 kB 8.57 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.min.js +3.20% 24.29 kB 25.07 kB +1.60% 8.46 kB 8.59 kB
oss-stable-semver/react-dom/cjs/react-dom-server-legacy.browser.production.min.js +1.98% 50.79 kB 51.79 kB +0.30% 15.61 kB 15.66 kB
oss-stable/react-dom/cjs/react-dom-server-legacy.browser.production.min.js +1.98% 50.81 kB 51.82 kB +0.29% 15.63 kB 15.68 kB
oss-experimental/react-dom/cjs/react-dom-server-legacy.browser.production.min.js +1.96% 51.15 kB 52.15 kB +0.15% 15.78 kB 15.80 kB
oss-stable-semver/react-dom/umd/react-dom-server-legacy.browser.production.min.js +1.94% 50.89 kB 51.88 kB = 15.93 kB 15.87 kB
oss-stable/react-dom/umd/react-dom-server-legacy.browser.production.min.js +1.94% 50.92 kB 51.90 kB = 15.95 kB 15.90 kB
oss-experimental/react-dom/umd/react-dom-server-legacy.browser.production.min.js +1.93% 51.25 kB 52.24 kB = 16.07 kB 16.02 kB
oss-stable-semver/react-dom/cjs/react-dom-server.browser.production.min.js +1.70% 51.97 kB 52.85 kB = 16.53 kB 16.51 kB
oss-stable/react-dom/cjs/react-dom-server.browser.production.min.js +1.70% 51.99 kB 52.88 kB = 16.56 kB 16.53 kB
oss-experimental/react-dom/cjs/react-dom-static.browser.production.min.js +1.70% 52.20 kB 53.09 kB = 16.64 kB 16.61 kB
oss-experimental/react-dom/cjs/react-dom-static.edge.production.min.js +1.70% 52.26 kB 53.15 kB = 16.66 kB 16.63 kB
oss-experimental/react-dom/cjs/react-dom-server.browser.production.min.js +1.69% 52.32 kB 53.21 kB = 16.69 kB 16.65 kB
oss-stable-semver/react-dom/umd/react-dom-server.browser.production.min.js +1.68% 52.04 kB 52.91 kB = 16.83 kB 16.70 kB
oss-stable/react-dom/umd/react-dom-server.browser.production.min.js +1.68% 52.06 kB 52.93 kB = 16.85 kB 16.72 kB
oss-experimental/react-dom/umd/react-dom-server.browser.production.min.js +1.67% 52.39 kB 53.27 kB = 16.97 kB 16.84 kB
oss-stable-semver/react-dom/cjs/react-dom-server-legacy.node.production.min.js +1.39% 55.51 kB 56.28 kB +0.21% 17.06 kB 17.09 kB
oss-stable/react-dom/cjs/react-dom-server-legacy.node.production.min.js +1.39% 55.53 kB 56.30 kB +0.22% 17.08 kB 17.12 kB
oss-experimental/react-dom/cjs/react-dom-server-legacy.node.production.min.js +1.38% 55.93 kB 56.70 kB +0.04% 17.25 kB 17.25 kB
oss-stable-semver/react-dom/cjs/react-dom-server.bun.production.min.js +1.18% 54.80 kB 55.45 kB = 17.09 kB 17.07 kB
oss-stable/react-dom/cjs/react-dom-server.bun.production.min.js +1.18% 54.83 kB 55.48 kB = 17.11 kB 17.09 kB
oss-experimental/react-dom/cjs/react-dom-server.bun.production.min.js +1.18% 55.23 kB 55.88 kB = 17.28 kB 17.23 kB
oss-stable-semver/react-dom/cjs/react-dom-server.edge.production.min.js +1.16% 55.95 kB 56.60 kB = 17.77 kB 17.76 kB
oss-stable/react-dom/cjs/react-dom-server.edge.production.min.js +1.16% 55.98 kB 56.62 kB = 17.79 kB 17.79 kB
oss-experimental/react-dom/cjs/react-dom-server.edge.production.min.js +1.15% 56.38 kB 57.02 kB = 17.94 kB 17.93 kB
oss-stable-semver/react-dom/cjs/react-dom-server.node.production.min.js +1.14% 56.33 kB 56.97 kB = 17.88 kB 17.87 kB
oss-stable/react-dom/cjs/react-dom-server.node.production.min.js +1.14% 56.36 kB 57.00 kB = 17.90 kB 17.89 kB
oss-experimental/react-dom/cjs/react-dom-server.node.production.min.js +1.13% 56.76 kB 57.40 kB = 18.04 kB 18.04 kB
oss-experimental/react-dom/cjs/react-dom-static.node.production.min.js +1.13% 56.76 kB 57.40 kB +0.04% 18.03 kB 18.04 kB
oss-stable-semver/react-reconciler/cjs/react-reconciler.production.min.js +0.80% 106.58 kB 107.43 kB +0.72% 32.37 kB 32.60 kB
oss-stable/react-reconciler/cjs/react-reconciler.production.min.js +0.80% 106.61 kB 107.46 kB +0.72% 32.39 kB 32.63 kB
oss-experimental/react-reconciler/cjs/react-reconciler.production.min.js +0.78% 108.11 kB 108.96 kB +0.77% 32.85 kB 33.11 kB
oss-stable-semver/react-reconciler/cjs/react-reconciler.profiling.min.js +0.73% 115.52 kB 116.37 kB +0.60% 34.61 kB 34.81 kB
oss-stable/react-reconciler/cjs/react-reconciler.profiling.min.js +0.73% 115.54 kB 116.39 kB +0.59% 34.63 kB 34.84 kB
oss-experimental/react-reconciler/cjs/react-reconciler.profiling.min.js +0.72% 117.04 kB 117.89 kB +0.58% 35.10 kB 35.30 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js +0.66% 88.91 kB 89.50 kB +0.86% 21.74 kB 21.92 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js +0.66% 88.91 kB 89.50 kB +0.86% 21.74 kB 21.92 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js +0.66% 88.97 kB 89.55 kB +0.87% 21.75 kB 21.94 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js +0.65% 89.39 kB 89.98 kB +0.86% 21.88 kB 22.07 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js +0.65% 89.39 kB 89.98 kB +0.86% 21.88 kB 22.07 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js +0.65% 89.45 kB 90.03 kB +0.87% 21.90 kB 22.09 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js +0.64% 90.70 kB 91.28 kB +0.81% 21.98 kB 22.16 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js +0.64% 90.70 kB 91.28 kB +0.81% 21.98 kB 22.16 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js +0.64% 90.76 kB 91.34 kB +0.83% 22.00 kB 22.18 kB
oss-stable-semver/react-server-dom-webpack/umd/react-server-dom-webpack-server.browser.development.js +0.63% 93.34 kB 93.93 kB +0.84% 21.99 kB 22.18 kB
oss-stable/react-server-dom-webpack/umd/react-server-dom-webpack-server.browser.development.js +0.63% 93.34 kB 93.93 kB +0.84% 21.99 kB 22.18 kB
oss-experimental/react-server-dom-webpack/umd/react-server-dom-webpack-server.browser.development.js +0.63% 93.40 kB 93.99 kB +0.85% 22.01 kB 22.20 kB
facebook-www/ReactDOMServer-prod.classic.js +0.60% 126.96 kB 127.72 kB +0.61% 24.03 kB 24.17 kB
facebook-www/ReactDOMServer-prod.modern.js +0.55% 123.83 kB 124.52 kB +0.38% 23.41 kB 23.50 kB
oss-stable-semver/react-reconciler/cjs/react-reconciler.development.js +0.46% 856.24 kB 860.18 kB +0.36% 182.43 kB 183.08 kB
oss-stable/react-reconciler/cjs/react-reconciler.development.js +0.46% 856.27 kB 860.20 kB +0.36% 182.45 kB 183.11 kB
oss-experimental/react-reconciler/cjs/react-reconciler.development.js +0.46% 864.49 kB 868.43 kB +0.36% 183.92 kB 184.58 kB
facebook-www/ReactDOMServerStreaming-prod.modern.js +0.44% 128.96 kB 129.53 kB +0.22% 24.72 kB 24.77 kB
oss-experimental/react-noop-renderer/cjs/react-noop-renderer-server.production.min.js +0.31% 3.24 kB 3.25 kB +0.33% 1.21 kB 1.22 kB
oss-stable-semver/react-noop-renderer/cjs/react-noop-renderer-server.production.min.js +0.31% 3.24 kB 3.25 kB +0.33% 1.21 kB 1.22 kB
oss-stable/react-noop-renderer/cjs/react-noop-renderer-server.production.min.js +0.31% 3.24 kB 3.25 kB +0.33% 1.21 kB 1.22 kB
facebook-www/ReactDOM-profiling.classic.js = 563.80 kB 559.95 kB = 99.48 kB 98.88 kB
facebook-www/ReactDOM-profiling.modern.js = 548.97 kB 545.08 kB = 97.32 kB 96.69 kB
facebook-www/ReactDOM-prod.classic.js = 533.54 kB 529.69 kB = 94.99 kB 94.36 kB
facebook-www/ReactDOM-prod.modern.js = 518.81 kB 514.91 kB = 92.84 kB 92.16 kB
facebook-www/ReactDOMTesting-prod.classic.js = 496.65 kB 492.82 kB = 90.91 kB 90.36 kB
facebook-www/ReactDOMTesting-prod.modern.js = 481.20 kB 477.21 kB = 88.65 kB 88.08 kB
facebook-www/ReactDOM-dev.classic.js = 1,361.90 kB 1,339.56 kB = 295.81 kB 291.68 kB
facebook-www/ReactDOM-dev.modern.js = 1,337.51 kB 1,315.17 kB = 291.28 kB 287.16 kB
oss-experimental/react-dom/umd/react-dom.development.js = 1,276.17 kB 1,254.18 kB = 273.13 kB 269.11 kB
oss-experimental/react-dom/cjs/react-dom.development.js = 1,216.98 kB 1,195.91 kB = 270.18 kB 266.22 kB
oss-stable/react-dom/umd/react-dom.development.js = 1,265.12 kB 1,243.13 kB = 271.11 kB 267.08 kB
oss-stable-semver/react-dom/umd/react-dom.development.js = 1,265.09 kB 1,243.11 kB = 271.09 kB 267.06 kB
oss-experimental/react-dom/cjs/react-dom-unstable_testing.development.js = 1,210.08 kB 1,189.02 kB = 268.85 kB 264.84 kB
oss-stable/react-dom/cjs/react-dom.development.js = 1,206.50 kB 1,185.43 kB = 268.19 kB 264.22 kB
oss-stable-semver/react-dom/cjs/react-dom.development.js = 1,206.48 kB 1,185.41 kB = 268.17 kB 264.19 kB
facebook-www/ReactDOMTesting-dev.classic.js = 1,240.18 kB 1,217.84 kB = 274.13 kB 270.07 kB
facebook-www/ReactDOMTesting-dev.modern.js = 1,210.97 kB 1,188.63 kB = 268.51 kB 264.39 kB

Generated by 🚫 dangerJS against 032fd66

Copy link
Collaborator

@sebmarkbage sebmarkbage left a comment

Choose a reason for hiding this comment

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

This feels like the right direction. We can nit pick later but let's get this in sooner rather than later because it'll be a pain to rebase later for everyone involved.

Fix the lints. Add a more comprehensive PR description to others and our future self what's going here, before landing.

},
},
};
export function compareResourcePropsForWarning(
Copy link
Collaborator

Choose a reason for hiding this comment

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

This doesn't need to be exported.

You can leave the helper but I'm a little suspicious when I see code like this generic diffing. We don't really have that anywhere else and we do have a lot of diffing but we can never get away with it being this generic. We usually just do it inline.

One consideration here is if the props that materialize to the same thing are truly different. E.g. a number and a string of the same value. Is that different? Are there no special cases?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

yeah I already had to do some selective processing of the diff for some cases like if you don't pass a precedence in preinit that still is compatible with a "default" precedence on a stylesheet link. I'll see about refactoring it in a future update to be more direct

));
if (current === null) {
if (!getIsHydrating() && resource === null) {
// This is not a Resource Hoistable and we aren't hydrating so we construct the
Copy link
Collaborator

Choose a reason for hiding this comment

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

construct the... what?

@@ -494,6 +494,7 @@ describe('ReactDOMComponent', () => {
'To fix this, either do not render the element at all ' +
'or pass null to href instead of an empty string.',
);
console.log('container', container.outerHTML);
Copy link
Collaborator

Choose a reason for hiding this comment

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

rm

internalInstanceHandle: Object,
): Instance {
const ownerDocument = getDocumentFromRoot(hoistableRoot);
const nodes = ownerDocument.querySelectorAll(type);
Copy link
Collaborator

Choose a reason for hiding this comment

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

getElementsByTagName by-passes the parsing.

);
childString = '';
}
nodeLoop: for (let i = 0; i < nodes.length; i++) {
Copy link
Collaborator

Choose a reason for hiding this comment

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

I'm not loving the computational complexity of N * N queries for number of nodes. I wonder if we need to do something like caching in a Map.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

yeah same, i'll think about more efficient implementations for a follow up

@gnoff gnoff marked this pull request as ready for review February 10, 2023 06:03
@gnoff gnoff merged commit 6396b66 into facebook:main Feb 10, 2023
@gnoff gnoff deleted the float-hoistable branch February 10, 2023 06:59
github-actions bot pushed a commit that referenced this pull request Feb 10, 2023
## Hoistables

In the original implementation of Float, all hoisted elements were
treated like Resources. They had deduplication semantics and hydrated
based on a key. This made certain kinds of hoists very challenging such
as sequences of meta tags for `og:image:...` metadata. The reason is
each tag along is not dedupable based on only it's intrinsic properties.
two identical tags may need to be included and hoisted together with
preceding meta tags that describe a semantic object with a linear set of
html nodes.

It was clear that the concept of Browser Resources (stylesheets /
scripts / preloads) did not extend universally to all hositable tags
(title, meta, other links, etc...)

Additionally while Resources benefit from deduping they suffer an
inability to update because while we may have multiple rendered elements
that refer to a single Resource it isn't unambiguous which element owns
the props on the underlying resource. We could try merging props, but
that is still really hard to reason about for authors. Instead we
restrict Resource semantics to freezing the props at the time the
Resource is first constructed and warn if you attempt to render the same
Resource with different props via another rendered element or by
updating an existing element for that Resource.

This lack of updating restriction is however way more extreme than
necessary for instances that get hoisted but otherwise do not dedupe;
where there is a well defined DOM instance for each rendered element. We
should be able to update props on these instances.

Hoistable is a generalization of what Float tries to model for hoisting.
Instead of assuming every hoistable element is a Resource we now have
two distinct categories, hoistable elements and hoistable resources. As
one might guess the former has semantics that match regular Host
Components except the placement of the node is usually in the <head>.
The latter continues to behave how the original implementation of
HostResource behaved with the first iteration of Float

### Hoistable Element
On the server hoistable elements render just like regular tags except
the output is stored in special queues that can be emitted in the stream
earlier than they otherwise would be if rendered in place. This also
allow for instance the ability to render a hoistable before even
rendering the <html> tag because the queues for hoistable elements won't
flush until after we have flushed the preamble (`<DOCTYPE
html><html><head>`).

On the client, hoistable elements largely operate like HostComponents.
The most notable difference is in the hydration strategy. If we are
hydrating and encounter a hoistable element we will look for all tags in
the document that could potentially be a match and we check whether the
attributes match the props for this particular instance. We also do this
in the commit phase rather than the render phase. The reason hydration
can be done for HostComponents in render is the instance will be removed
from the document if hydration fails so mutating it in render is safe.
For hoistables the nodes are not in a hydration boundary (Root or
SuspenseBoundary at time of writing) and thus if hydration fails and we
may have an instance marked as bound to some Fiber when that Fiber never
commits. Moving the hydration matching to commit ensures we will always
succeed in pairing the hoisted DOM instance with a Fiber that has
committed.

### Hoistable Resource
On the server and client the semantics of Resources are largely the same
they just don't apply to title, meta, and most link tags anymore.
Resources hoist and dedupe via an `href` key and are ref counted. In a
future update we will add a garbage collector so we can clean up
Resources that no longer have any references

## `<style>` support
In earlier implementations there was no support for <style> tags. This
PR adds support for treating `<style href="..."
precedence="...">...</style>` as a Resource analagous to `<link
rel="stylesheet" href="..." precedence="..." />`

It may seem odd at first to require an href to get Resource semantics
for a style tag. The rationale is that these are for inlining of actual
external stylesheets as an optimization and for URI like scoping of
inline styles for css-in-js libraries. The href indicates that the key
space for `<style>` and `<link rel="stylesheet" />` Resources is shared.
and the precedence is there to allow for interleaving of both kinds of
Style resources. This is an advanced feature that we do not expect most
app developers to use directly but will be quite handy for various
styling libraries and for folks who want to inline as much as possible
once Fizz supports this feature.

## refactor notes
* HostResource Fiber type is renamed HostHoistable to reflect the
generalization of the concept
* The Resource object representation is modified to reduce hidden class
checks and to use less memory overall
* The thing that distinguishes a resource from an element is whether the
Fiber has a memoizedState. If it does, it will use resource semantics,
otherwise element semantics
* The time complexity of matching hositable elements for hydration
should be improved

DiffTrain build for [6396b66](6396b66)
[View git log for this commit](https://github.com/facebook/react/commits/6396b664118442f3c2eae7bf13732fcb27bda98f)
return root.ownerDocument || root;
}

export function getHoistableRoot(container: Container): HoistableRoot {
// Flow thinks getRootNode returns Node but we know it is actualy either a Document or ShadowRoot
return ((container.getRootNode(): any): Document | ShadowRoot);
Copy link
Member

Choose a reason for hiding this comment

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

@gnoff should we be using the getRootNode helper from above here? This is throwing a bunch of errors in internal classic component tests

gnoff added a commit that referenced this pull request Feb 10, 2023
I forgot to guard the `getRootNode` call in #26106 and it fails in IE8
and old jsdom. I consolidated the implementation a bit and removed the
unguarded call
github-actions bot pushed a commit that referenced this pull request Feb 10, 2023
I forgot to guard the `getRootNode` call in #26106 and it fails in IE8
and old jsdom. I consolidated the implementation a bit and removed the
unguarded call

DiffTrain build for [64acd39](64acd39)
[View git log for this commit](https://github.com/facebook/react/commits/64acd3918a26d92773d3dd451a735603ef50d3a7)
@rkurbatov
Copy link

Wow. Some magic as usual :-P

facebook-github-bot pushed a commit to facebook/react-native that referenced this pull request Feb 15, 2023
Summary:
This sync includes the following changes:
- **[86c8c8db7](facebook/react@86c8c8db7 )**: test: Don't retry flushActWork if flushUntilNextPaint threw ([#26121](facebook/react#26121)) //<Sebastian Silbermann>//
- **[64acd3918](facebook/react@64acd3918 )**: remove unguarded getRootNode call ([#26152](facebook/react#26152)) //<Josh Story>//
- **[71cace4d3](facebook/react@71cace4d3 )**: Migrate testRunner from jasmine2 to jest-circus ([#26144](facebook/react#26144)) //<Ming Ye>//
- **[c8510227c](facebook/react@c8510227c )**: Treat displayName as undefined ([#26148](facebook/react#26148)) //<Sebastian Markbåge>//
- **[55542bc73](facebook/react@55542bc73 )**: Update jest printBasicPrototype config ([#26142](facebook/react#26142)) //<Ming Ye>//
- **[6396b6641](facebook/react@6396b6641 )**: Model Float on Hoistables semantics ([#26106](facebook/react#26106)) //<Josh Story>//
- **[ef9f6e77b](facebook/react@ef9f6e77b )**: Enable passing Server References from Server to Client ([#26124](facebook/react#26124)) //<Sebastian Markbåge>//
- **[35698311d](facebook/react@35698311d )**: Update jest escapeString config ([#26140](facebook/react#26140)) //<Ming Ye>//
- **[6ddcbd4f9](facebook/react@6ddcbd4f9 )**: [flow] enable LTI inference mode ([#26104](facebook/react#26104)) //<Jan Kassens>//
- **[53b1f69ba](facebook/react@53b1f69ba )**: Implement unstable_getBoundingClientRect in RN Fabric refs ([#26137](facebook/react#26137)) //<Rubén Norte>//
- **[594093496](facebook/react@594093496 )**: Update to Jest 29 ([#26088](facebook/react#26088)) //<Ming Ye>//
- **[28fcae062](facebook/react@28fcae062 )**: Add support for SVG `transformOrigin` prop ([#26130](facebook/react#26130)) //<Aravind D>//
- **[3ff1540e9](facebook/react@3ff1540e9 )**: Prefer JSX in ReactNoop assertions (to combat out-of-memory test runs) ([#26127](facebook/react#26127)) //<Sebastian Silbermann>//
- **[01a0c4e12](facebook/react@01a0c4e12 )**: Add Edge Server Builds for workerd / edge-light ([#26116](facebook/react#26116)) //<Sebastian Markbåge>//
- **[f0cf832e1](facebook/react@f0cf832e1 )**: Update Flight Fixture to "use client" instead of .client.js ([#26118](facebook/react#26118)) //<Sebastian Markbåge>//
- **[03a216070](facebook/react@03a216070 )**: Rename "dom" fork to "dom-node" and "bun" fork to "dom-bun" ([#26117](facebook/react#26117)) //<Sebastian Markbåge>//
- **[4bf2113a1](facebook/react@4bf2113a1 )**: Revert "Move the Webpack manifest config to one level deeper ([#26083](facebook/react#26083))"  ([#26111](facebook/react#26111)) //<Sebastian Markbåge>//
- **[2ef24145e](facebook/react@2ef24145e )**: [flow] upgrade to 0.199.0 ([#26096](facebook/react#26096)) //<Jan Kassens>//
- **[922dd7ba5](facebook/react@922dd7ba5 )**: Revert the outer module object to an object ([#26093](facebook/react#26093)) //<Sebastian Markbåge>//
- **[9d111ffdf](facebook/react@9d111ffdf )**: Serialize Promises through Flight ([#26086](facebook/react#26086)) //<Sebastian Markbåge>//
- **[0ba4698c7](facebook/react@0ba4698c7 )**: Fix async test in React reconciler ([#26087](facebook/react#26087)) //<Ming Ye>//
- **[8c234c0de](facebook/react@8c234c0de )**: Move the Webpack manifest config to one level deeper ([#26083](facebook/react#26083)) //<Sebastian Markbåge>//
- **[977bccd24](facebook/react@977bccd24 )**: Refactor Flight Encoding ([#26082](facebook/react#26082)) //<Sebastian Markbåge>//
- **[d7bb524ad](facebook/react@d7bb524ad )**: [cleanup] Remove unused package jest-mock-scheduler ([#26084](facebook/react#26084)) //<Ming Ye>//
- **[6b3083266](facebook/react@6b3083266 )**: Upgrade prettier ([#26081](facebook/react#26081)) //<Jan Kassens>//
- **[1f5ce59dd](facebook/react@1f5ce59dd )**: [cleanup] fully roll out warnAboutSpreadingKeyToJSX ([#26080](facebook/react#26080)) //<Jan Kassens>//

Changelog:
[General][Changed] - React Native sync for revisions 48b687f...fccf3a9

jest_e2e[run_all_tests]

Reviewed By: rubennorte

Differential Revision: D43305607

fbshipit-source-id: 8da7567ca2a182f4be27788935c2da30a731f83b
OlimpiaZurek pushed a commit to OlimpiaZurek/react-native that referenced this pull request May 22, 2023
Summary:
This sync includes the following changes:
- **[86c8c8db7](facebook/react@86c8c8db7 )**: test: Don't retry flushActWork if flushUntilNextPaint threw ([facebook#26121](facebook/react#26121)) //<Sebastian Silbermann>//
- **[64acd3918](facebook/react@64acd3918 )**: remove unguarded getRootNode call ([facebook#26152](facebook/react#26152)) //<Josh Story>//
- **[71cace4d3](facebook/react@71cace4d3 )**: Migrate testRunner from jasmine2 to jest-circus ([facebook#26144](facebook/react#26144)) //<Ming Ye>//
- **[c8510227c](facebook/react@c8510227c )**: Treat displayName as undefined ([facebook#26148](facebook/react#26148)) //<Sebastian Markbåge>//
- **[55542bc73](facebook/react@55542bc73 )**: Update jest printBasicPrototype config ([facebook#26142](facebook/react#26142)) //<Ming Ye>//
- **[6396b6641](facebook/react@6396b6641 )**: Model Float on Hoistables semantics ([facebook#26106](facebook/react#26106)) //<Josh Story>//
- **[ef9f6e77b](facebook/react@ef9f6e77b )**: Enable passing Server References from Server to Client ([facebook#26124](facebook/react#26124)) //<Sebastian Markbåge>//
- **[35698311d](facebook/react@35698311d )**: Update jest escapeString config ([facebook#26140](facebook/react#26140)) //<Ming Ye>//
- **[6ddcbd4f9](facebook/react@6ddcbd4f9 )**: [flow] enable LTI inference mode ([facebook#26104](facebook/react#26104)) //<Jan Kassens>//
- **[53b1f69ba](facebook/react@53b1f69ba )**: Implement unstable_getBoundingClientRect in RN Fabric refs ([facebook#26137](facebook/react#26137)) //<Rubén Norte>//
- **[594093496](facebook/react@594093496 )**: Update to Jest 29 ([facebook#26088](facebook/react#26088)) //<Ming Ye>//
- **[28fcae062](facebook/react@28fcae062 )**: Add support for SVG `transformOrigin` prop ([facebook#26130](facebook/react#26130)) //<Aravind D>//
- **[3ff1540e9](facebook/react@3ff1540e9 )**: Prefer JSX in ReactNoop assertions (to combat out-of-memory test runs) ([facebook#26127](facebook/react#26127)) //<Sebastian Silbermann>//
- **[01a0c4e12](facebook/react@01a0c4e12 )**: Add Edge Server Builds for workerd / edge-light ([facebook#26116](facebook/react#26116)) //<Sebastian Markbåge>//
- **[f0cf832e1](facebook/react@f0cf832e1 )**: Update Flight Fixture to "use client" instead of .client.js ([facebook#26118](facebook/react#26118)) //<Sebastian Markbåge>//
- **[03a216070](facebook/react@03a216070 )**: Rename "dom" fork to "dom-node" and "bun" fork to "dom-bun" ([facebook#26117](facebook/react#26117)) //<Sebastian Markbåge>//
- **[4bf2113a1](facebook/react@4bf2113a1 )**: Revert "Move the Webpack manifest config to one level deeper ([facebook#26083](facebook/react#26083))"  ([facebook#26111](facebook/react#26111)) //<Sebastian Markbåge>//
- **[2ef24145e](facebook/react@2ef24145e )**: [flow] upgrade to 0.199.0 ([facebook#26096](facebook/react#26096)) //<Jan Kassens>//
- **[922dd7ba5](facebook/react@922dd7ba5 )**: Revert the outer module object to an object ([facebook#26093](facebook/react#26093)) //<Sebastian Markbåge>//
- **[9d111ffdf](facebook/react@9d111ffdf )**: Serialize Promises through Flight ([facebook#26086](facebook/react#26086)) //<Sebastian Markbåge>//
- **[0ba4698c7](facebook/react@0ba4698c7 )**: Fix async test in React reconciler ([facebook#26087](facebook/react#26087)) //<Ming Ye>//
- **[8c234c0de](facebook/react@8c234c0de )**: Move the Webpack manifest config to one level deeper ([facebook#26083](facebook/react#26083)) //<Sebastian Markbåge>//
- **[977bccd24](facebook/react@977bccd24 )**: Refactor Flight Encoding ([facebook#26082](facebook/react#26082)) //<Sebastian Markbåge>//
- **[d7bb524ad](facebook/react@d7bb524ad )**: [cleanup] Remove unused package jest-mock-scheduler ([facebook#26084](facebook/react#26084)) //<Ming Ye>//
- **[6b3083266](facebook/react@6b3083266 )**: Upgrade prettier ([facebook#26081](facebook/react#26081)) //<Jan Kassens>//
- **[1f5ce59dd](facebook/react@1f5ce59dd )**: [cleanup] fully roll out warnAboutSpreadingKeyToJSX ([facebook#26080](facebook/react#26080)) //<Jan Kassens>//

Changelog:
[General][Changed] - React Native sync for revisions 48b687f...fccf3a9

jest_e2e[run_all_tests]

Reviewed By: rubennorte

Differential Revision: D43305607

fbshipit-source-id: 8da7567ca2a182f4be27788935c2da30a731f83b
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.

6 participants