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

[Offscreen] Mount/unmount layout effects #21386

Merged
merged 2 commits into from
Jun 1, 2021

Conversation

acdlite
Copy link
Collaborator

@acdlite acdlite commented Apr 29, 2021

Exposes the Offscreen component type and implements basic support for mount/unmounting layout effects when the visibility is toggled.

Mostly it works the same way as hidden Suspense trees, which use the same internal fiber type. I had to add an extra bailout, though, that doesn't apply to the Suspense case but does apply to Offscreen components: a hidden Offscreen tree will eventually render at low priority, and when we it does, its subtreeTag will have effects scheduled on it. So I added a check to the layout phase where, if the subtree is hidden, we skip over the subtree entirely. An alternate design would be to clear the subtree flags in the render phase, but I prefer doing it this way since it's harder to mess up.

We also need an API to enable the same thing for passive effects. This is not yet implemented.

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

sizebot commented Apr 29, 2021

Comparing: 28625c6...129640c

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 = 126.00 kB 126.00 kB = 40.41 kB 40.41 kB
oss-experimental/react-dom/cjs/react-dom.production.min.js = 128.82 kB 128.82 kB = 41.35 kB 41.35 kB
facebook-www/ReactDOM-prod.classic.js +0.06% 406.15 kB 406.41 kB +0.04% 75.12 kB 75.16 kB
facebook-www/ReactDOM-prod.modern.js +0.06% 394.52 kB 394.78 kB +0.04% 73.31 kB 73.34 kB
facebook-www/ReactDOMForked-prod.classic.js +0.06% 406.15 kB 406.41 kB +0.04% 75.13 kB 75.16 kB
facebook-www/ReactIs-prod.classic.js +2.17% 5.72 kB 5.84 kB +1.98% 1.41 kB 1.44 kB
facebook-www/ReactIs-prod.modern.js +2.17% 5.72 kB 5.84 kB +1.98% 1.41 kB 1.44 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name +/- Base Current +/- gzip Base gzip Current gzip
facebook-www/ReactIs-prod.classic.js +2.17% 5.72 kB 5.84 kB +1.98% 1.41 kB 1.44 kB
facebook-www/ReactIs-prod.modern.js +2.17% 5.72 kB 5.84 kB +1.98% 1.41 kB 1.44 kB
oss-stable/react-is/cjs/react-is.production.min.js +1.62% 2.41 kB 2.45 kB +1.62% 0.93 kB 0.94 kB
oss-stable/react-is/umd/react-is.production.min.js +1.58% 2.40 kB 2.44 kB +1.98% 0.96 kB 0.98 kB
oss-experimental/react-is/umd/react-is.production.min.js +1.56% 2.44 kB 2.48 kB +1.33% 0.98 kB 0.99 kB
oss-experimental/react-is/cjs/react-is.production.min.js +1.55% 2.44 kB 2.48 kB +1.60% 0.94 kB 0.96 kB
oss-experimental/react/cjs/react.production.min.js +1.08% 7.48 kB 7.56 kB +0.58% 2.93 kB 2.94 kB
oss-experimental/react/umd/react.profiling.min.js +0.61% 11.32 kB 11.39 kB +0.29% 4.53 kB 4.54 kB
oss-experimental/react/umd/react.production.min.js +0.61% 11.32 kB 11.39 kB +0.29% 4.53 kB 4.54 kB
facebook-react-native/react/cjs/React-prod.js +0.59% 16.56 kB 16.66 kB +0.45% 4.26 kB 4.28 kB
facebook-react-native/react/cjs/React-profiling.js +0.59% 16.56 kB 16.66 kB +0.45% 4.26 kB 4.28 kB
facebook-www/React-prod.modern.js +0.58% 16.72 kB 16.82 kB +0.51% 4.33 kB 4.36 kB
facebook-www/React-profiling.modern.js +0.58% 16.72 kB 16.82 kB +0.51% 4.33 kB 4.36 kB
facebook-www/React-prod.classic.js +0.58% 16.87 kB 16.96 kB +0.43% 4.38 kB 4.40 kB
facebook-www/React-profiling.classic.js +0.58% 16.87 kB 16.96 kB +0.43% 4.38 kB 4.40 kB
oss-experimental/react-is/cjs/react-is.development.js +0.42% 7.93 kB 7.96 kB +0.19% 2.15 kB 2.15 kB
oss-stable/react-is/cjs/react-is.development.js +0.41% 7.96 kB 8.00 kB +0.23% 2.16 kB 2.17 kB
oss-experimental/react-is/umd/react-is.development.js +0.39% 8.52 kB 8.55 kB +0.18% 2.22 kB 2.23 kB
oss-stable/react-is/umd/react-is.development.js +0.39% 8.56 kB 8.59 kB +0.18% 2.24 kB 2.25 kB
facebook-www/ReactIs-dev.modern.js +0.37% 10.01 kB 10.05 kB +0.15% 2.67 kB 2.68 kB
facebook-www/ReactIs-dev.classic.js +0.37% 10.01 kB 10.05 kB +0.19% 2.67 kB 2.68 kB

