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

Add end-of-frame scheduling for default events #24594

Closed
wants to merge 2 commits into from

Conversation

rickhanlonii
Copy link
Member

@rickhanlonii rickhanlonii commented May 22, 2022

Overview

This PR schedules a second task for default updates at the end of the frame when we cannot determine the priority of the originating event. These updates include things like IntersectionObserver, ResizeObserver, setTimeout, or any other event where window.event is undefined.

These updates are flushed inside requestAnimationFrame in addition to the task, so that updates scheduled inside of things like ResizeObservers have an opportunity to flush before the next repaint. We'll use whichever task fires first.

TODO Incomplete

  • If rAF is already scheduled, use that and cancel the task.
  • Confirm that the added tests are the expected behavior
  • Manually test in a real browser environment
  • Document supportsAnimationFrame, scheduleAnimationFrame, and cancelAnimationFrame
  • Rework to not use a lane
  • Rework to set a fiber flag
  • Don't cancel scheduled rAFs
  • Fix types
  • Review TODOs

TODO Questions

  • What priority should we use for root.render or hydrateRoot?
    • Same as setState (in a rAF or task, whichever is first)
  • How should we mock/test requestAnimationFrame (it doesn't flush with timers in jsdom)?
    • For now, use a manual mock and flush in internalAct.
  • Should ReactNoopRenderer include a rAF mock?
    • No, only DOM tests should test the frame-end task.
  • Is the HostConfig the right place for scheduleAnimationFrame like schedulePostTask
    • Yes.

@facebook-github-bot facebook-github-bot added CLA Signed React Core Team Opened by a member of the React Core Team labels May 22, 2022
@acdlite
Copy link
Collaborator

acdlite commented May 23, 2022

What priority should we use for root.render or hydrateRoot?

It's the same as any other setState. Shouldn't need to do anything special.

How should we mock/test requestAnimationFrame (it doesn't flush with timers in jsdom)?

Don't need to for our tests unless we're testing the behavior of React DOM specifically. In the open source build, people will either use act which bypasses it completely, or write e2e tests that do whatever the browser does.

Should ReactNoopRenderer include a rAF mock?

Nah I can't think of any reason why it should

Is the HostConfig the right place for scheduleAnimationFrame like schedulePostTask

Sounds right to me, that's where scheduleMicrotask already is

Do we want to feature flag all added UnknownLane code, or just where we set the priority?

The only place in the reconciler where there should be a fork in behavior is in ensureRootIsScheduled. See: #24594 (comment).

Are there more tests we should write for this behavior?

The main ones I can think of are

  • Unknown update followed by default update is batched, scheduled with rAF
  • Default update followed by unknown update is batched, scheduled with rAF
  • When allowConcurrentByDefault is enabled, unknown updates should be time sliced

@rickhanlonii
Copy link
Member Author

Thanks for all the answers @acdlite!

don't think we should add a new lane.

My bad, I must have misheard that we wanted a separate lane. I'll switch this to a FiberRoot flag 👍

It's the same as any other setState. Shouldn't need to do anything special.

When render is called window.event can be undefined, so should these updates be scheduled in a rAF when that happens?

@acdlite
Copy link
Collaborator

acdlite commented May 23, 2022

When render is called window.event can be undefined, so should these updates be scheduled in a rAF when that happens?

Yeah I think so

@rickhanlonii rickhanlonii changed the title [WIP] Add UnknownLane and flush unknown updates in a rAF [WIP] Add end-of-frame scheduling for default events May 24, 2022
@sizebot
Copy link

sizebot commented May 26, 2022

Comparing: 8186b19...7d03b23

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 +0.16% 131.76 kB 131.97 kB +0.20% 42.31 kB 42.39 kB
oss-experimental/react-dom/cjs/react-dom.production.min.js +0.73% 137.03 kB 138.04 kB +0.66% 43.90 kB 44.19 kB
facebook-www/ReactDOM-prod.classic.js +0.79% 441.08 kB 444.58 kB +0.80% 80.68 kB 81.33 kB
facebook-www/ReactDOM-prod.modern.js +0.82% 426.39 kB 429.89 kB +0.85% 78.49 kB 79.15 kB
facebook-www/ReactDOMForked-prod.classic.js +0.79% 441.79 kB 445.29 kB +0.80% 80.90 kB 81.55 kB
oss-experimental/jest-react/cjs/jest-react.production.min.js +7.22% 2.35 kB 2.52 kB +3.24% 1.14 kB 1.18 kB
oss-stable-semver/jest-react/cjs/jest-react.production.min.js +7.22% 2.35 kB 2.52 kB +3.24% 1.14 kB 1.18 kB
oss-stable/jest-react/cjs/jest-react.production.min.js +7.22% 2.35 kB 2.52 kB +3.24% 1.14 kB 1.18 kB
oss-experimental/jest-react/cjs/jest-react.development.js +2.84% 9.93 kB 10.21 kB +1.48% 3.46 kB 3.51 kB
oss-stable-semver/jest-react/cjs/jest-react.development.js +2.84% 9.93 kB 10.21 kB +1.48% 3.46 kB 3.51 kB
oss-stable/jest-react/cjs/jest-react.development.js +2.84% 9.93 kB 10.21 kB +1.48% 3.46 kB 3.51 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name +/- Base Current +/- gzip Base gzip Current gzip
oss-experimental/jest-react/cjs/jest-react.production.min.js +7.22% 2.35 kB 2.52 kB +3.24% 1.14 kB 1.18 kB
oss-stable-semver/jest-react/cjs/jest-react.production.min.js +7.22% 2.35 kB 2.52 kB +3.24% 1.14 kB 1.18 kB
oss-stable/jest-react/cjs/jest-react.production.min.js +7.22% 2.35 kB 2.52 kB +3.24% 1.14 kB 1.18 kB
oss-experimental/jest-react/cjs/jest-react.development.js +2.84% 9.93 kB 10.21 kB +1.48% 3.46 kB 3.51 kB
oss-stable-semver/jest-react/cjs/jest-react.development.js +2.84% 9.93 kB 10.21 kB +1.48% 3.46 kB 3.51 kB
oss-stable/jest-react/cjs/jest-react.development.js +2.84% 9.93 kB 10.21 kB +1.48% 3.46 kB 3.51 kB
facebook-www/ReactDOM-prod.modern.js +0.82% 426.39 kB 429.89 kB +0.85% 78.49 kB 79.15 kB
facebook-www/ReactDOMForked-prod.modern.js +0.82% 427.11 kB 430.61 kB +0.85% 78.69 kB 79.36 kB
facebook-www/ReactDOM-prod.classic.js +0.79% 441.08 kB 444.58 kB +0.80% 80.68 kB 81.33 kB
facebook-www/ReactDOMForked-prod.classic.js +0.79% 441.79 kB 445.29 kB +0.80% 80.90 kB 81.55 kB
facebook-www/ReactDOM-profiling.modern.js +0.77% 457.14 kB 460.68 kB +0.77% 82.99 kB 83.63 kB
facebook-www/ReactDOMForked-profiling.modern.js +0.77% 457.87 kB 461.41 kB +0.80% 83.18 kB 83.84 kB
facebook-www/ReactIs-dev.modern.js +0.75% 9.98 kB 10.05 kB +0.50% 2.58 kB 2.59 kB
facebook-www/ReactIs-dev.classic.js +0.75% 9.98 kB 10.05 kB +0.46% 2.58 kB 2.59 kB
facebook-www/ReactDOM-profiling.classic.js +0.75% 471.90 kB 475.44 kB +0.78% 85.25 kB 85.91 kB
facebook-www/ReactDOMForked-profiling.classic.js +0.75% 472.61 kB 476.15 kB +0.77% 85.47 kB 86.13 kB
oss-experimental/react-dom/cjs/react-dom.production.min.js +0.73% 137.03 kB 138.04 kB +0.66% 43.90 kB 44.19 kB
oss-experimental/react-noop-renderer/cjs/react-noop-renderer.production.min.js +0.73% 12.34 kB 12.43 kB +0.73% 3.68 kB 3.71 kB
oss-stable-semver/react-noop-renderer/cjs/react-noop-renderer.production.min.js +0.73% 12.34 kB 12.43 kB +0.73% 3.68 kB 3.71 kB
oss-stable/react-noop-renderer/cjs/react-noop-renderer.production.min.js +0.73% 12.34 kB 12.43 kB +0.73% 3.68 kB 3.71 kB
oss-experimental/react-noop-renderer/cjs/react-noop-renderer-persistent.production.min.js +0.73% 12.41 kB 12.50 kB +0.70% 3.70 kB 3.73 kB
oss-stable-semver/react-noop-renderer/cjs/react-noop-renderer-persistent.production.min.js +0.73% 12.41 kB 12.50 kB +0.70% 3.70 kB 3.73 kB
oss-stable/react-noop-renderer/cjs/react-noop-renderer-persistent.production.min.js +0.73% 12.41 kB 12.50 kB +0.70% 3.70 kB 3.73 kB
oss-experimental/react-dom/cjs/react-dom-unstable_testing.production.min.js +0.71% 140.55 kB 141.55 kB +0.63% 45.39 kB 45.68 kB
oss-experimental/react-dom/cjs/react-dom.profiling.min.js +0.68% 146.46 kB 147.46 kB +0.61% 46.36 kB 46.64 kB
oss-experimental/react-dom/umd/react-dom.production.min.js +0.63% 137.08 kB 137.94 kB +0.68% 44.52 kB 44.82 kB
facebook-www/ReactART-prod.modern.js +0.62% 268.91 kB 270.57 kB +0.61% 48.00 kB 48.29 kB
facebook-www/ReactART-prod.classic.js +0.60% 279.73 kB 281.40 kB +0.60% 49.74 kB 50.04 kB
oss-experimental/react-dom/umd/react-dom.profiling.min.js +0.59% 145.79 kB 146.65 kB +0.75% 46.80 kB 47.15 kB
facebook-www/ReactFlightDOMRelayClient-dev.modern.js +0.58% 12.94 kB 13.01 kB +0.34% 3.80 kB 3.82 kB
facebook-www/ReactFlightDOMRelayClient-dev.classic.js +0.58% 12.94 kB 13.01 kB +0.37% 3.80 kB 3.82 kB
oss-experimental/react-reconciler/cjs/react-reconciler.production.min.js +0.53% 97.83 kB 98.35 kB +0.57% 30.06 kB 30.23 kB
facebook-www/ReactART-dev.modern.js +0.52% 764.25 kB 768.26 kB +0.43% 163.17 kB 163.87 kB
facebook-www/ReactART-dev.classic.js +0.52% 774.47 kB 778.48 kB +0.43% 165.30 kB 166.00 kB
facebook-react-native/react-test-renderer/cjs/ReactTestRenderer-prod.js +0.50% 258.58 kB 259.87 kB +0.41% 47.24 kB 47.43 kB
oss-experimental/react-reconciler/cjs/react-reconciler.profiling.min.js +0.49% 106.66 kB 107.18 kB +0.64% 32.29 kB 32.50 kB
facebook-www/ReactDOM-dev.modern.js +0.48% 1,133.14 kB 1,138.60 kB +0.42% 250.40 kB 251.44 kB
facebook-www/ReactDOMForked-dev.modern.js +0.48% 1,135.91 kB 1,141.37 kB +0.42% 251.41 kB 252.45 kB
facebook-www/ReactDOM-dev.classic.js +0.47% 1,156.65 kB 1,162.11 kB +0.41% 254.82 kB 255.87 kB
facebook-www/ReactDOMForked-dev.classic.js +0.47% 1,159.41 kB 1,164.88 kB +0.40% 255.85 kB 256.89 kB
facebook-react-native/react-test-renderer/cjs/ReactTestRenderer-profiling.js +0.47% 273.66 kB 274.94 kB +0.41% 49.50 kB 49.70 kB
oss-experimental/react-reconciler/cjs/react-reconciler.development.js +0.42% 774.22 kB 777.45 kB +0.33% 164.73 kB 165.26 kB
oss-experimental/react-dom/cjs/react-dom-unstable_testing.development.js +0.41% 1,038.74 kB 1,043.03 kB +0.34% 233.92 kB 234.73 kB
react-native/implementations/ReactFabric-prod.js +0.41% 287.99 kB 289.16 kB +0.41% 52.19 kB 52.40 kB
oss-experimental/react-dom/cjs/react-dom.development.js +0.41% 1,056.42 kB 1,060.71 kB +0.35% 236.45 kB 237.28 kB
oss-experimental/react-dom/umd/react-dom.development.js +0.40% 1,108.39 kB 1,112.80 kB +0.37% 239.03 kB 239.91 kB
react-native/implementations/ReactFabric-prod.fb.js +0.40% 296.07 kB 297.25 kB +0.39% 53.78 kB 53.99 kB
react-native/implementations/ReactFabric-profiling.js +0.38% 307.17 kB 308.35 kB +0.37% 55.42 kB 55.62 kB
react-native/implementations/ReactNativeRenderer-prod.js +0.38% 295.02 kB 296.14 kB +0.32% 53.31 kB 53.48 kB
react-native/implementations/ReactNativeRenderer-prod.fb.js +0.37% 303.15 kB 304.27 kB +0.33% 54.89 kB 55.07 kB
react-native/implementations/ReactFabric-profiling.fb.js +0.36% 323.18 kB 324.36 kB +0.33% 58.06 kB 58.25 kB
react-native/implementations/ReactNativeRenderer-profiling.js +0.36% 314.28 kB 315.40 kB +0.32% 56.43 kB 56.61 kB
react-native/implementations/ReactNativeRenderer-profiling.fb.js +0.34% 330.34 kB 331.46 kB +0.31% 59.11 kB 59.29 kB
oss-experimental/react-noop-renderer/cjs/react-noop-renderer.development.js +0.34% 34.45 kB 34.56 kB +0.34% 7.75 kB 7.78 kB
oss-stable-semver/react-noop-renderer/cjs/react-noop-renderer.development.js +0.34% 34.45 kB 34.56 kB +0.34% 7.75 kB 7.78 kB
oss-stable/react-noop-renderer/cjs/react-noop-renderer.development.js +0.34% 34.45 kB 34.56 kB +0.34% 7.75 kB 7.78 kB
oss-experimental/react-noop-renderer/cjs/react-noop-renderer-persistent.development.js +0.34% 34.58 kB 34.70 kB +0.32% 7.77 kB 7.80 kB
oss-stable-semver/react-noop-renderer/cjs/react-noop-renderer-persistent.development.js +0.34% 34.58 kB 34.70 kB +0.32% 7.77 kB 7.80 kB
oss-stable/react-noop-renderer/cjs/react-noop-renderer-persistent.development.js +0.34% 34.58 kB 34.70 kB +0.32% 7.77 kB 7.80 kB
facebook-www/ReactDOMTesting-prod.modern.js +0.33% 416.72 kB 418.09 kB +0.28% 78.35 kB 78.57 kB
facebook-www/ReactFreshRuntime-dev.modern.js +0.33% 22.93 kB 23.00 kB +0.18% 6.67 kB 6.68 kB
facebook-www/ReactFreshRuntime-dev.classic.js +0.33% 22.93 kB 23.00 kB +0.18% 6.67 kB 6.68 kB
facebook-www/ReactDOMTesting-prod.classic.js +0.31% 432.82 kB 434.18 kB +0.27% 80.79 kB 81.01 kB
oss-experimental/react-art/cjs/react-art.production.min.js +0.28% 86.65 kB 86.90 kB +0.56% 26.88 kB 27.03 kB
facebook-www/ReactTestRenderer-dev.modern.js +0.27% 707.46 kB 709.39 kB +0.20% 152.29 kB 152.60 kB
facebook-www/ReactTestRenderer-dev.classic.js +0.27% 707.46 kB 709.39 kB +0.20% 152.29 kB 152.60 kB
oss-stable-semver/react-reconciler/cjs/react-reconciler.development.js +0.27% 746.67 kB 748.70 kB +0.20% 158.94 kB 159.27 kB
oss-stable/react-reconciler/cjs/react-reconciler.development.js +0.27% 746.70 kB 748.73 kB +0.20% 158.97 kB 159.29 kB
oss-experimental/react-test-renderer/cjs/react-test-renderer.development.js +0.27% 671.76 kB 673.56 kB +0.20% 146.73 kB 147.03 kB
facebook-react-native/react-test-renderer/cjs/ReactTestRenderer-dev.js +0.27% 685.95 kB 687.79 kB +0.17% 148.41 kB 148.66 kB
oss-experimental/react-test-renderer/cjs/react-test-renderer.production.min.js +0.27% 91.78 kB 92.02 kB +0.53% 28.34 kB 28.49 kB
oss-experimental/react-test-renderer/umd/react-test-renderer.development.js +0.27% 703.91 kB 705.78 kB +0.20% 148.42 kB 148.72 kB
oss-experimental/react-test-renderer/umd/react-test-renderer.production.min.js +0.26% 92.06 kB 92.30 kB +0.48% 28.75 kB 28.89 kB
oss-experimental/react-art/cjs/react-art.development.js +0.25% 711.11 kB 712.91 kB +0.20% 153.61 kB 153.92 kB
oss-stable-semver/react-reconciler/cjs/react-reconciler.production.min.js +0.25% 92.95 kB 93.18 kB +0.36% 28.62 kB 28.72 kB
oss-stable/react-reconciler/cjs/react-reconciler.production.min.js +0.25% 92.98 kB 93.21 kB +0.36% 28.64 kB 28.74 kB
react-native/implementations/ReactFabric-dev.js +0.24% 766.33 kB 768.15 kB +0.16% 167.72 kB 168.00 kB
react-native/implementations/ReactFabric-dev.fb.js +0.23% 802.93 kB 804.79 kB +0.16% 174.20 kB 174.49 kB
oss-experimental/react-art/umd/react-art.development.js +0.23% 816.04 kB 817.91 kB +0.18% 171.80 kB 172.12 kB
oss-stable-semver/react-reconciler/cjs/react-reconciler.profiling.min.js +0.23% 101.77 kB 102.00 kB +0.27% 30.91 kB 30.99 kB
oss-stable/react-reconciler/cjs/react-reconciler.profiling.min.js +0.23% 101.80 kB 102.03 kB +0.27% 30.93 kB 31.01 kB
oss-stable-semver/react-test-renderer/cjs/react-test-renderer.development.js +0.22% 646.16 kB 647.61 kB +0.15% 141.48 kB 141.69 kB
oss-stable/react-test-renderer/cjs/react-test-renderer.development.js +0.22% 646.19 kB 647.63 kB +0.15% 141.50 kB 141.72 kB
oss-stable-semver/react-test-renderer/umd/react-test-renderer.development.js +0.22% 677.01 kB 678.52 kB +0.16% 143.07 kB 143.30 kB
oss-stable/react-test-renderer/umd/react-test-renderer.development.js +0.22% 677.04 kB 678.54 kB +0.16% 143.10 kB 143.32 kB
react-native/implementations/ReactNativeRenderer-dev.js +0.22% 776.39 kB 778.11 kB +0.15% 170.08 kB 170.34 kB
oss-stable-semver/react-art/cjs/react-art.production.min.js +0.22% 81.85 kB 82.03 kB +0.27% 25.46 kB 25.53 kB
oss-stable/react-art/cjs/react-art.production.min.js +0.22% 81.88 kB 82.06 kB +0.27% 25.46 kB 25.53 kB
react-native/implementations/ReactNativeRenderer-dev.fb.js +0.22% 813.06 kB 814.82 kB +0.14% 176.68 kB 176.94 kB
facebook-www/ReactDOMTesting-dev.modern.js +0.21% 1,038.24 kB 1,040.44 kB +0.14% 233.47 kB 233.80 kB
oss-stable-semver/react-art/cjs/react-art.development.js +0.21% 683.84 kB 685.29 kB +0.14% 147.92 kB 148.13 kB
oss-stable/react-art/cjs/react-art.development.js +0.21% 683.86 kB 685.31 kB +0.14% 147.94 kB 148.15 kB
oss-stable-semver/react-test-renderer/cjs/react-test-renderer.production.min.js +0.21% 87.32 kB 87.50 kB +0.30% 27.04 kB 27.12 kB
oss-stable/react-test-renderer/cjs/react-test-renderer.production.min.js +0.21% 87.35 kB 87.53 kB +0.30% 27.04 kB 27.12 kB
facebook-www/ReactDOMTesting-dev.classic.js +0.21% 1,066.86 kB 1,069.07 kB +0.15% 239.26 kB 239.61 kB
oss-stable-semver/react-test-renderer/umd/react-test-renderer.production.min.js +0.20% 87.60 kB 87.78 kB +0.32% 27.46 kB 27.55 kB
oss-stable/react-test-renderer/umd/react-test-renderer.production.min.js +0.20% 87.62 kB 87.80 kB +0.32% 27.46 kB 27.55 kB

Generated by 🚫 dangerJS against 7d03b23

@rickhanlonii rickhanlonii force-pushed the rh-unknown-lane branch 2 times, most recently from f171cfb to 10483f6 Compare May 26, 2022 18:26
@rickhanlonii rickhanlonii changed the title [WIP] Add end-of-frame scheduling for default events Add end-of-frame scheduling for default events May 27, 2022
@rickhanlonii rickhanlonii requested a review from acdlite May 27, 2022 02:04
@rickhanlonii rickhanlonii marked this pull request as ready for review May 27, 2022 02:04
@rickhanlonii
Copy link
Member Author

I believe this is ready for another review 🤝

newCallbackPriority === DefaultLane &&
existingFrameAlignedNode == null &&
typeof window !== 'undefined' &&
typeof window.event === 'undefined'
Copy link
Collaborator

Choose a reason for hiding this comment

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

This logic needs to move to the Host Config because it's DOM-specific.

});
expect(Scheduler).toHaveYielded(['Count: 0']);

