Redux와 RxJS, 어떤 유사점?


113

저는 Redux가 Flux의 더 나은 "구현"이라는 것을 알고 있습니다. 또는이를 단순화하기위한 재 설계 (애플리케이션 상태 관리)라고 말하는 것이 좋습니다.

반응 형 프로그래밍 (RxJS)에 대해 많이 들었지만 아직 배우지 않았습니다.

그래서 제 질문은이 두 기술 사이에 어떤 공통점이 있습니까? 아니면 상호 보완 적입니까? ... 아니면 완전히 다른가요?

답변:


185

요컨대, 그들은 매우 다른 목적을 위해 매우 다른 라이브러리이지만 예, 모호한 유사점이 있습니다.

Redux는 애플리케이션 전체에서 상태를 관리하기위한 도구입니다. 일반적으로 UI의 아키텍처로 사용됩니다. Angular의 (절반) 대안으로 생각하십시오.

RxJS는 반응 형 프로그래밍 라이브러리입니다. 일반적으로 JavaScript에서 비동기 작업을 수행하는 도구로 사용됩니다. 약속의 대안으로 생각하십시오.


리 액티브 프로그래밍은 데이터 변화가 멀리서 관찰되는 패러다임 (작업 및 사고 방식) 입니다. 데이터는 멀리서 변경 되지 않습니다 .

다음은 거리에서 변경된 예입니다 .

// In the controller.js file
model.set('name', 'George');

모델 변경 컨트롤러에서.

다음은 멀리서 관찰 한 예입니다 .

// logger.js
store.subscribe(function (data) {
    console.log(data);
});

Logger에서는 Store에서 (먼 거리에서) 발생하는 데이터 변경 사항을 관찰하고 콘솔에 씁니다.


Redux는 Reactive 패러다임을 약간 사용합니다. Store는 반응 적입니다. 멀리서 내용을 설정하지 않습니다. 그것이 store.set()Redux에 없는 이유 입니다. 스토어는 멀리서 행동을 관찰하고 스스로 변화합니다. 그리고 Store는 다른 사람들이 멀리서도 데이터를 관찰 할 수 있도록합니다.

RxJS는 또한 Reactive 패러다임을 사용하지만 아키텍처가 아닌 이 "원거리 관찰"패턴을 달성하기 위해 기본적인 빌딩 블록 인 Observables를 제공합니다 .

결론적으로, 다른 목적을 위해 매우 다른 것들이 있지만 몇 가지 아이디어를 공유하십시오.


4
아니요, 함께 사용해서는 안됩니다. 사람들은 Rx를 사용하여 Redux를 에뮬레이션했습니다. 빠른 Google이 당신을위한 예를 찾을 것입니다. 반응 형 UI에 Rx를 사용하려면 Andre의 프레임 워크 인 Cycle.js를 확인하세요. 나는 최근에 그것을 사용하고 있으며 환상적입니다. 최근 API가 많이 바뀌었지만 마침내 일부를 동결하기 시작했다고 생각합니다.
Joel Dentici 2015

17
에 따라 공식 REDUX 문서 , "그들은 서로 잘 작동합니다."
galki

12
그들은 함께 잘 작동합니다! Redux 작업에 RxJS 및 Observable을 사용할 수있는 기회를 제공하는 Redux 미들웨어가 있습니다. github.com/redux-observable/redux-observable 또한 내가 어떻게에 대한 블로그 포스트를 작성했습니다 : robinwieruch.de/redux-observable-rxjs
로빈 Wieruch

1
Redux 패러다임은 내 Android 프로젝트 코드베이스를보다 반응 적으로 만드는 데 도움이되었습니다. RxJava와 함께 상태를 업데이트하기 위해 버튼 및 기타 필드에서 오는 데이터 흐름은 우리의 가독성과 성능을 강화했습니다. 라이브러리는 확실히 함께 잘 어울리고 그 이점은 언어에 구애받지 않습니다.
Kenny Worden

그들은 서로 잘 작동하지만, 실제로는 반응성이 돌아 오는이 어떻게 할 것인지 당신을 위해 할 수있는 - 모델로 구성 요소의 상태 동기화, 너무 자주 훨씬 감각을 모두 사용하지 않습니다
필립 Sobczak