Generated by 🚫 dangerJS against 129640c

@acdlite acdlite force-pushed the offscreen-component-layout-effects branch from 912b9fd to 3633e8d Compare May 7, 2021 15:43

// @gate experimental
// @gate enableSuspenseLayoutEffectSemantics
it('mounts without layout effects', async () => {
Copy link
Contributor

Choose a reason for hiding this comment

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

nit

Suggested change
it('mounts without layout effects', async () => {
it('mounts without layout effects when hidden', async () => {

Exposes the Offscreen component type and implements basic support for
mount/unmounting layout effects when the visibility is toggled.

Mostly it works the same way as hidden Suspense trees, which use the
same internal fiber type. I had to add an extra bailout, though, that
doesn't apply to the Suspense case but does apply to Offscreen
components: a hidden Offscreen tree will eventually render at low
priority, and when we it does, its `subtreeTag` will have effects
scheduled on it. So I added a check to the layout phase where, if the
subtree is hidden, we skip over the subtree entirely. An alternate
design would be to clear the subtree flags in the render phase, but I
prefer doing it this way since it's harder to mess up.

We also need an API to enable the same thing for passive effects. This
is not yet implemented.
@acdlite acdlite force-pushed the offscreen-component-layout-effects branch from 51786ec to f29bd89 Compare June 1, 2021 19:39
Copy link
Member

@rickhanlonii rickhanlonii left a comment

Choose a reason for hiding this comment

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

LGTM

@acdlite acdlite marked this pull request as ready for review June 1, 2021 19:42
@acdlite acdlite force-pushed the offscreen-component-layout-effects branch from f29bd89 to 129640c Compare June 1, 2021 19:45
@acdlite acdlite merged commit e16d61c into facebook:master Jun 1, 2021
facebook-github-bot pushed a commit to facebook/react-native that referenced this pull request Jun 7, 2021
Summary:
- **[0eea57724](facebook/react@0eea57724 )**: Fix typo in comment (accumlated → accumulated) ([#21637](facebook/react#21637)) //<ithinker5>//
- **[0706162ba](facebook/react@0706162ba )**: Fix typo in comment (environement → environment) ([#21635](facebook/react#21635)) //<niexq>//
- **[9d17b562b](facebook/react@9d17b562b )**: Fix typo in comment (satsify → satisfy) ([#21629](facebook/react#21629)) //<niexq>//
- **[b610fec00](facebook/react@b610fec00 )**: fix comments: expiration time -> lanes ([#21551](facebook/react#21551)) //<Shannon Feng>//
- **[cc4d24ab0](facebook/react@cc4d24ab0 )**: [Fizz] Always call flush() if it exists ([#21625](facebook/react#21625)) //<Dan Abramov>//
- **[e0d9b2899](facebook/react@e0d9b2899 )**: [Fizz] Minor Fixes for Warning Parity ([#21618](facebook/react#21618)) //<Sebastian Markbåge>//
- **[1b7b3592f](facebook/react@1b7b3592f )**: [Fizz] Implement Component Stacks in DEV for warnings ([#21610](facebook/react#21610)) //<Sebastian Markbåge>//
- **[39f007489](facebook/react@39f007489 )**: Make enableSuspenseLayoutEffectSemantics static for www ([#21617](facebook/react#21617)) //<Brian Vaughn>//
- **[8f3794276](facebook/react@8f3794276 )**: Prepare semver (`latest`) releases in CI ([#21615](facebook/react#21615)) //<Andrew Clark>//
- **[8b4201535](facebook/react@8b4201535 )**: Devtools: add feature to trigger an error boundary ([#21583](facebook/react#21583)) //<Bao Pham>//
- **[154a8cf32](facebook/react@154a8cf32 )**: Fix reference to wrong variable //<Andrew Clark>//
- **[6736a38b9](facebook/react@6736a38b9 )**: Add single source of truth for package versions ([#21608](facebook/react#21608)) //<Andrew Clark>//
- **[86715efa2](facebook/react@86715efa2 )**: Resolve the true entry point during tests ([#21505](facebook/react#21505)) //<Sebastian Markbåge>//
- **[a8a4742f1](facebook/react@a8a4742f1 )**: Convert ES6/TypeScript/CoffeeScript Tests to createRoot + act ([#21598](facebook/react#21598)) //<Sebastian Markbåge>//
- **[1d3558965](facebook/react@1d3558965 )**: Disable deferRenderPhaseUpdateToNextBatch by default ([#21605](facebook/react#21605)) //<Sebastian Markbåge>//
- **[a8964649b](facebook/react@a8964649b )**: Delete an unused field ([#21415](facebook/react#21415)) //<okmttdhr>//
- **[76f85b3e5](facebook/react@76f85b3e5 )**: Expose Fizz in stable builds ([#21602](facebook/react#21602)) //<Dan Abramov>//
- **[e16d61c30](facebook/react@e16d61c30 )**: [Offscreen] Mount/unmount layout effects ([#21386](facebook/react#21386)) //<Andrew Clark>//
- **[63091939b](facebook/react@63091939b )**: OSS feature flag updates ([#21597](facebook/react#21597)) //<Brian Vaughn>//
- **[efbd69b27](facebook/react@efbd69b27 )**:  Define global __WWW__ = true flag during www tests ([#21504](facebook/react#21504)) //<Sebastian Markbåge>//
- **[28625c6f4](facebook/react@28625c6f4 )**: Disable strict effects for legacy roots (again) ([#21591](facebook/react#21591)) //<Brian Vaughn>//
- **[3c2341416](facebook/react@3c2341416 )**: Update jest to v26 ([#21574](facebook/react#21574)) //<Sebastian Silbermann>//
- **[0d493dcda](facebook/react@0d493dcda )**: Removed _debugID field from Fiber - Issue #21558 ([#21570](facebook/react#21570)) //<Pulkit Sharma>//
- **[7841d0695](facebook/react@7841d0695 )**: Enable the updater-tracking feature flag in more builds ([#21567](facebook/react#21567)) //<Brian Vaughn>//
- **[6405efc36](facebook/react@6405efc36 )**: Enabled Profiling feature flags for OSS release ([#21565](facebook/react#21565)) //<Brian Vaughn>//

Changelog:
[General][Changed] - React Native sync for revisions 2d8d133...0eea577

jest_e2e[run_all_tests]

Reviewed By: bvaughn

Differential Revision: D28932083

fbshipit-source-id: 012c1bfb857ed59d7283334d633f1cce8ec50360
koto pushed a commit to koto/react that referenced this pull request Jun 15, 2021
* [Offscreen] Mount/unmount layout effects

Exposes the Offscreen component type and implements basic support for
mount/unmounting layout effects when the visibility is toggled.

Mostly it works the same way as hidden Suspense trees, which use the
same internal fiber type. I had to add an extra bailout, though, that
doesn't apply to the Suspense case but does apply to Offscreen
components: a hidden Offscreen tree will eventually render at low
priority, and when we it does, its `subtreeTag` will have effects
scheduled on it. So I added a check to the layout phase where, if the
subtree is hidden, we skip over the subtree entirely. An alternate
design would be to clear the subtree flags in the render phase, but I
prefer doing it this way since it's harder to mess up.

We also need an API to enable the same thing for passive effects. This
is not yet implemented.

* Add test starting from hidden

Co-authored-by: Rick Hanlon <rickhanlonii@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
CLA Signed React Core Team Opened by a member of the React Core Team
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

5 participants