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] Fork Fizz instruction set for inline script and external runtime #25862

Merged
merged 1 commit into from
Jan 6, 2023

Conversation

mofeiZ
Copy link
Contributor

@mofeiZ mofeiZ commented Dec 9, 2022

[Fizz] Duplicate completeBoundaryWithStyles to not reference globals

Summary

Follow-up / cleanup PR to #25437

  • completeBoundaryWithStylesInlineLocals is used by the Fizz external runtime, which bundles together all Fizz instruction functions (and is able to reference / rename completeBoundary and resourceMap as locals).
  • completeBoundaryWithStylesInlineGlobals is used by the Fizz inline script writer, which sends Fizz instruction functions on an as-needed basis. This version needs to reference completeBoundary($RC) and resourceMap($RM) as globals.

Ideally, Closure would take care of inlining a shared implementation, but I couldn't figure out a zero-overhead inline due to lack of an @inline compiler directive. It seems that Closure thinks that a shared completeBoundaryWithStyles is too large and will always keep it as a separate function. I've also tried currying / writing a higher order function (getCompleteBoundaryWithStyles) with no luck

How did you test this change?

  • generated Fizz inline instructions should be unchanged
  • bundle size for unstable_external_runtime should be slightly smaller (due to lack of globals)
  • ReactDOMFizzServer-test.js and ReactDOMFloat-test.js should be unaffected

@facebook-github-bot facebook-github-bot added CLA Signed React Core Team Opened by a member of the React Core Team labels Dec 9, 2022
@sizebot
Copy link

sizebot commented Dec 9, 2022

Comparing: b14d7fa...00e5dad

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.37 kB 154.37 kB = 48.97 kB 48.97 kB
oss-experimental/react-dom/cjs/react-dom.production.min.js = 156.29 kB 156.29 kB = 49.63 kB 49.63 kB
facebook-www/ReactDOM-prod.classic.js = 533.12 kB 533.12 kB = 94.96 kB 94.96 kB
facebook-www/ReactDOM-prod.modern.js = 518.22 kB 518.22 kB = 92.76 kB 92.76 kB
facebook-www/ReactDOMForked-prod.classic.js = 533.12 kB 533.12 kB = 94.96 kB 94.96 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 = 2.51 kB 2.46 kB = 1.14 kB 1.12 kB
oss-stable-semver/react-dom/unstable_server-external-runtime.js = 2.51 kB 2.46 kB = 1.14 kB 1.12 kB
oss-stable/react-dom/unstable_server-external-runtime.js = 2.51 kB 2.46 kB = 1.14 kB 1.12 kB

Generated by 🚫 dangerJS against 00e5dad

const thisDocument = document;
let lastResource, node;

// Seed the precedence list with existing resources
Copy link
Collaborator

Choose a reason for hiding this comment

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

Did you try extracting smaller parts of the function out into a shared function? My guess is if you extract everything between lines 67-140 into a separate function, Closure would be able to inline it.

Copy link
Contributor Author

@mofeiZ mofeiZ Dec 9, 2022

Choose a reason for hiding this comment

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

Did you try extracting smaller parts of the function out into a shared function? My guess is if you extract everything between lines 67-140 into a separate function, Closure would be able to inline it.

