PropTypes 대 흐름 반응


101

PropTypes와 Flow는 비슷한 것을 다루지 만 다른 접근 방식을 사용합니다. PropTypes는 런타임 중에 경고를 제공 할 수 있으며, 이는 서버 등에서 오는 잘못된 응답을 신속하게 찾는 데 도움이 될 수 있습니다. 그러나 Flow는 미래인 것 같고 제네릭과 같은 개념을 가진 매우 유연한 솔루션입니다. 또한 Nuclide에서 제공하는 자동 완성 기능은 Flow에 큰 장점입니다.

내 질문은 새 프로젝트를 시작할 때 가장 좋은 방법입니다. 아니면 Flow와 PropTypes를 모두 사용하는 것이 좋은 솔루션일까요? 둘 다 사용하는 문제는 중복 코드를 많이 작성한다는 것입니다. 다음은 내가 작성한 음악 플레이어 앱의 예입니다.

export const PlaylistPropType = PropTypes.shape({
    next: ItemPropTypes,
    current: ItemPropTypes,
    history: PropTypes.arrayOf(ItemPropTypes).isRequired
});

export type Playlist = {
    next: Item,
    current: Item,
    history: Array<Item>
};

두 정의 모두 기본적으로 동일한 정보를 포함하며 데이터 유형이 변경되면 두 정의를 모두 업데이트해야합니다.

유형 선언을 PropTypes로 변환하는 이 babel 플러그인 을 찾았습니다 .


1
당신이 흐름 시작하려면이 게시물을 시도해보십시오 robinwieruch.de/the-soundcloud-client-in-react-redux-flow을
로빈 Wieruch

1
경험상 질문에 언급 된 플러그인을 사용하는 것은 좋은 생각이 아닙니다. 모든 유형의 구성 요소를 지원하지는 않으며 v0.39부터 React Native로 완전히 손상되었으며 일반적으로 매우 취약합니다. 리포지토리의 소유자는 이러한 문제에 상당히 신속하게 대응했지만 관심을 잃은 것 같고 더 이상 유지 관리에 의존 할 수 없습니다.
Tomty

Flow 및 tcomb를 사용하여 정적 및 런타임 유형 검사를 위해 Babel 플러그인을 통해 tcomb 사용해보십시오 .
comerc

답변:


81

이 질문을 한 지 1 년 후,이 문제에 대한 내 경험에 대한 업데이트를 제공하고 싶었습니다.

Flow가 많이 발전함에 따라 코드베이스를 입력하기 시작했고 새로운 PropType 정의를 추가하지 않았습니다. 지금까지는 이것이 좋은 방법이라고 생각합니다. 위에서 언급했듯이 props뿐만 아니라 코드의 다른 부분도 입력 할 수 있기 때문입니다. 이것은 예를 들어 사용자가 수정할 수있는 상태에 소품의 복사본이있을 때 매우 편리합니다. 또한 IDE의 자동 완성 기능은 엄청난 이득입니다.

한 방향 또는 다른 방향의 자동 변환기는 실제로 이륙하지 않았습니다. 따라서 새 프로젝트의 경우 이제 PropTypes를 통한 Flow를 사용하는 것이 좋습니다 (입력을 두 번 수행하고 싶지 않은 경우).


어떤 IDE를 사용하십니까? 웹 스톰?
sergey.tyan

3
ide-flowtype 플러그인과 함께 Atom을 사용하고 있습니다.
danielbuechele

- childContextTypes를 사용할 때 당신은 여전히 propTypes 필요 stackoverflow.com/questions/42395113/...
gkd

3
새로운 컨텍스트 API로 인해 자식 컨텍스트를 처리 할 때 더 이상 propTypes를 사용할 필요가 없습니다. reactjs.org/docs/context.html
SteveB

35

둘 다 매우 넓은 유형 검사 분야에 속하는 것 외에는 둘 사이에 거의 유사성이 없습니다.

