From aa159bf42273f79277100cc0d5c4b38393fd5bc8 Mon Sep 17 00:00:00 2001 From: robsutcliffe <rob@firefields.com> Date: Fri, 13 Sep 2024 13:11:55 +0200 Subject: [PATCH] redux post --- .idea/.gitignore | 8 ++ data/blog/benefits-of-redux.mdx | 107 ++++++++++++++++++ .../posts/redux-time-travel-debugging.webp | Bin 0 -> 22248 bytes 3 files changed, 115 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 data/blog/benefits-of-redux.mdx create mode 100644 public/static/images/posts/redux-time-travel-debugging.webp diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/data/blog/benefits-of-redux.mdx b/data/blog/benefits-of-redux.mdx new file mode 100644 index 0000000..143acda --- /dev/null +++ b/data/blog/benefits-of-redux.mdx @@ -0,0 +1,107 @@ +--- +title: The Benefits of Redux? +date: '2024-09-12' +tags: ['state management'] +draft: false +summary: Redux continues to be a popular choice for large-scale applications, offering predictable state updates, powerful debugging tools, and scalability that supports collaboration in larger teams. +images: ['/static/images/posts/redux-time-travel-debugging.webp'] +--- + +## The Benefits of Redux? + +Redux is more complicated to set up than most state management tools. However, setup is a tiny part of the time we spend developing, and we almost always prefer a more complex setup over a more complicated maintenance. With all the new state management tools and the option to simply use [useContext](https://react.dev/reference/react/useContext), we often ask, Is Redux still the best choice for state management? +Here are several things to consider when asking this question: + +## Immutable Data + +Immutability is a core concept in functional programming. We never change a state object; we throw it out and save a whole new object. It's a way to ensure that our state is predictable and easy to reason about. + +This leaves us with two questions: +1. Does this trigger extra re-renders? +2. Does this take up extra memory? + +The answer to both of these questions is no. Redux uses structure sharing, meaning it reuses unchanged parts of the object. This prevents unnecessary memory usage and avoids extra re-renders when the value remains the same. + +**Bonus tip:** Use a library like [immer](https://github.com/immerjs/immer) to help us when updating the state because we can turn code that looks like this: +```js + return { + ...state, + user: { + ...state.user, + address: { + ...state.user.address, + city: action.payload.city + } + } + } +``` +Into this: +```js +return produce(state, draftState => { + draftState.user.address.city = action.payload.city +}) +``` +Essentially letting us create a completely new state object without mutating the old one. But with much cleaner code. +While many state managers have ways to enforce immutability, Redux enforces immutability by default. Having an opinionated approach is useful here as we know from anywhere in our code that we're not mutating our state, and neither is any other developer. +## Reducers and Pure Functions + +In functional programming, we require our functions to be pure and meet the following criteria: +1. In must be **deterministic**, meaning that given the same input, it will always produce the same output. +2. It must have **no side effects**, it can not interact with anything outside the function. + +One type of pure function is a reducer. A reducer reduces multiple inputs into a single output. It's a pure function because it always produces the same output given the same input. It can be used to update state. + +```js +function counterReducer(state, action) { + switch (action.type) { + case 'increment': + return { count: state.count + 1 }; + case 'decrement': + return { count: state.count - 1 }; + default: + return state; + } +} +``` +The above code has the following benefits in a React application: +- It can be tested as a unit. +- We can reason about it and predict the output more easily. +- We can debug it more quickly, especially with our next point. + +## Time-Travel Debugging + +Redux has the most evolved community and ecosystem, and with that come the best dev tools. One of the features of the dev tools that we only have because of Redux's enforced immutability is time-travel debugging. We can skip back and forth through our application's state and see how it changes over time. + + + +## Middleware + +I/O tasks are inherently not pure functions. They interact with something outside the function. This is an issue when we use functional programming in web development. Take this function for example: + +```js +async function fetchData(state, userId) { + const data = await fetch(`https://api.example.com/user/${userId}`); + produce(state, draftState => { + draftState.user = data.user + }) +} +``` + +We could make this function deterministic, but it will always interact with an API, so it will always have side effects. We can reduce exposure to the impure function by using middleware. + +```js +function fetchData(state, userId) { + return async dispatch => { + const data = await fetch(`https://api.example.com/user/${userId}`); + dispatch({ type: 'FETCH_USER_SUCCESS', payload: data.user }) + } +} +``` + +While async functions aren't strictly impure, they often involve I/O tasks, introducing unpredictability. Middleware in Redux helps manage these side effects, ensuring that asynchronous logic doesn't directly affect the rest of your application's state. + +## Scaling + +A lot of the above benefits can be added to other state management tools. But redux enforces them. Redux also encourages keeping all this state in a single centralised global state. Giving confidence to scaling teams and improving the developer experience. A developer has a finite amount of working memory, and we should write code in a way that doesn't overload the developer's memory. + +Anything that improves the developer experience of a large and growing team also helps a team of one on a relatively small project. This is because you can't remember all the code in between development sessions. It would help if you treated yourself as a different developer, and for that reason, redux is still the best choice for state management. \ No newline at end of file diff --git a/public/static/images/posts/redux-time-travel-debugging.webp b/public/static/images/posts/redux-time-travel-debugging.webp new file mode 100644 index 0000000000000000000000000000000000000000..1d366255c34ddfdc0cdcf7b2faf605d2db2a3838 GIT binary patch literal 22248 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 Ts9|t_zoVRZfja+Zg8Y8~=&D1W literal 0 HcmV?d00001