32

그들은 매우 다른 것들입니다.

RxJS는 리 액티브 프로그래밍을 수행하는 데 사용할 수 있으며 250 명 이상의 운영자가있는 매우 철저한 라이브러리입니다.

그리고 Redux는 github repo "Redux는 JavaScript 앱을위한 예측 가능한 상태 컨테이너"에 설명되어 있습니다.

Redux는 앱에서 상태를 처리하는 도구 일뿐입니다. 그러나 이에 비해 RxJS만으로 전체 앱을 빌드 할 수 있습니다.

도움이 되었기를 바랍니다 :)


3
귀하의 대답은 @cmdv도 좋습니다. 내 글을 쓸 때 보지 못했어요.
André Staltz 2015

4

Redux 는 업데이트 작업에 대해 잘 정의 된 표준과 함께 제공되는 상태 관리 라이브러리입니다. 표준을 고수하는 한 데이터 흐름을 정상적이고 추론하기 쉽게 유지할 수 있습니다. 또한 미들웨어 및 스토어 인핸서를 사용하여 데이터 흐름을 향상시키는 기능을 제공합니다.

RxJS 는 반응 형 프로그래밍을위한 툴킷입니다. 실제로 앱에서 일어나는 모든 일을 스트림으로 생각할 수 있습니다. RxJS는 이러한 스트림을 관리하기위한 매우 풍부한 도구 세트를 제공합니다.

RxJS와 Redux가 가로채는 곳은 어디입니까? redux에서는 액션으로 상태를 업데이트하고 분명히 이러한 액션을 스트림으로 취급 할 수 있습니다. redux-observable (필요하지 않음)과 같은 미들웨어를 사용하여 소위 "비즈니스 로직"을 반응 적으로 구현할 수 있습니다. 또 다른 한 가지는 redux 저장소에서 관찰 가능 항목을 만들 수 있다는 것입니다.


2

간단히 말하면 :

Redux : 상태 관리에 사용되는 Flux 영감 라이브러리 .

RxJS : "Streams"(Observables 등)를 처리하는 데 사용되는 반응 형 프로그래밍 철학에 기반한 또 다른 Javascript 라이브러리입니다. [스트림 개념을 이해하기 위해 반응 형 프로그래밍에 대해 읽어보십시오].


1

Redux에서 영감을 얻은 RxJS 코드를 만들 때와 약간의 실용적인 차이점을 추가하고 싶었습니다.

각 작업 유형을 Subject 인스턴스에 매핑했습니다. 각 상태 저장 구성 요소에는 감속기 함수로 매핑되는 주제가 있습니다. 모든 감속기 스트림은 결합 된 merge다음 scan상태 를 출력합니다. 기본값 startWithscan. 나는 publishReplay(1)상태를 위해 사용 했지만 나중에 제거 할 수 있습니다.

반응 순수 렌더링 기능은 모든 생산자 / 주제를 전송하여 이벤트 데이터를 생성하는 위치에만 있습니다.

하위 구성 요소가있는 경우 해당 상태가 자신의 상태로 결합되는 방식을 설명해야합니다. combineLatest좋은 출발점이 될 수 있습니다.

구현의 주목할만한 차이점 :

  • 미들웨어가 없으며 rxjs 연산자 만 있습니다. 이것이 가장 큰 힘이자 약점이라고 생각합니다. 여전히 개념을 빌릴 수는 있지만 redux 및 cycle.js와 같은 자매 커뮤니티의 도움을받는 것은 또 다른 맞춤형 솔루션이기 때문에 어렵습니다. 그래서이 텍스트에서 "우리"대신 "나"를 써야합니다.

  • 액션 유형에 대한 스위치 / 케이스 또는 문자열이 없습니다. 액션을 더 역동적으로 분리하는 방법이 있습니다.

  • rxjs는 다른 곳에서 도구로 사용할 수 있으며 상태 관리에 포함되지 않습니다.

  • 작업 유형 (?)보다 생산자가 적습니다. 나는 이것에 대해 잘 모르겠지만 자식 구성 요소를 수신하는 부모 구성 요소에서 많은 반응을 가질 수 있습니다. 이는 덜 명령적인 코드와 덜 복잡함을 의미합니다.

  • 솔루션을 소유합니다. 프레임 워크가 필요하지 않습니다. 좋은것과 나쁜 것. 어쨌든 자신의 프레임 워크를 작성하게됩니다.

  • 훨씬 더 프랙탈 적이며 하위 트리 또는 앱 상태 트리의 여러 부분에서 변경 사항을 쉽게 구독 할 수 있습니다.

    • redux-obseravble이하는 것처럼 서사시를하는 것이 얼마나 쉬운 지 생각해보세요. 정말 쉽습니다.