window.event = 'test';
Copy link
Collaborator

Choose a reason for hiding this comment

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

Nit: I would use an actual DOM event here. Like with dispatchEvent.

@rickhanlonii rickhanlonii force-pushed the rh-unknown-lane branch 2 times, most recently from 1790519 to 3d41b27 Compare June 8, 2022 01:46
@@ -210,6 +210,17 @@ Set this to true to indicate that your renderer supports `scheduleMicrotask`. We

Optional. You can proxy this to `queueMicrotask` or its equivalent in your environment.

#### `supportsFrameEndTask`
Copy link
Collaborator

Choose a reason for hiding this comment

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

thanks

@rickhanlonii rickhanlonii force-pushed the rh-unknown-lane branch 2 times, most recently from 82daf47 to 0d53dba Compare June 9, 2022 14:45
newCallbackPriority === DefaultLane &&
root.hasUnknownUpdates
) {
// Do nothing, we need to cancel the existing default task and schedule a rAF.
Copy link
Collaborator

Choose a reason for hiding this comment

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

This seems wrong because what if a rAF were already scheduled? It would cancel it and schedule a new one, which might cause us to get shifted into a later frame

Copy link
Member Author

Choose a reason for hiding this comment

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

Ah yeah, good point. I'll update.

Copy link
Member Author

Choose a reason for hiding this comment

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

@acdlite so when should we cancel the raf and scheduler task in this case? If we don't cancel here, we'll orphan existingCallbackNode without canceling the task. One option is to cancel it only if the newCallbackPriority is not default. That could push things to the next frame if something higher priority comes in like a click, but may be desirable so that the sync microtask fires first anyway?

// requestAnimationFrame
// -------------------
export const supportsFrameEndTask = true;
export function scheduleFrameEndTask(task) {
Copy link
Collaborator

Choose a reason for hiding this comment

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

I think "frame aligned" is better than "frame end", it doesn't matters where it fires in the refresh cycle as long as it happens before the next paint

Copy link
Member Author

Choose a reason for hiding this comment

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

Done

@rickhanlonii rickhanlonii force-pushed the rh-unknown-lane branch 5 times, most recently from c54e365 to 0a0565e Compare June 9, 2022 18:06
@rickhanlonii
Copy link
Member Author

Closing because I think the unified sync lane stuff replaces this.

@rickhanlonii rickhanlonii deleted the rh-unknown-lane branch January 24, 2024 03:50
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

6 participants