# State Management Bonanza!
## Redux
**Size:** 4.3kb
**Deps:** None.
**Style:** Stripped down, functional, composable, opinionated
**Stars:** 57.3k
**Quality of docs:** Damn good.
**Tools:** redux-toolkit (10.3kb), immer(15.9kb), and react-redux(16.9kb)
**Ease of use:** Tough short-term, better in the long term.
**Speed of dev:** Same as above.
**Reliability:** Rock-solid. Redux itself has 9 well-used, well-tested functions.
### Pros
- Very small surface area (9 functions)
- Functional library (deterministic/reliable)
- Enforces functional patterns (compose/pipe style data piplines)
- Very flexible
- Extremely composable
- State subscribers (might allow us to not reload all app data after TX)
- great at organizing utilities (actionCreators, bindActionCreators)
- **BIG PRO:** Actions trigger across the entire state tree. Creates event based systems that can change state across the entire app deterministically.
- Selectors greatly limit rendering vs. Context API
- A single store and low-level composability allows us to clean up the TX process and give it more powers.
- Helps with many of the data aggregation utilities we currently do manually (ex. finding a token's data or finding a member).
- The chome extension is amazing. Allows us to see changes that happen to state, rewind, fast-forward, write actions directly into the console, and export state.
### Cons
- Can be tedious (requires lots of boilerplate w/ out reduxToolkit)
- Heavily opinionated. Enforces a strict functional approach. (reduxToolkit/Immer does take away some of this pain, but adds a lot of abstraction)
- Async is challenging. Requires Thunks.
- React/redux hooks are not functional and makes it hard to test components in isolation
- React/redux connect API is functional and good for testing, but cumbersome (invloves wrapping stateless components in stateful logic wrappers).
- My guess is that Redux will be pretty tough for new devs.
- Redux relies on us ensuring that we're following the functional mindset of redux. If we don't, it becomes an anti-pattern.
- Adds friction for hacking stuff together, new devs, or devs who aren't familiar w/ functional-style JS.
### Questions/Thoughts
- One of the biggest no-nos with Redux is that we should not have more than one store of state. If we want to turn DAO state management into a library, and the application developer would like their own central store of state, would we be forcing people into an anitpattern?
## XState
**Size:** 65.5kb
**Deps:** None.
**Style:** Very opinionated, formalized, visual, luxurious
**Stars:** 18.4k
**Quality of docs:** Pretty good.
**Tools:** @xstate/react (9.1kb),@xstate/test (13.2kb), and @xstate/inspect(8.2kb)
**Ease of use:** Tough short-term. Not sure about longterm.
**Speed of dev:** Same as above.
**Reliability:** Seems pretty reliable.
### Pros
- State machines are easily visualized in a state chart
- Statecharts can even be self-documenting (derived from code)
- Statecharts can be read by new or non-devs
- Great for conceptualizing logic and spotting errors before we even start coding.
- Comprehensive test coverage
- Accomidates late-breaking changes
- Finite state machines ensure that
- always starts with an initial state
- state can only be one thing
- specific events fire specific state changes
- State can only be changed from specific states. This is managed by transitions.
- Not only do these constraints solve application complexity by managing state, they force developers to think about modelling state, and could possibly lead to better decisions.
### Cons
- Cumbersome, requires a lot of charting and planning instead of coding.
- Heavy methodology and discipline. Will require some background learning on state machines
- Less documented and supported than Redux
- Less portable than Redux
- Modeling state using nested object statements is verbose
## Conclusions
-