또한 하위 구성 요소가 스트림으로 설명되는 훨씬 더 큰 이점을 위해 노력하고 있습니다. 즉, 컴포넌트 구조를 기반으로 상태를 재귀 적으로 결합 ( "그냥") 할 수 있기 때문에 리듀서에서 부모와 자식 상태를 컴파일 할 필요가 없습니다.

또한 React가 반응 상태를 더 잘 처리 할 때까지 반응을 건너 뛰고 snabbdom 또는 다른 것으로 이동하는 것에 대해 생각합니다. props를 통해 다시 분해하기 위해 상태를 위로 만들어야하는 이유는 무엇입니까? 그래서 Snabbdom으로이 패턴의 버전 2를 만들려고합니다.

다음은 state.ts 파일이 상태 스트림을 빌드하는 더 고급이지만 작은 스 니펫입니다. 이것은 유효성 검사 규칙 및 CSS 스타일을 사용하여 필드 (입력) 개체를 가져 오는 ajax 양식 구성 요소의 상태입니다. 이 파일에서는 필드 이름 (객체 키)을 사용하여 모든 하위 상태를 양식 상태로 결합합니다.

export default function create({
  Observable,
  ajaxInputs
}) {
  const fieldStreams = Object.keys(ajaxInputs)
  .map(function onMap(fieldName) {
    return ajaxInputs[fieldName].state.stream
    .map(function onMap(stateData) {
      return {stateData, fieldName}
    })
  })

  const stateStream = Observable.combineLatest(...fieldStreams)
  .map(function onMap(fieldStreamDataArray) {
    return fieldStreamDataArray.reduce(function onReduce(acc, fieldStreamData) {
    acc[fieldStreamData.fieldName] = fieldStreamData.stateData
    return acc
  }, {})
  })

  return {
    stream: stateStream
  }
}

코드가 개별적으로 많이 말하지 않을 수도 있지만 상태를 상향으로 구축하는 방법과 동적 이벤트를 쉽게 생성 할 수있는 방법을 보여줍니다. 지불해야 할 대가는 다른 스타일의 코드를 이해해야한다는 것입니다. 그리고 나는 그 대가를 치르는 것을 좋아합니다.


1 년 후, 방금 귀하의 답변을 찾았으며 여전히 유효하다고 생각합니다! 나는 비슷한 일을했고 당신의 모든 요점에 동의합니다. 그러나 여하튼 질문 : 당신은 오늘날에도 여전히 똑같은 생각을하고 있습니까?
Xceno

1
Redux의 스위치 / 케이스 및 액션 유형에 대한 비판을 수정해야합니다. 나는 여전히 똑같은 방식으로 코드를 작성하지만 서버 측에서 작동하도록 노력하고 있습니다. React 코드에 관해서는 감속기 / 업데이터를 만드는 데 도움이되는 작은 유틸리티를 관리했습니다. 그래서 저는 여전히 똑같은 일을하고 있지만 조금 더 세련되었습니다. 가장 큰 변화는 각 리프 노드가 componentDidMount에서 스트림을 구독하고 componentDidUnmount에서 구독을 취소하도록한다는 것입니다. 프런트 엔드와 백엔드에서 작동하는 반응 형 서비스 레이어도 얻고 싶습니다. 거기에 진전이 있습니다.
Marcus Rådell
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.