@acdlite Yep I tried extracting just those lines (with no luck). I played around with compiling some much smaller functions, and it looks like Closure does inline small ones (so it's not that Closure decides to not inline accesses to globals or something).

function completeBoundaryWithStylesShared(
  resourceMap,
  dependencies,
  styles,
) {
  // ...
}

export function completeBoundaryWithStylesInlineGlobals(
  suspenseBoundaryID,
  contentID,
  styles,
) {
  const completeBoundaryImpl = window['$RC'];
  const resourceMap = window['$RM'];
  const dependencies = [];

  completeBoundaryWithStylesShared(resourceMap, dependencies, styles);

  Promise.all(dependencies).then(
    completeBoundaryImpl.bind(null, suspenseBoundaryID, contentID, ''),
    completeBoundaryImpl.bind(
      null,
      suspenseBoundaryID,
      contentID,
      'Resource failed to load',
    ),
  );
}

I'm not sure how maintainable it is to try to find "at which point" Closure stops inlining functions. The code duplication does feel silly -- an alternative would be to use rollup's replace, or even import from a forked module. However these feel quite heavy handed (and fragile, since this would need to be added in build.js, generate-inline-fizz-runtime.js, and fizzTestUtils.js.)
e.g.

let completeBoundaryImpl;
if (COMPILING_INLINE_JS) {
  completeBoundaryImpl = window['$RC'];
} else {
  completeBoundaryImpl = completeBoundary;
}

Copy link
Contributor Author

@mofeiZ mofeiZ Dec 9, 2022

Choose a reason for hiding this comment

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

It feels extra silly, since Closure will actually inline the variables correctly! 😅

function completeBoundaryWithStylesShared(
  completeBoundaryImpl,
  resourceMaps,
  suspenseBoundaryID,
  contentID,
  styles,
) {
  ...
}
window['$RR'] = function (
  suspenseBoundaryID,
  contentID,
  styles,
) {
  completeBoundaryWithStylesShared(
    window['$RC'],
    window['$RM'],
    suspenseBoundaryID,
    contentID,
    styles,
  );
}

gets compiled to this. Notice that the first two parameters (completeBoundaryImpl and resourceMaps) get inlined, but this useless wrapper function is still kept around.

function w(g,h,n){...} $RR=function(g,h,n){w(g,h,n)};

Copy link
Collaborator

Choose a reason for hiding this comment

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

Hmm my guess is that its not size alone, because there are some really large functions in the reconciler that Closure manages to inline.

How about if you move the non-shared function wrappers out of ReactDOMFizzInstructionSet.js and into the runtime module that imports it? Then, from Closure's perspective, it will only see a single call of the shared function. Because the other call is in the other runtime.

Copy link
Contributor Author

@mofeiZ mofeiZ Dec 9, 2022

Choose a reason for hiding this comment

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

I've tried this as well (and more drastically, only exporting the version referencing globals + only defining the shared function), with no luck. 😟

Also tried running this through rollup + closure

Copy link
Collaborator

Choose a reason for hiding this comment

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

That's surprising, huh

@mofeiZ mofeiZ marked this pull request as ready for review December 9, 2022 21:00
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.

This seems fine to me, unless @sebmarkbage or @gnoff have an alternate approach to suggest. I'm surprised running Closure on it doesn't just work if you extract out a shared function, but don't have any ideas (tried in the online playground and it doesn't work there, either).

@acdlite
Copy link
Collaborator

acdlite commented Dec 10, 2022

Thought of an idea. Maybe you could import the dependencies from a separate file, like this:

export const completeBoundaryImpl = window['$RC'];
export const resourceMap = window['$RM'];
import {completeBoundaryImpl, resourceMap} from './FizzRuntimeConfig';

Then in the Rollup config, you can override what the FizzRuntimeConfig module resolves to. That's the approach we use for the reconciler's host config — the host specific functions (i.e. DOM versus RN) get statically "injected" at build time.

Basically the same as your idea to use the replace plugin, but uses the module system instead of a string replace.

@gnoff
Copy link
Collaborator

gnoff commented Dec 16, 2022

I think the rollup option or forking makes sense. I'd prefer we not duplicate each function if we can avoid it

@gnoff
Copy link
Collaborator

gnoff commented Dec 16, 2022

It's too bad closure's @define syntax doesn't work with modules since they almost just support this out of the box but alas I don't think it will work for our situation

@gnoff
Copy link
Collaborator

gnoff commented Dec 16, 2022

@mofeiZ I'm working on some changes to renderIntoContainer that I think will require more substantial differences between the external and inline fizz runtimes.

https://github.com/facebook/react/pull/25703/files#diff-4715de966d011bb2b3e8982838a4ff0eaf93a8d877e6214102ad8bb24250fbf4R2627-R2636

If you take a look at these lines from this commit I am embedding the bootstrap scripts in a template element when using inline mode when there are also stylesheets to inject.

For external mode I was hoping to just embed the scripts directly as a child of the template that encodes the completion instruction.

The challenge is the completeContainer method that eventually is called after styles have either loaded or errored needs to relocate the bootstrap scripts from their template parent and into the body. However the way we locate the template in the DOM will be different depending on the mode you are in.

If you were able to get an implementation working that allowed us to have divergent behavior between each runtime I think that would be valuable

