Redux 작가는 여기!
돌아 오는이 아닌 그 플럭스는 다른. 전반적으로 아키텍처는 동일하지만 Redux는 Flux가 콜백 등록을 사용하는 기능 구성을 사용하여 복잡성을 줄일 수 있습니다.
Redux에는 근본적인 차이가 없지만 Flux에서는 구현하기 어렵거나 불가능한 특정 추상화를 더 쉽게 구현하거나 구현하기가 가능하게 만듭니다.
감속기 구성
예를 들어 페이지 매김을 고려하십시오. 내 Flux + React Router 예제 는 페이지 매김을 처리하지만 그 코드는 끔찍합니다. 그것이 끔찍한 이유 중 하나는 Flux가 상점 전체에서 기능을 재사용하는 것이 부자연 스럽기 때문입니다. 두 개의 상점이 다른 조치에 대한 응답으로 페이지 매김을 처리해야하는 경우, 공통 기본 상점에서 상속하거나 (상속성을 사용할 때 특정 디자인에 자신을 고정하고 있음) 내부에서 외부 정의 함수를 호출해야합니다. Flux 스토어의 프라이빗 상태에서 어떻게 든 작동해야하는 이벤트 핸들러. 모든 것이 지저분합니다 (확실히 가능한 영역에 있지만).
반면에 Redux 페이지 매김은 감속기 구성 덕분에 자연 스럽습니다. 감속기가 완전히 내려가므로 페이지 매김 감속기를 생성 하는 감속기 팩토리를 작성한 다음 감속기 트리에서 사용할 수 있습니다 . Flux에서는 상점이 평평하지만 Redux에서는 React 구성 요소를 중첩 할 수있는 것처럼 기능 구성을 통해 감속기를 중첩 할 수 있기 때문에 그렇게 쉬운 이유는 열쇠 입니다.
이 패턴은 또한 비 사용자 코드 실행 취소 / 다시 실행 과 같은 훌륭한 기능을 가능하게 합니다. Undo / Redo를 Flux 앱에 두 줄의 코드로 연결하는 것을 상상할 수 있습니까? 거의. Redux를 사용하면 감소하는 컴포지션 패턴 덕분에 더욱 그렇습니다. Flux의 영향을받은 Elm Architecture 에서 개척되고 자세히 설명 된 패턴 입니다.
서버 렌더링
사람들은 Flux를 사용하여 서버에서 정상적으로 렌더링을 해왔지만, 각각 20 개의 Flux 라이브러리가 서버 렌더링을 "보다 쉽게"만들려고 시도하는 것을 보았을 것입니다. 사실 페이스 북은 서버 렌더링을 많이하지 않으므로 그에 대해 크게 신경 쓰지 않았으며 더 쉽게 만들기 위해 생태계에 의존합니다.
전통적인 Flux에서 상점은 싱글 톤입니다. 이것은 서버에서 다른 요청에 대한 데이터를 분리하기 어렵다는 것을 의미합니다. 불가능하지는 않지만 어렵다. 그렇기 때문에 대부분의 Flux 라이브러리 (및 새로운 Flux Utils )는 이제 싱글 톤 대신 클래스를 사용하도록 제안하므로 요청 당 상점을 인스턴스화 할 수 있습니다.
Flux에서 해결해야 할 다음과 같은 문제가 여전히 있습니다 (자체 또는 Flummox 또는 Alt 와 같은 자주 사용하는 Flux 라이브러리의 도움으로 ).
- 상점이 클래스 인 경우 요청에 따라 디스패처를 사용하여이를 작성하고 파기하는 방법 언제 상점을 등록합니까?
- 상점에서 데이터를 수화하고 나중에 클라이언트에서 다시 수화하는 방법은 무엇입니까? 이를 위해 특별한 방법을 구현해야합니까?
틀림없이 Flux 프레임 워크 (바닐라 플럭스가 아님)에는 이러한 문제에 대한 해결책이 있지만 지나치게 복잡합니다. 예를 들어, 실패하다 당신이 구현하도록 요구 serialize()
하고 deserialize()
당신의 상점에서 . Alt는 takeSnapshot()
JSON 트리에서 상태를 자동으로 직렬화 하는 기능 을 제공하여 이러한 문제를 해결합니다 .
Redux는 더 나아갑니다. 다수의 감속기가 관리하는 단일 매장이 있기 때문에 (재) 수화를 관리하기 위해 특별한 API가 필요하지 않습니다. 상점을 "세척"하거나 "수화"할 필요는 없습니다. 단 하나의 상점 만 있으며 현재 상태를 읽거나 새로운 상태의 새 상점을 만들 수 있습니다. 각 요청은 별도의 상점 인스턴스를 얻습니다. Redux를 사용한 서버 렌더링에 대해 자세히 알아보십시오.
다시 말하지만, 이것은 Flux와 Redux에서 가능한 일이지만 Flux 라이브러리는 많은 API와 규칙을 도입 하여이 문제를 해결하며 Redux는 문제가 없기 때문에 해결할 필요조차 없습니다. 개념적 단순성 덕분에 1 위.
개발자 경험
나는 실제로 Redux가 인기있는 Flux 라이브러리가 될 의도는 없었습니다 . 시간 여행과 함께 핫 리로딩에 대한 ReactEurope 강의를 진행하면서 썼습니다 . 나는 한 가지 주요 목표를 가지고 있었다. 즉, 리듀서 코드를 즉석에서 변경하거나 심지어 행동을 건너 뛰어“과거를 변경”할 수있게하고 상태가 다시 계산되는 것을 볼 수있게한다.
나는 이것을 할 수있는 단일 Flux 라이브러리를 보지 못했습니다. 또한 React Hot Loader를 사용하면이 작업을 수행 할 수 없습니다. 실제로 Flux 스토어를 사용하여 수행 할 작업을 모르기 때문에 편집하면 중단됩니다.
Redux가 리듀서 코드를 다시로드해야 할 때이 코드를 호출 replaceReducer()
하면 앱이 새 코드로 실행됩니다. Flux에서는 Flux 스토어에 데이터와 함수가 얽혀 있으므로 "기능 만 교체"할 수 없습니다. 또한 Dispatcher에 새 버전을 다시 등록해야합니다. Redux에는없는 것입니다.
생태계
Redux는 풍부하고 빠르게 성장하는 생태계를 가지고 있습니다. 미들웨어 와 같은 몇 가지 확장 점을 제공하기 때문 입니다. 로깅 , 약속 지원 , 관찰 가능 , 라우팅 , 불변성 개발 확인 , 지속성 등과 같은 사용 사례 를 염두에두고 설계되었습니다. 이 모든 것이 유용하지는 않지만, 쉽게 결합하여 함께 작동 할 수있는 일련의 도구에 액세스하는 것이 좋습니다.
간단
Redux는 Flux의 모든 이점 (작업 기록 및 재생, 단방향 데이터 흐름, 종속 돌연변이)을 유지하고 Dispatcher 및 상점 등록을 도입하지 않고도 새로운 이점 (쉬운 실행 취소, 다시로드, 핫 리로딩)을 추가합니다.
높은 수준의 추상화를 구현하는 동안 제정신을 유지하기 때문에 단순하게 유지하는 것이 중요합니다.
대부분의 Flux 라이브러리와 달리 Redux API 표면은 작습니다. 개발자 경고, 설명 및 위생 검사를 제거하면 99 줄 입니다. 디버깅 할 까다로운 비동기 코드는 없습니다.
실제로 읽고 Redux를 모두 이해할 수 있습니다.
Fluux와 비교하여 Redux 사용의 단점에 대한 내 대답을 참조하십시오 .