{"id":13725489,"url":"https://github.com/dai-shi/will-this-react-global-state-work-in-concurrent-rendering","last_synced_at":"2025-04-04T14:05:15.625Z","repository":{"id":38354454,"uuid":"196030065","full_name":"dai-shi/will-this-react-global-state-work-in-concurrent-rendering","owner":"dai-shi","description":"Test tearing and branching in React concurrent rendering","archived":false,"fork":false,"pushed_at":"2023-09-23T23:49:53.000Z","size":2343,"stargazers_count":567,"open_issues_count":2,"forks_count":46,"subscribers_count":11,"default_branch":"main","last_synced_at":"2025-03-28T13:05:19.626Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dai-shi.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2019-07-09T14:55:31.000Z","updated_at":"2025-03-05T08:53:12.000Z","dependencies_parsed_at":"2023-02-08T04:45:17.913Z","dependency_job_id":"4f76767c-bfeb-47ac-96b6-f2ed62e2c568","html_url":"https://github.com/dai-shi/will-this-react-global-state-work-in-concurrent-rendering","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dai-shi%2Fwill-this-react-global-state-work-in-concurrent-rendering","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dai-shi%2Fwill-this-react-global-state-work-in-concurrent-rendering/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dai-shi%2Fwill-this-react-global-state-work-in-concurrent-rendering/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dai-shi%2Fwill-this-react-global-state-work-in-concurrent-rendering/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dai-shi","download_url":"https://codeload.github.com/dai-shi/will-this-react-global-state-work-in-concurrent-rendering/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247186140,"owners_count":20898099,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-03T01:02:24.871Z","updated_at":"2025-04-04T14:05:15.607Z","avatar_url":"https://github.com/dai-shi.png","language":"JavaScript","funding_links":[],"categories":["JavaScript"],"sub_categories":[],"readme":"# Will this React global state work in concurrent rendering?\n\nTest tearing and branching in React concurrent rendering\n\n- [Discussion in React 18 WG](https://github.com/reactwg/react-18/discussions/116)\n\n## Introduction\n\nReact 18 comes with a new feature called \"concurrent rendering\".\nWith global state, there's a theoretical issue called \"tearing\"\nthat might occur in React concurrent rendering.\n\nLet's test the behavior!\n\n## What is tearing?\n\n- [What is tearing in React 18 WG](https://github.com/reactwg/react-18/discussions/69)\n- [Stack Overflow](https://stackoverflow.com/questions/54891675/what-is-tearing-in-the-context-of-the-react-redux)\n- [Talk by Mark Erikson](https://www.youtube.com/watch?v=yOZ4Ml9LlWE\u0026t=933s)\n- [Talk by Flarnie Marchan](https://www.youtube.com/watch?v=V1Ly-8Z1wQA\u0026t=1079s)\n- Some other resources\n  - https://github.com/reactjs/rfcs/pull/147\n  - https://gist.github.com/bvaughn/054b82781bec875345bd85a5b1344698\n\n## What is branching?\n\n- Old resources\n  - https://reactjs.org/docs/concurrent-mode-intro.html\n\n## How does it work?\n\nA small app is implemented with each library.\nThe state has one count.\nThe app shows the count in fifty components.\n\nThere's a button outside of React and\nif it's clicked it will trigger state mutation.\nThis is to emulate mutating an external state outside of React,\nfor example updating state by Redux middleware.\n\nThe render has intentionally expensive computation.\nIf the mutation happens during rendering with in a tree,\nthere could be an inconsistency in the state.\nIf it finds the inconsistency, the test will fail.\n\n## How to run\n\n```bash\ngit clone https://github.com/dai-shi/will-this-react-global-state-work-in-concurrent-rendering.git\ncd will-this-react-global-state-work-in-concurrent-rendering\nyarn install\nyarn run build-all\nyarn run jest\n```\n\nTo automatically run tests and update the README.md on OSX:\n```\nyarn jest:json\nyarn jest:update\n```\n\n## Screencast (old one with react-redux v7. v8 works great.)\n\n\u003cimg src=\"https://user-images.githubusercontent.com/490574/61502196-ce109200-aa0d-11e9-9efc-6203545d367c.gif\" alt=\"Preview\" width=\"350\" /\u003e\n\n## Test scenario\n\n- With useTransition\n  - Level 1\n    - 1: No tearing finally on update\n    - 2: No tearing finally on mount\n  - Level 2\n    - 3: No tearing temporarily on update\n    - 4: No tearing temporarily on mount\n  - Level 3\n    - 5: Can interrupt render (time slicing)\n    - 6: Can branch state (wip state)\n- With useDeferredValue\n  - Level 1\n    - 7: No tearing finally on update\n    - 8: No tearing finally on mount\n  - Level 2\n    - 9: No tearing temporarily on update\n    - 10: No tearing temporarily on mount\n\n## Results\n\n\u003cdetails\u003e\n\u003csummary\u003eRaw Output\u003c/summary\u003e\n\n```\n   With useTransition\n     Level 1\n       ✓ No tearing finally on update (7990 ms)\n       ✓ No tearing finally on mount (4608 ms)\n     Level 2\n       ✓ No tearing temporarily on update (12955 ms)\n       ✓ No tearing temporarily on mount (4546 ms)\n     Level 3\n       ✕ Can interrupt render (time slicing) (7926 ms)\n       ✕ Can branch state (wip state) (6655 ms)\n   With useDeferredValue\n     Level 1\n       ✓ No tearing finally on update (9568 ms)\n       ✓ No tearing finally on mount (4544 ms)\n     Level 2\n       ✓ No tearing temporarily on update (14627 ms)\n       ✓ No tearing temporarily on mount (4569 ms)\n zustand\n   With useTransition\n     Level 1\n       ✓ No tearing finally on update (7994 ms)\n       ✓ No tearing finally on mount (4623 ms)\n     Level 2\n       ✓ No tearing temporarily on update (12966 ms)\n       ✓ No tearing temporarily on mount (4505 ms)\n     Level 3\n       ✕ Can interrupt render (time slicing) (7922 ms)\n       ✕ Can branch state (wip state) (6679 ms)\n   With useDeferredValue\n     Level 1\n       ✓ No tearing finally on update (9631 ms)\n       ✓ No tearing finally on mount (4641 ms)\n     Level 2\n       ✓ No tearing temporarily on update (14656 ms)\n       ✓ No tearing temporarily on mount (4544 ms)\n react-tracked\n   With useTransition\n     Level 1\n       ✓ No tearing finally on update (5586 ms)\n       ✓ No tearing finally on mount (9520 ms)\n     Level 2\n       ✓ No tearing temporarily on update (8625 ms)\n       ✓ No tearing temporarily on mount (9455 ms)\n     Level 3\n       ✓ Can interrupt render (time slicing) (3555 ms)\n       ✓ Can branch state (wip state) (8216 ms)\n   With useDeferredValue\n     Level 1\n       ✓ No tearing finally on update (15399 ms)\n       ✓ No tearing finally on mount (6528 ms)\n     Level 2\n       ✓ No tearing temporarily on update (19473 ms)\n       ✓ No tearing temporarily on mount (8479 ms)\n constate\n   With useTransition\n     Level 1\n       ✓ No tearing finally on update (4526 ms)\n       ✓ No tearing finally on mount (7464 ms)\n     Level 2\n       ✓ No tearing temporarily on update (8619 ms)\n       ✓ No tearing temporarily on mount (8491 ms)\n     Level 3\n       ✓ Can interrupt render (time slicing) (3635 ms)\n       ✓ Can branch state (wip state) (5159 ms)\n   With useDeferredValue\n     Level 1\n       ✓ No tearing finally on update (9626 ms)\n       ✓ No tearing finally on mount (6629 ms)\n     Level 2\n       ✓ No tearing temporarily on update (14643 ms)\n       ✓ No tearing temporarily on mount (5578 ms)\n react-hooks-global-state\n   With useTransition\n     Level 1\n       ✓ No tearing finally on update (7954 ms)\n       ✓ No tearing finally on mount (4564 ms)\n     Level 2\n       ✓ No tearing temporarily on update (12975 ms)\n       ✓ No tearing temporarily on mount (4525 ms)\n     Level 3\n       ✕ Can interrupt render (time slicing) (7896 ms)\n       ✕ Can branch state (wip state) (6648 ms)\n   With useDeferredValue\n     Level 1\n       ✓ No tearing finally on update (9624 ms)\n       ✓ No tearing finally on mount (4547 ms)\n     Level 2\n       ✓ No tearing temporarily on update (14636 ms)\n       ✓ No tearing temporarily on mount (4549 ms)\n use-context-selector-base\n   With useTransition\n     Level 1\n       ✓ No tearing finally on update (7851 ms)\n       ✓ No tearing finally on mount (8476 ms)\n     Level 2\n       ✓ No tearing temporarily on update (12836 ms)\n       ✓ No tearing temporarily on mount (8496 ms)\n     Level 3\n       ✕ Can interrupt render (time slicing) (7846 ms)\n       ✕ Can branch state (wip state) (7629 ms)\n   With useDeferredValue\n     Level 1\n       ✓ No tearing finally on update (9706 ms)\n       ✓ No tearing finally on mount (5650 ms)\n     Level 2\n       ✓ No tearing temporarily on update (14623 ms)\n       ✓ No tearing temporarily on mount (5590 ms)\n use-context-selector\n   With useTransition\n     Level 1\n       ✓ No tearing finally on update (5503 ms)\n       ✓ No tearing finally on mount (11504 ms)\n     Level 2\n       ✓ No tearing temporarily on update (8629 ms)\n       ✓ No tearing temporarily on mount (11478 ms)\n     Level 3\n       ✓ Can interrupt render (time slicing) (3565 ms)\n       ✓ Can branch state (wip state) (8202 ms)\n   With useDeferredValue\n     Level 1\n       ✓ No tearing finally on update (15341 ms)\n       ✓ No tearing finally on mount (6542 ms)\n     Level 2\n       ✓ No tearing temporarily on update (20063 ms)\n       ✓ No tearing temporarily on mount (8598 ms)\n use-subscription\n   With useTransition\n     Level 1\n       ✓ No tearing finally on update (7989 ms)\n       ✓ No tearing finally on mount (4610 ms)\n     Level 2\n       ✓ No tearing temporarily on update (12955 ms)\n       ✓ No tearing temporarily on mount (4541 ms)\n     Level 3\n       ✕ Can interrupt render (time slicing) (7947 ms)\n       ✕ Can branch state (wip state) (6656 ms)\n   With useDeferredValue\n     Level 1\n       ✓ No tearing finally on update (9612 ms)\n       ✓ No tearing finally on mount (4555 ms)\n     Level 2\n       ✓ No tearing temporarily on update (14580 ms)\n       ✓ No tearing temporarily on mount (4588 ms)\n apollo-client\n   With useTransition\n     Level 1\n       ✓ No tearing finally on update (8142 ms)\n       ✓ No tearing finally on mount (4638 ms)\n     Level 2\n       ✓ No tearing temporarily on update (13105 ms)\n       ✓ No tearing temporarily on mount (5551 ms)\n     Level 3\n       ✕ Can interrupt render (time slicing) (8083 ms)\n       ✕ Can branch state (wip state) (7756 ms)\n   With useDeferredValue\n     Level 1\n       ✓ No tearing finally on update (6514 ms)\n       ✓ No tearing finally on mount (5679 ms)\n     Level 2\n       ✓ No tearing temporarily on update (9692 ms)\n       ✓ No tearing temporarily on mount (4724 ms)\n recoil\n   With useTransition\n     Level 1\n       ✓ No tearing finally on update (8119 ms)\n       ✓ No tearing finally on mount (4729 ms)\n     Level 2\n       ✓ No tearing temporarily on update (13109 ms)\n       ✓ No tearing temporarily on mount (4670 ms)\n     Level 3\n       ✕ Can interrupt render (time slicing) (8047 ms)\n       ✕ Can branch state (wip state) (6808 ms)\n   With useDeferredValue\n     Level 1\n       ✓ No tearing finally on update (9780 ms)\n       ✓ No tearing finally on mount (4673 ms)\n     Level 2\n       ✓ No tearing temporarily on update (14784 ms)\n       ✓ No tearing temporarily on mount (4667 ms)\n recoil_UNSTABLE\n   With useTransition\n     Level 1\n       ✓ No tearing finally on update (5736 ms)\n       ✓ No tearing finally on mount (5624 ms)\n     Level 2\n       ✓ No tearing temporarily on update (8723 ms)\n       ✕ No tearing temporarily on mount (5586 ms)\n     Level 3\n       ✓ Can interrupt render (time slicing) (3763 ms)\n       ✕ Can branch state (wip state) (10277 ms)\n   With useDeferredValue\n     Level 1\n       ✓ No tearing finally on update (11399 ms)\n       ✓ No tearing finally on mount (5612 ms)\n     Level 2\n       ✓ No tearing temporarily on update (15529 ms)\n       ✕ No tearing temporarily on mount (5579 ms)\n jotai\n   With useTransition\n     Level 1\n       ✓ No tearing finally on update (5633 ms)\n       ✓ No tearing finally on mount (6580 ms)\n     Level 2\n       ✓ No tearing temporarily on update (9753 ms)\n       ✕ No tearing temporarily on mount (6550 ms)\n     Level 3\n       ✓ Can interrupt render (time slicing) (4707 ms)\n       ✕ Can branch state (wip state) (10238 ms)\n   With useDeferredValue\n     Level 1\n       ✓ No tearing finally on update (10713 ms)\n       ✓ No tearing finally on mount (6736 ms)\n     Level 2\n       ✓ No tearing temporarily on update (15726 ms)\n       ✕ No tearing temporarily on mount (5661 ms)\n use-atom\n   With useTransition\n     Level 1\n       ✓ No tearing finally on update (6616 ms)\n       ✓ No tearing finally on mount (9592 ms)\n     Level 2\n       ✓ No tearing temporarily on update (9713 ms)\n       ✓ No tearing temporarily on mount (9559 ms)\n     Level 3\n       ✓ Can interrupt render (time slicing) (4749 ms)\n       ✓ Can branch state (wip state) (9292 ms)\n   With useDeferredValue\n     Level 1\n       ✓ No tearing finally on update (16565 ms)\n       ✓ No tearing finally on mount (6647 ms)\n     Level 2\n       ✓ No tearing temporarily on update (20596 ms)\n       ✓ No tearing temporarily on mount (6604 ms)\n valtio\n   With useTransition\n     Level 1\n       ✓ No tearing finally on update (8087 ms)\n       ✓ No tearing finally on mount (4701 ms)\n     Level 2\n       ✓ No tearing temporarily on update (13031 ms)\n       ✓ No tearing temporarily on mount (4741 ms)\n     Level 3\n       ✕ Can interrupt render (time slicing) (8028 ms)\n       ✕ Can branch state (wip state) (6785 ms)\n   With useDeferredValue\n     Level 1\n       ✓ No tearing finally on update (9729 ms)\n       ✓ No tearing finally on mount (4694 ms)\n     Level 2\n       ✓ No tearing temporarily on update (14789 ms)\n       ✓ No tearing temporarily on mount (4682 ms)\n effector\n   With useTransition\n     Level 1\n       ✓ No tearing finally on update (8153 ms)\n       ✓ No tearing finally on mount (4653 ms)\n     Level 2\n       ✓ No tearing temporarily on update (13080 ms)\n       ✓ No tearing temporarily on mount (4668 ms)\n     Level 3\n       ✕ Can interrupt render (time slicing) (8003 ms)\n       ✕ Can branch state (wip state) (6776 ms)\n   With useDeferredValue\n     Level 1\n       ✓ No tearing finally on update (9689 ms)\n       ✓ No tearing finally on mount (4730 ms)\n     Level 2\n       ✓ No tearing temporarily on update (14725 ms)\n       ✓ No tearing temporarily on mount (4608 ms)\n react-rxjs\n   With useTransition\n     Level 1\n       ✓ No tearing finally on update (8066 ms)\n       ✓ No tearing finally on mount (4658 ms)\n     Level 2\n       ✓ No tearing temporarily on update (13040 ms)\n       ✓ No tearing temporarily on mount (4637 ms)\n     Level 3\n       ✕ Can interrupt render (time slicing) (8027 ms)\n       ✕ Can branch state (wip state) (6797 ms)\n   With useDeferredValue\n     Level 1\n       ✓ No tearing finally on update (9765 ms)\n       ✓ No tearing finally on mount (4625 ms)\n     Level 2\n       ✓ No tearing temporarily on update (14783 ms)\n       ✓ No tearing temporarily on mount (4642 ms)\n simplux\n   With useTransition\n     Level 1\n       ✓ No tearing finally on update (4613 ms)\n       ✓ No tearing finally on mount (8591 ms)\n     Level 2\n       ✓ No tearing temporarily on update (8730 ms)\n       ✓ No tearing temporarily on mount (8572 ms)\n     Level 3\n       ✓ Can interrupt render (time slicing) (3712 ms)\n       ✕ Can branch state (wip state) (9293 ms)\n   With useDeferredValue\n     Level 1\n       ✓ No tearing finally on update (9718 ms)\n       ✓ No tearing finally on mount (6708 ms)\n     Level 2\n       ✓ No tearing temporarily on update (14698 ms)\n       ✓ No tearing temporarily on mount (5680 ms)\n react-query\n   With useTransition\n     Level 1\n       ✓ No tearing finally on update (8131 ms)\n       ✓ No tearing finally on mount (4716 ms)\n     Level 2\n       ✕ No tearing temporarily on update (13174 ms)\n       ✓ No tearing temporarily on mount (4655 ms)\n     Level 3\n       ✕ Can interrupt render (time slicing) (8120 ms)\n       ✕ Can branch state (wip state) (6807 ms)\n   With useDeferredValue\n     Level 1\n       ✓ No tearing finally on update (9594 ms)\n       ✓ No tearing finally on mount (4665 ms)\n     Level 2\n       ✓ No tearing temporarily on update (13721 ms)\n       ✓ No tearing temporarily on mount (4653 ms)\n mobx-react-lite\n   With useTransition\n     Level 1\n       ✓ No tearing finally on update (4651 ms)\n       ✓ No tearing finally on mount (5610 ms)\n     Level 2\n       ✓ No tearing temporarily on update (8739 ms)\n       ✓ No tearing temporarily on mount (6586 ms)\n     Level 3\n       ✕ Can interrupt render (time slicing) (3692 ms)\n       ✕ Can branch state (wip state) (3071 ms)\n   With useDeferredValue\n     Level 1\n       ✓ No tearing finally on update (9777 ms)\n       ✓ No tearing finally on mount (6595 ms)\n     Level 2\n       ✓ No tearing temporarily on update (14724 ms)\n       ✓ No tearing temporarily on mount (6568 ms)\n\n```\n\u003c/details\u003e\n\n\u003ctable\u003e\n\u003ctr\u003e\u003cth\u003eTest\u003c/th\u003e\u003cth\u003e1\u003c/th\u003e\u003cth\u003e2\u003c/th\u003e\u003cth\u003e3\u003c/th\u003e\u003cth\u003e4\u003c/th\u003e\u003cth\u003e5\u003c/th\u003e\u003cth\u003e6\u003c/th\u003e\u003cth\u003e7\u003c/th\u003e\u003cth\u003e8\u003c/th\u003e\u003cth\u003e9\u003c/th\u003e\u003cth\u003e10\u003c/th\u003e\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003cth\u003e\u003ca href=\"https://react-redux.js.org\"\u003ereact-redux\u003c/a\u003e\u003c/th\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:x:\u003c/td\u003e\n\t\t\u003ctd\u003e:x:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003cth\u003e\u003ca href=\"https://github.com/pmndrs/zustand\"\u003ezustand\u003c/a\u003e\u003c/th\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:x:\u003c/td\u003e\n\t\t\u003ctd\u003e:x:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003cth\u003e\u003ca href=\"https://react-tracked.js.org\"\u003ereact-tracked\u003c/a\u003e\u003c/th\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003cth\u003e\u003ca href=\"https://github.com/diegohaz/constate\"\u003econstate\u003c/a\u003e\u003c/th\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003cth\u003e\u003ca href=\"https://github.com/dai-shi/react-hooks-global-state\"\u003ereact-hooks-global-state\u003c/a\u003e\u003c/th\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:x:\u003c/td\u003e\n\t\t\u003ctd\u003e:x:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003cth\u003e\u003ca href=\"https://github.com/dai-shi/use-context-selector\"\u003euse-context-selector\u003c/a\u003e (w/ useReducer, w/o useContextUpdate)\u003c/th\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:x:\u003c/td\u003e\n\t\t\u003ctd\u003e:x:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003cth\u003e\u003ca href=\"https://github.com/dai-shi/use-context-selector\"\u003euse-context-selector\u003c/a\u003e (w/ useReducer)\u003c/th\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003cth\u003e\u003ca href=\"https://github.com/facebook/react/tree/master/packages/use-subscription\"\u003euse-subscription\u003c/a\u003e (w/ redux)\u003c/th\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:x:\u003c/td\u003e\n\t\t\u003ctd\u003e:x:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003cth\u003e\u003ca href=\"https://github.com/apollographql/apollo-client\"\u003eapollo-client\u003c/a\u003e\u003c/th\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:x:\u003c/td\u003e\n\t\t\u003ctd\u003e:x:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003cth\u003e\u003ca href=\"https://recoiljs.org\"\u003erecoil\u003c/a\u003e\u003c/th\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:x:\u003c/td\u003e\n\t\t\u003ctd\u003e:x:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003cth\u003e\u003ca href=\"https://recoiljs.org\"\u003erecoil (UNSTABLE)\u003c/a\u003e\u003c/th\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:x:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:x:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:x:\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003cth\u003e\u003ca href=\"https://github.com/pmndrs/jotai\"\u003ejotai\u003c/a\u003e\u003c/th\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:x:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:x:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:x:\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003cth\u003e\u003ca href=\"https://github.com/dai-shi/use-atom\"\u003euse-atom\u003c/a\u003e\u003c/th\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003cth\u003e\u003ca href=\"https://github.com/pmndrs/valtio\"\u003evaltio\u003c/a\u003e\u003c/th\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:x:\u003c/td\u003e\n\t\t\u003ctd\u003e:x:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003cth\u003e\u003ca href=\"https://github.com/zerobias/effector\"\u003eeffector\u003c/a\u003e\u003c/th\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:x:\u003c/td\u003e\n\t\t\u003ctd\u003e:x:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003cth\u003e\u003ca href=\"https://react-rxjs.org\"\u003ereact-rxjs\u003c/a\u003e\u003c/th\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:x:\u003c/td\u003e\n\t\t\u003ctd\u003e:x:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003cth\u003e\u003ca href=\"https://github.com/MrWolfZ/simplux\"\u003esimplux\u003c/a\u003e\u003c/th\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:x:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003cth\u003e\u003ca href=\"https://react-query.tanstack.com/\"\u003ereact-query\u003c/a\u003e\u003c/th\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:x:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:x:\u003c/td\u003e\n\t\t\u003ctd\u003e:x:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003cth\u003e\u003ca href=\"https://github.com/mobxjs/mobx-react-lite\"\u003emobx-react-lite\u003c/a\u003e\u003c/th\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:x:\u003c/td\u003e\n\t\t\u003ctd\u003e:x:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\u003c/tr\u003e\n\n\u003c/table\u003e\n\n## Caveats\n\n- Tearing and state branching may not be an issue depending on app requirements.\n- The test is done in a very limited way.\n  - Passing tests don't guarantee anything.\n- The results may not be accurate.\n  - Do not fully trust the results.\n\n## If you are interested\n\nThe reason why I created this is to test my projects.\n\n- [react-tracked](https://github.com/dai-shi/react-tracked)\n- [use-context-selector](https://github.com/dai-shi/use-context-selector)\n- and so on\n\n## Contributing\n\nThis repository is a tool for us to test some of global state libraries.\nWhile it is totally fine to use the tool for other libraries under the license,\nwe don't generally accept adding a new library to the repository.\n\nHowever, we are interested in various approaches.\nIf you have any suggestions feel free to open issues or pull requests.\nWe may consider adding (and removing) libraries.\nQuestions and discussions are also welcome in issues.\n\nFor listing global state libraries, we have another repository\nhttps://github.com/dai-shi/lets-compare-global-state-with-react-hooks\nin which we accept contributions. It's recommended to run this tool\nand we put the result there, possibly a reference link to a PR\nin this repository or a fork of this repository.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdai-shi%2Fwill-this-react-global-state-work-in-concurrent-rendering","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdai-shi%2Fwill-this-react-global-state-work-in-concurrent-rendering","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdai-shi%2Fwill-this-react-global-state-work-in-concurrent-rendering/lists"}