@mofeiZ mofeiZ force-pushed the fizz-external-runtime-dup-instrs branch from 00e5dad to 0227b77 Compare January 5, 2023 17:32
@mofeiZ
Copy link
Contributor Author

mofeiZ commented Jan 5, 2023

Inline scripts and external runtime may require divergent implementations (or hand optimizations for code size). Since we do not need a bundle time fork, I split this to two differently named modules.

  • ReactDOMFizzInstructionSetInlineSource is used only by yarn generate-fizz-runtime
  • ReactDOMFizzInstructionSetExternalRuntime is used only by ReactDOMServerExternalRuntime

@mofeiZ
Copy link
Contributor Author

mofeiZ commented Jan 5, 2023

@gnoff Would love any feedback on this - happy to make changes as needed

(I think ci/circleci: sizebot is failing due to credentials and yarn flow dom is failing to upstream/main issues)

@mofeiZ mofeiZ changed the title [Fizz] Duplicate completeBoundaryWithStyles to not reference globals [Fizz] Fork Fizz instruction set for inline script and external runtime Jan 5, 2023
Copy link
Collaborator

@gnoff gnoff left a comment

Choose a reason for hiding this comment

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

Works for me! I do think in the future we may want feature flags to be usable in these and perhaps then a rollup option will make sense. That said given the fact that the implementations can now be completely distinct we can potentially optimize them independently in a way that is nicer. More and more I suspect there will be divergence so seems reasonable we would just fork the entire thing like you did here

@gnoff
Copy link
Collaborator

gnoff commented Jan 6, 2023

a rebase will probably take care of the flow issue. seems fixed on main

Inline scripts and external runtime may require divergent implementations (or
hand optimizations for code size). Since we do not need a bundle time fork, I
split this to two different modules.
@mofeiZ mofeiZ force-pushed the fizz-external-runtime-dup-instrs branch from 0227b77 to 3feb3cd Compare January 6, 2023 18:21
@mofeiZ
Copy link
Contributor Author

mofeiZ commented Jan 6, 2023

Manually ran yarn build to confirm other bundles did not change + external runtime became smaller