Flow는 언어의 상위 집합을 사용하는 정적 분석 도구로, 모든 코드 에 유형 주석을 추가 하고 컴파일 타임에 전체 버그 클래스를 포착 할 수 있습니다.

PropTypes는 React에 패치 된 기본 유형 검사기입니다. 주어진 컴포넌트에 전달되는 props의 유형 외에는 어떤 것도 확인할 수 없습니다.

전체 프로젝트에 대해보다 유연한 유형 검사를 원하면 Flow / TypeScript가 적절한 선택입니다. 주석이 달린 유형 만 구성 요소에 전달하는 한 PropTypes는 필요하지 않습니다.

prop 유형 만 확인하고 싶다면 나머지 코드베이스를 지나치게 복잡하게 만들지 말고 더 간단한 옵션을 선택하십시오.


11
예, 작동 방식이 매우 다릅니다. 그러나 그것들을 사용하는 목적은 매우 유사하다고 생각합니다. 그러나 한 가지 지적한 점은 좋은 점입니다. Flow를 사용하면 코드베이스를 더 많이 다룰 수 있지만 PropTypes를 사용할 때는 props로 제한됩니다.
danielbuechele 15:53에

2
당신이 경우 사용의 목적은 매우 유사하다 유일한 소품 유형을 확인하는 흐름을 사용합니다. 하나는 기본적으로 언어이고 다른 하나는 간신히 라이브러리입니다.
Dan Prince

@DanPrince와 완전히 동의합니다. 그리고 이것이 PropTypes를 사용하여 서버에서 잘못된 응답을 확인하는 것은 좋은 생각이 아니라고 생각합니다. 이를 수동으로 확인하고 UI가 콘솔에 경고를 던지는 대신 올바르게 응답 (예 : 경고 메시지 표시)하면 더 좋습니다.
Yan Takushevich

6
@YanTakushevich 둘 다해야합니다. 어쨌든 프로덕션 중에는 PropTypes를 비활성화해야하므로 사용자가 좋은 경험을 할 수 있도록 항상 수동 확인이 필요합니다. 그러나 PropTypes는 개발 중 런타임 경고에 매우 유용 할 수 있습니다. 그것은 당신이 아무것도 잊지 않도록하는 좋은 안전망 일뿐입니다.
ndbroadbent

27

여기서 놓친 점은 Flow정적 검사기 이고 PropTypes런타임 검사기 라는 것입니다.

  • 흐름 은 코딩하는 동안 업스트림 오류를 가로 챌 수 있습니다. 이론적으로는 알 수없는 일부 오류를 놓칠 수 있습니다 (예를 들어 프로젝트에서 흐름을 충분히 구현하지 않았거나 중첩 된 개체의 경우).
  • PropTypes 는 테스트하는 동안 다운 스트림을 포착하므로 놓치지 않습니다.

1
여기에 전용 바벨 플러그인은 이미 npmjs.com/package/babel-plugin-flow-react-proptypes
amankkg

15

Flow 만 사용하여 props 유형을 선언 해보세요. 문자열 대신 숫자와 같은 잘못된 유형을 지정하십시오. 흐름 인식 편집기 내에서 구성 요소를 사용하는 코드에서 플래그가 지정되는 것을 볼 수 있습니다. 그러나 이로 인해 테스트가 실패하지 않으며 앱은 계속 작동합니다.

이제 잘못된 유형으로 React PropTypes 사용을 추가하십시오. 이로 인해 테스트가 실패하고 앱이 실행될 때 브라우저 콘솔에 플래그가 지정됩니다.

이를 바탕으로 Flow를 사용하더라도 PropTypes도 지정해야 할 것 같다.


테스트가 수행되는 방법에 따라 jest의 스냅 샷 테스트를 사용하면 테스트가 잘못된 속성 값으로 실패합니다.
Alexandre Borela 2017-06-17

3
IDE 오류의 장점은 테스트를 실행하기 직전에 오류를 볼 수 있다는 것 입니다.
Tom Fenech

벨트 및 멜빵 접근을위한 플러스 1.
데이비드 A. 그레이
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.