Clarifying the goals of this project #257
Description
I think I’m getting a little confused by the goals and the scope of this project. I’d appreciate @jlongster weighing in on this.
I see a few things it does right now:
- (1) Provides
state.routing
for other middleware, components, and action creators to read. I believe this is problematic: it doesn’t match the rendered route because of the potential for async transitions in between. This is the reason we warn people not to usestate.routing
inmapStateToProps()
which I believe is confusing, and even if they don’t use it in components, they still might use it in action creators and expect it to correspond to the router’s current state. So I’m not sure whether this is a good feature to keep. - (2) Provides an actions-first interface to side effects of
history
. While this may be convenient, I think the reason people want this is not because actions are the best interface for causing routing changes, but rather because people don’t want to deal withcontext
or passhistory
around. Many people are also feeling pressured to express everything with Redux primitives (actions) even if the problem at hand is not expressed with them well. Consider thathistory.pushState()
is not much different fromfetch()
(it’s a side effect) but nobody expects us to provide “fetch
action creators”. The real problem here seems to be the perceived difficulty of passinghistory
around or importing it, rather than the need for history updates to be actions. - (3) Allows replaying the history changes from DevTools or another action replay mechanism. This is where it gets interesting. It seems to me that the ability to persist routing state together with everything else and re-render the app based on current state rather than what the browser thinks was the original point of this library. This feature seems to explain the need for action creators: you want navigations to be in the log so they can potentially be replayed. However such functionality would only be useful in dev (or otherwise special) environment.
As we evolve (or not evolve) this library, I want to better understand which of these points are actually important to the author, and which are just a byproduct of current user habits and their desire to express everything “the Redux way”.
Essentially, I want to understand what value react-router-redux
brings over react-router
+ history
in production mode other than the familiar mental model (“just dispatch actions”), the ability to reach out into state.routing
(which can be dangerous and may not reflect the UI but can be convenient for apps without async transitions), and not having to think about how to access history
without passing it around.
In no way am I trying to diminish the work being done here. I just want to figure out for myself whether presistence/time-travely part of this library could be a separate dev-only project, and whether what would be left is not essentially a feature request for better documentation and less ceremony when accessing history
from action creators and other middleware.
Thank you!