@mofeiZ mofeiZ merged commit 0b97441 into facebook:main Jan 6, 2023
@mofeiZ mofeiZ deleted the fizz-external-runtime-dup-instrs branch January 6, 2023 19:29
github-actions bot pushed a commit that referenced this pull request Jan 6, 2023
…me (#25862)

~~[Fizz] Duplicate completeBoundaryWithStyles to not reference globals~~

## Summary

Follow-up / cleanup PR to #25437

- `completeBoundaryWithStylesInlineLocals` is used by the Fizz external
runtime, which bundles together all Fizz instruction functions (and is
able to reference / rename `completeBoundary` and `resourceMap` as
locals).
- `completeBoundaryWithStylesInlineGlobals` is used by the Fizz inline
script writer, which sends Fizz instruction functions on an as-needed
basis. This version needs to reference `completeBoundary($RC)` and
`resourceMap($RM)` as globals.

Ideally, Closure would take care of inlining a shared implementation,
but I couldn't figure out a zero-overhead inline due to lack of an
`@inline` compiler directive. It seems that Closure thinks that a shared
`completeBoundaryWithStyles` is too large and will always keep it as a
separate function. I've also tried currying / writing a higher order
function (`getCompleteBoundaryWithStyles`) with no luck

## How did you test this change?
- generated Fizz inline instructions should be unchanged
- bundle size for unstable_external_runtime should be slightly smaller
(due to lack of globals)
- `ReactDOMFizzServer-test.js` and `ReactDOMFloat-test.js` should be
unaffected

DiffTrain build for [0b97441](0b97441)
[View git log for this commit](https://github.com/facebook/react/commits/0b974418c9a56f6c560298560265dcf4b65784bc)
facebook-github-bot pushed a commit to facebook/react-native that referenced this pull request Jan 31, 2023
Summary:
This sync includes the following changes:
- **[48b687fc9](facebook/react@48b687fc9 )**: [trusted types][www] Add enableTrustedTypesIntegration flag back in ([#26016](facebook/react#26016)) //<an onion>//
- **[9b1423cc0](facebook/react@9b1423cc0 )**: Revert "Hold host functions in var" ([#26079](facebook/react#26079)) //<Samuel Susla>//
- **[ce09ace9a](facebook/react@ce09ace9a )**: Improve Error Messages when Access Client References ([#26059](facebook/react#26059)) //<Sebastian Markbåge>//
- **[0652bdbd1](facebook/react@0652bdbd1 )**: Add flow types to Maps in ReactNativeViewConfigRegistry.js ([#26064](facebook/react#26064)) //<Samuel Susla>//
- **[ee8509801](facebook/react@ee8509801 )**: [cleanup] remove deletedTreeCleanUpLevel feature flag ([#25529](facebook/react#25529)) //<Jan Kassens>//
- **[0e31dd028](facebook/react@0e31dd028 )**: Remove findDOMNode www shim ([#25998](facebook/react#25998)) //<Jan Kassens>//
- **[379dd741e](facebook/react@379dd741e )**: [www] set enableTrustedTypesIntegration to false ([#25997](facebook/react#25997)) //<Jan Kassens>//
- **[555ece0cd](facebook/react@555ece0cd )**: Don't warn about concurrently rendering contexts if we finished rendering ([#22797](facebook/react#22797)) //<Sebastian Silbermann>//
- **[0fce6bb49](facebook/react@0fce6bb49 )**: [cleanup] remove feature flags warnAboutDefaultPropsOnFunctionComponents and warnAboutStringRefs ([#25980](facebook/react#25980)) //<Jan Kassens>//
- **[7002a6743](facebook/react@7002a6743 )**: [cleanup] remove unused values from ReactFeatureFlags.www-dynamic ([#25575](facebook/react#25575)) //<Jan Kassens>//
- **[a48e54f2b](facebook/react@a48e54f2b )**: [cleanup] remove old feature flag warnAboutDeprecatedLifecycles ([#25978](facebook/react#25978)) //<Jan Kassens>//
- **[0f4a83596](facebook/react@0f4a83596 )**: Remove duplicate JSResourceReferenceImpl mock ([#25976](facebook/react#25976)) //<Jan Kassens>//
- **[c49131669](facebook/react@c49131669 )**: Remove unused Flow suppressions ([#25977](facebook/react#25977)) //<Jan Kassens>//
- **[afe6521](facebook/react@afe6521e1 )**: Refactor: remove useless parameter ([#25923](facebook/react#25923)) //<Chris>//
- **[34464fb16](facebook/react@34464fb16 )**: Upgrade to Flow 0.196.3 ([#25974](facebook/react#25974)) //<Jan Kassens>//
- **[e2424f33b](facebook/react@e2424f33b )**: [flow] enable exact_empty_objects ([#25973](facebook/react#25973)) //<Jan Kassens>//
- **[0b4f44302](facebook/react@0b4f44302 )**: [flow] enable enforce_local_inference_annotations ([#25921](facebook/react#25921)) //<Jan Kassens>//
- **[0b974418c](facebook/react@0b974418c )**: [Fizz] Fork Fizz instruction set for inline script and external runtime ([#25862](facebook/react#25862)) //<mofeiZ>//
- **[5379b6123](facebook/react@5379b6123 )**: Batch sync, default and continuous lanes ([#25700](facebook/react#25700)) //<Tianyu Yao>//
- **[bbf4d2211](facebook/react@bbf4d2211 )**: Update import for babel-code-frame in build script ([#25963](facebook/react#25963)) //<Ming Ye>//
- **[b83baf63f](facebook/react@b83baf63f )**: Transform updates to support Flow this annotation syntax ([#25918](facebook/react#25918)) //<Jan Kassens>//
- **[c2d655207](facebook/react@c2d655207 )**: Unify `use` and `renderDidSuspendDelayIfPossible` implementations ([#25922](facebook/react#25922)) //<Andrew Clark>//
- **[48274a43a](facebook/react@48274a43a )**: Remove vestigial Suspense batching logic ([#25861](facebook/react#25861)) //<Andrew Clark>//
- **[de7d1c907](facebook/react@de7d1c907 )**: Add `fetchPriority` to `<img>` and `<link>` ([#25927](facebook/react#25927)) //<Steven>//
- **[81d4ee9ca](facebook/react@81d4ee9ca )**: reconciler docs: fix small typo - "mode" (instead of "node") ([#25863](facebook/react#25863)) //<satelllte>//
- **[5fcf1a4b4](facebook/react@5fcf1a4b4 )**: Bugfix: Synchronous ping during render phase sometimes unwinds the stack, leading to crash ([#25851](facebook/react#25851)) //<Andrew Clark>//
- **[2b1fb91a5](facebook/react@2b1fb91a5 )**: ESLint upgrade to use hermes-eslint ([#25915](facebook/react#25915)) //<Jan Kassens>//
- **[fabef7a6b](facebook/react@fabef7a6b )**: Resubmit Add HydrationSyncLane ([#25878](facebook/react#25878)) //<Tianyu Yao>//
- **[7efa9e597](facebook/react@7efa9e597 )**: Fix unwinding context during selective hydration ([#25876](facebook/react#25876)) //<Tianyu Yao>//
- **[84a0a171e](facebook/react@84a0a171e )**: Rename experimental useEvent to useEffectEvent ([#25881](facebook/react#25881)) //<Sebastian Markbåge>//
- **[4dda96a40](facebook/react@4dda96a40 )**: [react-www] remove forked bundle ([#25866](facebook/react#25866)) //<Jan Kassens>//
- **[9c09c1cd6](facebook/react@9c09c1cd6 )**: Revert "Fork ReactDOMSharedInternals for www ([#25791](facebook/react#25791))" ([#25864](facebook/react#25864)) //<lauren>//
- **[996e4c0d5](facebook/react@996e4c0d5 )**: Offscreen add attach ([#25603](facebook/react#25603)) //<Samuel Susla>//
- **[b14d7fa4b](facebook/react@b14d7fa4b )**: Add support for setNativeProps to Fabric ([#25737](facebook/react#25737)) //<Samuel Susla>//
- **[819687279](facebook/react@819687279 )**: [Float] Fix typo in ReactDOMResourceValidation.js ([#25798](facebook/react#25798)) //<Ikko Ashimine>//
- **[5dfc485f6](facebook/react@5dfc485f6 )**: fix tests for when float is off ([#25839](facebook/react#25839)) //<Josh Story>//
- **[bfcbf3306](facebook/react@bfcbf3306 )**: toString children of title ([#25838](facebook/react#25838)) //<Sebastian Markbåge>//
- **[d4bc16a7d](facebook/react@d4bc16a7d )**: Revert "[react-www] remove forked bundle" ([#25837](facebook/react#25837)) //<Ricky>//
- **[d69b2cf82](facebook/react@d69b2cf82 )**: [bug fix] revert values in ReactFiberFlags to keep consistency for devtools ([#25832](facebook/react#25832)) //<Mengdi Chen>//
- **[645ae2686](facebook/react@645ae2686 )**: [react-www] remove forked bundle ([#25831](facebook/react#25831)) //<Jan Kassens>//
- **[d807eb52c](facebook/react@d807eb52c )**: Revert recent hydration changes ([#25812](facebook/react#25812)) //<Andrew Clark>//
- **[2ccfa657d](facebook/react@2ccfa657d )**: Fork ReactDOMSharedInternals for www ([#25791](facebook/react#25791)) //<lauren>//
- **[f0534ae94](facebook/react@f0534ae94 )**: Avoid replaying SelectiveHydrationException in dev ([#25754](facebook/react#25754)) //<Tianyu Yao>//
- **[7fab379d8](facebook/react@7fab379d8 )**: fix link to ReactDOMHostconfig in reconciler docs ([#25788](facebook/react#25788)) //<Dmitry>//
- **[500c8aa08](facebook/react@500c8aa08 )**: Add component name to StrictMode error message ([#25718](facebook/react#25718)) //<Samuel Susla>//
- **[353c30252](facebook/react@353c30252 )**: Hold host functions in var ([#25741](facebook/react#25741)) //<Samuel Susla>//

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

jest_e2e[run_all_tests]

Reviewed By: rubennorte

Differential Revision: D42855483

fbshipit-source-id: c244a595bb2d490a23b333c1b16d04a459ec94fc
OlimpiaZurek pushed a commit to OlimpiaZurek/react-native that referenced this pull request May 22, 2023
Summary:
This sync includes the following changes:
- **[48b687fc9](facebook/react@48b687fc9 )**: [trusted types][www] Add enableTrustedTypesIntegration flag back in ([facebook#26016](facebook/react#26016)) //<an onion>//
- **[9b1423cc0](facebook/react@9b1423cc0 )**: Revert "Hold host functions in var" ([facebook#26079](facebook/react#26079)) //<Samuel Susla>//
- **[ce09ace9a](facebook/react@ce09ace9a )**: Improve Error Messages when Access Client References ([facebook#26059](facebook/react#26059)) //<Sebastian Markbåge>//
- **[0652bdbd1](facebook/react@0652bdbd1 )**: Add flow types to Maps in ReactNativeViewConfigRegistry.js ([facebook#26064](facebook/react#26064)) //<Samuel Susla>//
- **[ee8509801](facebook/react@ee8509801 )**: [cleanup] remove deletedTreeCleanUpLevel feature flag ([facebook#25529](facebook/react#25529)) //<Jan Kassens>//
- **[0e31dd028](facebook/react@0e31dd028 )**: Remove findDOMNode www shim ([facebook#25998](facebook/react#25998)) //<Jan Kassens>//
- **[379dd741e](facebook/react@379dd741e )**: [www] set enableTrustedTypesIntegration to false ([facebook#25997](facebook/react#25997)) //<Jan Kassens>//
- **[555ece0cd](facebook/react@555ece0cd )**: Don't warn about concurrently rendering contexts if we finished rendering ([facebook#22797](facebook/react#22797)) //<Sebastian Silbermann>//
- **[0fce6bb49](facebook/react@0fce6bb49 )**: [cleanup] remove feature flags warnAboutDefaultPropsOnFunctionComponents and warnAboutStringRefs ([facebook#25980](facebook/react#25980)) //<Jan Kassens>//
- **[7002a6743](facebook/react@7002a6743 )**: [cleanup] remove unused values from ReactFeatureFlags.www-dynamic ([facebook#25575](facebook/react#25575)) //<Jan Kassens>//
- **[a48e54f2b](facebook/react@a48e54f2b )**: [cleanup] remove old feature flag warnAboutDeprecatedLifecycles ([facebook#25978](facebook/react#25978)) //<Jan Kassens>//
- **[0f4a83596](facebook/react@0f4a83596 )**: Remove duplicate JSResourceReferenceImpl mock ([facebook#25976](facebook/react#25976)) //<Jan Kassens>//
- **[c49131669](facebook/react@c49131669 )**: Remove unused Flow suppressions ([facebook#25977](facebook/react#25977)) //<Jan Kassens>//
- **[afe6521](facebook/react@afe6521e1 )**: Refactor: remove useless parameter ([facebook#25923](facebook/react#25923)) //<Chris>//
- **[34464fb16](facebook/react@34464fb16 )**: Upgrade to Flow 0.196.3 ([facebook#25974](facebook/react#25974)) //<Jan Kassens>//
- **[e2424f33b](facebook/react@e2424f33b )**: [flow] enable exact_empty_objects ([facebook#25973](facebook/react#25973)) //<Jan Kassens>//
- **[0b4f44302](facebook/react@0b4f44302 )**: [flow] enable enforce_local_inference_annotations ([facebook#25921](facebook/react#25921)) //<Jan Kassens>//
- **[0b974418c](facebook/react@0b974418c )**: [Fizz] Fork Fizz instruction set for inline script and external runtime ([facebook#25862](facebook/react#25862)) //<mofeiZ>//
- **[5379b6123](facebook/react@5379b6123 )**: Batch sync, default and continuous lanes ([facebook#25700](facebook/react#25700)) //<Tianyu Yao>//
- **[bbf4d2211](facebook/react@bbf4d2211 )**: Update import for babel-code-frame in build script ([facebook#25963](facebook/react#25963)) //<Ming Ye>//
- **[b83baf63f](facebook/react@b83baf63f )**: Transform updates to support Flow this annotation syntax ([facebook#25918](facebook/react#25918)) //<Jan Kassens>//
- **[c2d655207](facebook/react@c2d655207 )**: Unify `use` and `renderDidSuspendDelayIfPossible` implementations ([facebook#25922](facebook/react#25922)) //<Andrew Clark>//
- **[48274a43a](facebook/react@48274a43a )**: Remove vestigial Suspense batching logic ([facebook#25861](facebook/react#25861)) //<Andrew Clark>//
- **[de7d1c907](facebook/react@de7d1c907 )**: Add `fetchPriority` to `<img>` and `<link>` ([facebook#25927](facebook/react#25927)) //<Steven>//
- **[81d4ee9ca](facebook/react@81d4ee9ca )**: reconciler docs: fix small typo - "mode" (instead of "node") ([facebook#25863](facebook/react#25863)) //<satelllte>//
- **[5fcf1a4b4](facebook/react@5fcf1a4b4 )**: Bugfix: Synchronous ping during render phase sometimes unwinds the stack, leading to crash ([facebook#25851](facebook/react#25851)) //<Andrew Clark>//
- **[2b1fb91a5](facebook/react@2b1fb91a5 )**: ESLint upgrade to use hermes-eslint ([facebook#25915](facebook/react#25915)) //<Jan Kassens>//
- **[fabef7a6b](facebook/react@fabef7a6b )**: Resubmit Add HydrationSyncLane ([facebook#25878](facebook/react#25878)) //<Tianyu Yao>//
- **[7efa9e597](facebook/react@7efa9e597 )**: Fix unwinding context during selective hydration ([facebook#25876](facebook/react#25876)) //<Tianyu Yao>//
- **[84a0a171e](facebook/react@84a0a171e )**: Rename experimental useEvent to useEffectEvent ([facebook#25881](facebook/react#25881)) //<Sebastian Markbåge>//
- **[4dda96a40](facebook/react@4dda96a40 )**: [react-www] remove forked bundle ([facebook#25866](facebook/react#25866)) //<Jan Kassens>//
- **[9c09c1cd6](facebook/react@9c09c1cd6 )**: Revert "Fork ReactDOMSharedInternals for www ([facebook#25791](facebook/react#25791))" ([facebook#25864](facebook/react#25864)) //<lauren>//
- **[996e4c0d5](facebook/react@996e4c0d5 )**: Offscreen add attach ([facebook#25603](facebook/react#25603)) //<Samuel Susla>//
- **[b14d7fa4b](facebook/react@b14d7fa4b )**: Add support for setNativeProps to Fabric ([facebook#25737](facebook/react#25737)) //<Samuel Susla>//
- **[819687279](facebook/react@819687279 )**: [Float] Fix typo in ReactDOMResourceValidation.js ([facebook#25798](facebook/react#25798)) //<Ikko Ashimine>//
- **[5dfc485f6](facebook/react@5dfc485f6 )**: fix tests for when float is off ([facebook#25839](facebook/react#25839)) //<Josh Story>//
- **[bfcbf3306](facebook/react@bfcbf3306 )**: toString children of title ([facebook#25838](facebook/react#25838)) //<Sebastian Markbåge>//
- **[d4bc16a7d](facebook/react@d4bc16a7d )**: Revert "[react-www] remove forked bundle" ([facebook#25837](facebook/react#25837)) //<Ricky>//
- **[d69b2cf82](facebook/react@d69b2cf82 )**: [bug fix] revert values in ReactFiberFlags to keep consistency for devtools ([facebook#25832](facebook/react#25832)) //<Mengdi Chen>//
- **[645ae2686](facebook/react@645ae2686 )**: [react-www] remove forked bundle ([facebook#25831](facebook/react#25831)) //<Jan Kassens>//
- **[d807eb52c](facebook/react@d807eb52c )**: Revert recent hydration changes ([facebook#25812](facebook/react#25812)) //<Andrew Clark>//
- **[2ccfa657d](facebook/react@2ccfa657d )**: Fork ReactDOMSharedInternals for www ([facebook#25791](facebook/react#25791)) //<lauren>//
- **[f0534ae94](facebook/react@f0534ae94 )**: Avoid replaying SelectiveHydrationException in dev ([facebook#25754](facebook/react#25754)) //<Tianyu Yao>//
- **[7fab379d8](facebook/react@7fab379d8 )**: fix link to ReactDOMHostconfig in reconciler docs ([facebook#25788](facebook/react#25788)) //<Dmitry>//
- **[500c8aa08](facebook/react@500c8aa08 )**: Add component name to StrictMode error message ([facebook#25718](facebook/react#25718)) //<Samuel Susla>//
- **[353c30252](facebook/react@353c30252 )**: Hold host functions in var ([facebook#25741](facebook/react#25741)) //<Samuel Susla>//

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

jest_e2e[run_all_tests]

Reviewed By: rubennorte

Differential Revision: D42855483

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

5 participants