-
Notifications
You must be signed in to change notification settings - Fork 47.2k
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
Refactor legacy update queue #17510
Refactor legacy update queue #17510
Conversation
This pull request is automatically built and testable in CodeSandbox. To see build info of the built libraries, click here or the icon next to each commit SHA. Latest deployment of this branch, based on commit 99444a2:
|
Details of bundled changes.Comparing: 3c1efa0...99444a2 react-dom
react-native-renderer
react-test-renderer
react-noop-renderer
react-art
react-reconciler
ReactDOM: size: 0.0%, gzip: 0.0% Size changes (experimental) |
Details of bundled changes.Comparing: 3c1efa0...99444a2 react-reconciler
react-noop-renderer
react-dom
react-art
react-test-renderer
react-native-renderer
ReactDOM: size: -0.4%, gzip: 🔺+0.1% Size changes (stable) |
1cc8f85
to
275cc2f
Compare
275cc2f
to
f08b8ba
Compare
const first = pending.next; | ||
if (first !== null) { | ||
// Still circular. | ||
update.next = first; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What's this about, we need this for it to stay circular, no? Maybe we're missing a test?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
All I did was remove the first !== null
check. Which is unnecessary because update.next
is never null.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think the diff makes it look like I deleted the assignment but really all I deleted was the type check that surrounds it.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actually, to rephrase, it's not really a type check that I deleted. In the old implementation, the queue was only sometimes circular. It would eventually "unravel" to linear so that the old nodes could be garbage collected. But in the new implementation, the pending queue is always circular. So you don't need to check for if it's circular or not.
@@ -160,7 +160,7 @@ describe('createSubscription', () => { | |||
|
|||
it('should still work if unsubscription is managed incorrectly', async () => { | |||
const Subscription = createSubscription({ | |||
getCurrentValue: source => undefined, | |||
getCurrentValue: source => source.value, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this a breaking change?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I looked into this for a while and I think the old version was just wrong and it accidentally worked with the old implementation. I'm going to try to write a failing test for what's in master.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Never mind, I found the bug. Will add a test.
Adds a failing test case where an update that was committed is later skipped over during a rebase. This should never happen.
lastCapturedEffect: Update<State> | null, | ||
baseQueue: Update<State> | null, | ||
shared: SharedQueue<State>, | ||
effects: Array<Update<State>> | null, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why is this an array as opposed to a linked list like the hooks form? Harder to see how they correlate.
I was considering a refactor to arrays but with a different take (inline fields instead of objects) . However, I wanted to do that as a separate refactor.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Idk I just chose one :D
This felt like a different trade off from the hooks one because these effects are relatively rare. Only when you pass a callback to setState
. It's more like the emitEffect
API.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So it didn't seem worth putting a nextEffect
field on the update type
57816d9
to
862287b
Compare
This test passes in the old legacy update queue implementation. I'm adding this before the refactor to prevent a regression.
Refactors legacy update queue to incoporate rebasing fix. Uses nearly the same approach as the hook update queue but has to handle a few other cases.
862287b
to
99444a2
Compare
Fixes a bug related to rebasing updates. Once an update has committed, it should never un-commit, even if interrupted by a higher priority update. The fix includes a refactor of how update queues work. This commit is a combination of two PRs: - #17483 by @sebmarkbage refactors the hook update queue - #17510 by @acdlite refactors the class and root update queue Landing one without the other would cause state updates to sometimes be inconsistent across components, so I've combined them into a single commit in case they need to be reverted. Co-authored-by: Sebastian Markbåge <sema@fb.com> Co-authored-by: Andrew Clark <git@andrewclark.io>
I squashed this with the hooks refactor and landed as b617db3 so it can be atomically reverted. |
Fixes a bug related to rebasing updates. Once an update has committed, it should never un-commit, even if interrupted by a higher priority update. The fix includes a refactor of how update queues work. This commit is a combination of two PRs: - facebook#17483 by @sebmarkbage refactors the hook update queue - facebook#17510 by @acdlite refactors the class and root update queue Landing one without the other would cause state updates to sometimes be inconsistent across components, so I've combined them into a single commit in case they need to be reverted. Co-authored-by: Sebastian Markbåge <sema@fb.com> Co-authored-by: Andrew Clark <git@andrewclark.io>
* Refactor Update Queues to Fix Rebasing Bug Fixes a bug related to rebasing updates. Once an update has committed, it should never un-commit, even if interrupted by a higher priority update. The fix includes a refactor of how update queues work. This commit is a combination of two PRs: - #17483 by @sebmarkbage refactors the hook update queue - #17510 by @acdlite refactors the class and root update queue Landing one without the other would cause state updates to sometimes be inconsistent across components, so I've combined them into a single commit in case they need to be reverted. Co-authored-by: Sebastian Markbåge <sema@fb.com> Co-authored-by: Andrew Clark <git@andrewclark.io> * Initialize update queue object on mount Instead of lazily initializing update queue objects on the first update, class and host root queues are created on mount. This simplifies the logic for appending new updates and matches what we do for hooks.
![snyk-top-banner](https://redirect.github.com/andygongea/OWASP-Benchmark/assets/818805/c518c423-16fe-447e-b67f-ad5a49b5d123) <h3>Snyk has created this PR to upgrade react-dom from 16.8.4 to 16.14.0.</h3> :information_source: Keep your dependencies up-to-date. This makes it easier to fix existing vulnerabilities and to more quickly identify and fix newly disclosed vulnerabilities when they affect your project. <hr/> - The recommended version is **13 versions** ahead of your current version. - The recommended version was released on **4 years ago**. <details> <summary><b>Release notes</b></summary> <br/> <details> <summary>Package name: <b>react-dom</b></summary> <ul> <li> <b>16.14.0</b> - <a href="https://redirect.github.com/facebook/react/releases/tag/v16.14.0">2020-10-14</a></br><h3>React</h3> <ul> <li>Add support for the <a href="https://reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html" rel="nofollow">new JSX transform</a>. (<a href="https://redirect.github.com/lunaruan">@ lunaruan</a> in <a href="https://redirect.github.com/facebook/react/pull/18299" data-hovercard-type="pull_request" data-hovercard-url="/facebook/react/pull/18299/hovercard">#18299</a>)</li> </ul> </li> <li> <b>16.13.1</b> - <a href="https://redirect.github.com/facebook/react/releases/tag/v16.13.1">2020-03-19</a></br><h3>React DOM</h3> <ul> <li>Fix bug in legacy mode Suspense where effect clean-up functions are not fired. This only affects users who use Suspense for data fetching in legacy mode, which is not technically supported. (<a href="https://redirect.github.com/acdlite">@ acdlite</a> in <a href="https://redirect.github.com/facebook/react/pull/18238" data-hovercard-type="pull_request" data-hovercard-url="/facebook/react/pull/18238/hovercard">#18238</a>)</li> <li>Revert warning for cross-component updates that happen inside class render lifecycles (<code>componentWillReceiveProps</code>, <code>shouldComponentUpdate</code>, and so on). (<a href="https://redirect.github.com/gaearon">@ gaearon</a> in <a href="https://redirect.github.com/facebook/react/pull/18330" data-hovercard-type="pull_request" data-hovercard-url="/facebook/react/pull/18330/hovercard">#18330</a>)</li> </ul> <h2>Artifacts</h2> <ul> <li>react: <a href="https://unpkg.com/react@16.13.1/umd/" rel="nofollow">https://unpkg.com/react@16.13.1/umd/</a></li> <li>react-art: <a href="https://unpkg.com/react-art@16.13.1/umd/" rel="nofollow">https://unpkg.com/react-art@16.13.1/umd/</a></li> <li>react-dom: <a href="https://unpkg.com/react-dom@16.13.1/umd/" rel="nofollow">https://unpkg.com/react-dom@16.13.1/umd/</a></li> <li>react-is: <a href="https://unpkg.com/react-is@16.13.1/umd/" rel="nofollow">https://unpkg.com/react-is@16.13.1/umd/</a></li> <li>react-test-renderer: <a href="https://unpkg.com/react-test-renderer@16.13.1/umd/" rel="nofollow">https://unpkg.com/react-test-renderer@16.13.1/umd/</a></li> <li>scheduler: <a href="https://unpkg.com/scheduler@0.19.1/umd/" rel="nofollow">https://unpkg.com/scheduler@0.19.1/umd/</a></li> </ul> </li> <li> <b>16.13.0</b> - <a href="https://redirect.github.com/facebook/react/releases/tag/v16.13.0">2020-02-26</a></br><h3>React</h3> <ul> <li>Warn when a string ref is used in a manner that's not amenable to a future codemod (<a href="https://redirect.github.com/lunaruan">@ lunaruan</a> in <a href="https://redirect.github.com/facebook/react/pull/17864" data-hovercard-type="pull_request" data-hovercard-url="/facebook/react/pull/17864/hovercard">#17864</a>)</li> <li>Deprecate <code>React.createFactory()</code> (<a href="https://redirect.github.com/trueadm">@ trueadm</a> in <a href="https://redirect.github.com/facebook/react/pull/17878" data-hovercard-type="pull_request" data-hovercard-url="/facebook/react/pull/17878/hovercard">#17878</a>)</li> </ul> <h3>React DOM</h3> <ul> <li>Warn when changes in <code>style</code> may cause an unexpected collision (<a href="https://redirect.github.com/sophiebits">@ sophiebits</a> in <a href="https://redirect.github.com/facebook/react/pull/14181" data-hovercard-type="pull_request" data-hovercard-url="/facebook/react/pull/14181/hovercard">#14181</a>, <a href="https://redirect.github.com/facebook/react/pull/18002" data-hovercard-type="pull_request" data-hovercard-url="/facebook/react/pull/18002/hovercard">#18002</a>)</li> <li>Warn when a function component is updated during another component's render phase (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/acdlite/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://redirect.github.com/acdlite">@ acdlite</a> in <a href="https://redirect.github.com/facebook/react/pull/17099" data-hovercard-type="pull_request" data-hovercard-url="/facebook/react/pull/17099/hovercard">#17099</a>)</li> <li>Deprecate <code>unstable_createPortal</code> (<a href="https://redirect.github.com/trueadm">@ trueadm</a> in <a href="https://redirect.github.com/facebook/react/pull/17880" data-hovercard-type="pull_request" data-hovercard-url="/facebook/react/pull/17880/hovercard">#17880</a>)</li> <li>Fix <code>onMouseEnter</code> being fired on disabled buttons (<a href="https://redirect.github.com/AlfredoGJ">@ AlfredoGJ</a> in <a href="https://redirect.github.com/facebook/react/pull/17675" data-hovercard-type="pull_request" data-hovercard-url="/facebook/react/pull/17675/hovercard">#17675</a>)</li> <li>Call <code>shouldComponentUpdate</code> twice when developing in <code>StrictMode</code> (<a href="https://redirect.github.com/bvaughn">@ bvaughn</a> in <a href="https://redirect.github.com/facebook/react/pull/17942" data-hovercard-type="pull_request" data-hovercard-url="/facebook/react/pull/17942/hovercard">#17942</a>)</li> <li>Add <code>version</code> property to ReactDOM (<a href="https://redirect.github.com/ealush">@ ealush</a> in <a href="https://redirect.github.com/facebook/react/pull/15780" data-hovercard-type="pull_request" data-hovercard-url="/facebook/react/pull/15780/hovercard">#15780</a>)</li> <li>Don't call <code>toString()</code> of <code>dangerouslySetInnerHTML</code> (<a href="https://redirect.github.com/sebmarkbage">@ sebmarkbage</a> in <a href="https://redirect.github.com/facebook/react/pull/17773" data-hovercard-type="pull_request" data-hovercard-url="/facebook/react/pull/17773/hovercard">#17773</a>)</li> <li>Show component stacks in more warnings (<a href="https://redirect.github.com/gaearon">@ gaearon</a> in <a href="https://redirect.github.com/facebook/react/pull/17922" data-hovercard-type="pull_request" data-hovercard-url="/facebook/react/pull/17922/hovercard">#17922</a>, <a href="https://redirect.github.com/facebook/react/pull/17586" data-hovercard-type="pull_request" data-hovercard-url="/facebook/react/pull/17586/hovercard">#17586</a>)</li> </ul> <h3>Concurrent Mode (Experimental)</h3> <ul> <li>Warn for problematic usages of <code>ReactDOM.createRoot()</code> (<a href="https://redirect.github.com/trueadm">@ trueadm</a> in <a href="https://redirect.github.com/facebook/react/pull/17937" data-hovercard-type="pull_request" data-hovercard-url="/facebook/react/pull/17937/hovercard">#17937</a>)</li> <li>Remove <code>ReactDOM.createRoot()</code> callback params and added warnings on usage (<a href="https://redirect.github.com/bvaughn">@ bvaughn</a> in <a href="https://redirect.github.com/facebook/react/pull/17916" data-hovercard-type="pull_request" data-hovercard-url="/facebook/react/pull/17916/hovercard">#17916</a>)</li> <li>Don't group Idle/Offscreen work with other work (<a href="https://redirect.github.com/sebmarkbage">@ sebmarkbage</a> in <a href="https://redirect.github.com/facebook/react/pull/17456" data-hovercard-type="pull_request" data-hovercard-url="/facebook/react/pull/17456/hovercard">#17456</a>)</li> <li>Adjust <code>SuspenseList</code> CPU bound heuristic (<a href="https://redirect.github.com/sebmarkbage">@ sebmarkbage</a> in <a href="https://redirect.github.com/facebook/react/pull/17455" data-hovercard-type="pull_request" data-hovercard-url="/facebook/react/pull/17455/hovercard">#17455</a>)</li> <li>Add missing event plugin priorities (<a href="https://redirect.github.com/trueadm">@ trueadm</a> in <a href="https://redirect.github.com/facebook/react/pull/17914" data-hovercard-type="pull_request" data-hovercard-url="/facebook/react/pull/17914/hovercard">#17914</a>)</li> <li>Fix <code>isPending</code> only being true when transitioning from inside an input event (<a href="https://redirect.github.com/acdlite">@ acdlite</a> in <a href="https://redirect.github.com/facebook/react/pull/17382" data-hovercard-type="pull_request" data-hovercard-url="/facebook/react/pull/17382/hovercard">#17382</a>)</li> <li>Fix <code>React.memo</code> components dropping updates when interrupted by a higher priority update (<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/acdlite/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://redirect.github.com/acdlite">@ acdlite</a> in <a href="https://redirect.github.com/facebook/react/pull/18091" data-hovercard-type="pull_request" data-hovercard-url="/facebook/react/pull/18091/hovercard">#18091</a>)</li> <li>Don't warn when suspending at the wrong priority (<a href="https://redirect.github.com/gaearon">@ gaearon</a> in <a href="https://redirect.github.com/facebook/react/pull/17971" data-hovercard-type="pull_request" data-hovercard-url="/facebook/react/pull/17971/hovercard">#17971</a>)</li> <li>Fix a bug with rebasing updates (<a href="https://redirect.github.com/acdlite">@ acdlite</a> and <a href="https://redirect.github.com/sebmarkbage">@ sebmarkbage</a> in <a href="https://redirect.github.com/facebook/react/pull/17560" data-hovercard-type="pull_request" data-hovercard-url="/facebook/react/pull/17560/hovercard">#17560</a>, <a href="https://redirect.github.com/facebook/react/pull/17510" data-hovercard-type="pull_request" data-hovercard-url="/facebook/react/pull/17510/hovercard">#17510</a>, <a href="https://redirect.github.com/facebook/react/pull/17483" data-hovercard-type="pull_request" data-hovercard-url="/facebook/react/pull/17483/hovercard">#17483</a>, <a href="https://redirect.github.com/facebook/react/pull/17480" data-hovercard-type="pull_request" data-hovercard-url="/facebook/react/pull/17480/hovercard">#17480</a>)</li> </ul> <h2>Artifacts</h2> <ul> <li>react: <a href="https://unpkg.com/react@16.13.0/umd/" rel="nofollow">https://unpkg.com/react@16.13.0/umd/</a></li> <li>react-art: <a href="https://unpkg.com/react-art@16.13.0/umd/" rel="nofollow">https://unpkg.com/react-art@16.13.0/umd/</a></li> <li>react-dom: <a href="https://unpkg.com/react-dom@16.13.0/umd/" rel="nofollow">https://unpkg.com/react-dom@16.13.0/umd/</a></li> <li>react-is: <a href="https://unpkg.com/react-is@16.13.0/umd/" rel="nofollow">https://unpkg.com/react-is@16.13.0/umd/</a></li> <li>react-test-renderer: <a href="https://unpkg.com/react-test-renderer@16.13.0/umd/" rel="nofollow">https://unpkg.com/react-test-renderer@16.13.0/umd/</a></li> <li>scheduler: <a href="https://unpkg.com/scheduler@0.19.0/umd/" rel="nofollow">https://unpkg.com/scheduler@0.19.0/umd/</a></li> </ul> </li> <li> <b>16.12.0</b> - <a href="https://redirect.github.com/facebook/react/releases/tag/v16.12.0">2019-11-14</a></br><h3>React DOM</h3> <ul> <li>Fix passive effects (<code>useEffect</code>) not being fired in a multi-root app. (<a href="https://redirect.github.com/acdlite">@ acdlite</a> in <a href="https://redirect.github.com/facebook/react/pull/17347" data-hovercard-type="pull_request" data-hovercard-url="/facebook/react/pull/17347/hovercard">#17347</a>)</li> </ul> <h3>React Is</h3> <ul> <li>Fix <code>lazy</code> and <code>memo</code> types considered elements instead of components (<a href="https://redirect.github.com/bvaughn">@ bvaughn</a> in <a href="https://redirect.github.com/facebook/react/pull/17278" data-hovercard-type="pull_request" data-hovercard-url="/facebook/react/pull/17278/hovercard">#17278</a>)</li> </ul> <h2>Artifacts</h2> <p>• react: <a href="https://unpkg.com/react@16.12.0/umd/" rel="nofollow">https://unpkg.com/react@16.12.0/umd/</a><br> • react-art: <a href="https://unpkg.com/react-art@16.12.0/umd/" rel="nofollow">https://unpkg.com/react-art@16.12.0/umd/</a><br> • react-dom: <a href="https://unpkg.com/react-dom@16.12.0/umd/" rel="nofollow">https://unpkg.com/react-dom@16.12.0/umd/</a><br> • react-is: <a href="https://unpkg.com/react-is@16.12.0/umd/" rel="nofollow">https://unpkg.com/react-is@16.12.0/umd/</a><br> • react-test-renderer: <a href="https://unpkg.com/react-test-renderer@16.12.0/umd/" rel="nofollow">https://unpkg.com/react-test-renderer@16.12.0/umd/</a><br> • scheduler: <a href="https://unpkg.com/scheduler@0.18.0/umd/" rel="nofollow">https://unpkg.com/scheduler@0.18.0/umd/</a></p> </li> <li> <b>16.11.0</b> - 2019-10-22 </li> <li> <b>16.10.2</b> - 2019-10-03 </li> <li> <b>16.10.1</b> - 2019-09-28 </li> <li> <b>16.10.0</b> - 2019-09-27 </li> <li> <b>16.9.0</b> - 2019-08-08 </li> <li> <b>16.9.0-rc.0</b> - 2019-08-05 </li> <li> <b>16.9.0-alpha.0</b> - 2019-04-03 </li> <li> <b>16.8.6</b> - 2019-03-28 </li> <li> <b>16.8.5</b> - 2019-03-22 </li> <li> <b>16.8.4</b> - 2019-03-05 </li> </ul> from <a href="https://redirect.github.com/facebook/react/releases">react-dom GitHub release notes</a> </details> </details> --- > [!IMPORTANT] > > - Check the changes in this PR to ensure they won't cause issues with your project. > - This PR was automatically created by Snyk using the credentials of a real user. --- **Note:** _You are seeing this because you or someone else with access to this repository has authorized Snyk to open upgrade PRs._ **For more information:** <img src="https://api.segment.io/v1/pixel/track?data=eyJ3cml0ZUtleSI6InJyWmxZcEdHY2RyTHZsb0lYd0dUcVg4WkFRTnNCOUEwIiwiYW5vbnltb3VzSWQiOiI4NTdmYmVkYy1hZTE3LTQ3ZGYtODhkYy03MTcyMWYxNThjZTkiLCJldmVudCI6IlBSIHZpZXdlZCIsInByb3BlcnRpZXMiOnsicHJJZCI6Ijg1N2ZiZWRjLWFlMTctNDdkZi04OGRjLTcxNzIxZjE1OGNlOSJ9fQ==" width="0" height="0"/> > - 🧐 [View latest project report](https://app.snyk.io/org/newkdr/project/12a8a5f5-3e19-438c-8280-eb8f4ee06d17?utm_source=github&utm_medium=referral&page=upgrade-pr) > - 📜 [Customise PR templates](https://docs.snyk.io/scan-using-snyk/pull-requests/snyk-fix-pull-or-merge-requests/customize-pr-templates) > - 🛠 [Adjust upgrade PR settings](https://app.snyk.io/org/newkdr/project/12a8a5f5-3e19-438c-8280-eb8f4ee06d17/settings/integration?utm_source=github&utm_medium=referral&page=upgrade-pr) > - 🔕 [Ignore this dependency or unsubscribe from future upgrade PRs](https://app.snyk.io/org/newkdr/project/12a8a5f5-3e19-438c-8280-eb8f4ee06d17/settings/integration?pkg=react-dom&utm_source=github&utm_medium=referral&page=upgrade-pr#auto-dep-upgrades) [//]: # 'snyk:metadata:{"customTemplate":{"variablesUsed":[],"fieldsUsed":[]},"dependencies":[{"name":"react-dom","from":"16.8.4","to":"16.14.0"}],"env":"prod","hasFixes":false,"isBreakingChange":false,"isMajorUpgrade":false,"issuesToFix":[],"prId":"857fbedc-ae17-47df-88dc-71721f158ce9","prPublicId":"857fbedc-ae17-47df-88dc-71721f158ce9","packageManager":"npm","priorityScoreList":[],"projectPublicId":"12a8a5f5-3e19-438c-8280-eb8f4ee06d17","projectUrl":"https://app.snyk.io/org/newkdr/project/12a8a5f5-3e19-438c-8280-eb8f4ee06d17?utm_source=github&utm_medium=referral&page=upgrade-pr","prType":"upgrade","templateFieldSources":{"branchName":"default","commitMessage":"default","description":"default","title":"default"},"templateVariants":[],"type":"auto","upgrade":[],"upgradeInfo":{"versionsDiff":13,"publishedDate":"2020-10-14T19:38:26.085Z"},"vulns":[]}'
Based on #17483
Refactors legacy update queue to incorporate rebasing fix. Uses nearly the same approach as the hook update queue but has to handle a few other cases.
Managed to remove some older, poorly factored code related to error handling.
To-do