Immer
는Redux
의 불변성 문제를 해결하는 간편화 라이브러리
Reducer
는 앞선 포스팅에서 설명했듯 불변성을 지키며 이전 상태를 Action
을 통해 다음 상태로 만드는 함수다.
하지만 이 과정에서 불변성을 지키는 과정은 굉장히 비효율적이다.
그래서 이러한 단점을 해결하기 위해 Immer
라는 라이브러리를 사용한다.
Immer
는 draft
인자를 사용해 현재 상태값을 복사한 뒤 이를 참조하여 새로운 상태를 return
한다.
사용하는 방법은 다음과 같다.
Immer
를 설치npm i immer
Immer
를 적용// 기존 코드
const reducer = (state = initialState, action) => {
switch (action.type) {
case ADD_POST_REQUEST:
return {
...state,
name = 'Mirrer',
age = 20,
gender = 'Man',
}
}
}
// immer 적용
const reducer = (state = initialState, action) => {
return produce(state, (draft) => {
switch (action.type) {
case ADD_POST_REQUEST:
draft.name = 'Change Miirer',
draft.age = 30,
draft.gender = 'Women',
break;
}
})
}
Internet Explorer
환경에서 Immer
를 사용하기 위해서는 다음과 같은 추가 설정이 필요하다.
단,
Internet Explorer 11
이외에는 적용되지 않는다.
util/produce.js
파일을 생성하여 아래와 같이 enableES5
를 설정기존에는 Entry Point
, 즉 프로젝트의 최상단에 적용하면 된다.
하지만 Next.js
에는 React Dom
의 Render
가 존재하지 않아 다음과 같이 produce
를 직접 확장한다.
// util/produce.js
import produce, { enableES5 } from 'immer';
export default (...args) => {
enableES5(); // produce 전 enableES5함수를 실행
return produce(...args);
};
Reducer
를 다음과 같이 수정하여 enableES5
를 적용한다.// reducers/post.js
import produce from '../util/produce';
export const initialState = {
:
:
}