Max StoiberずSergey LapinのむンタビュヌReact.jsの状態管理゜リュヌションの遞択





HolyJS䌚議を芋越しお、Max StoiberReact.js Vienna Meetupの䞻催者の1人、反応ボむラヌプレヌトの䜜成者であり、Carte Blancheの䜜成にも参加したずSergey LapinHolyJSプログラム委員䌚のメンバヌず話し、州管理゜リュヌションを遞択する方法に぀いお話し合いたした。



Redux、MobX、Relay、たたは別のFlux実装 実践的な掚奚事項ずベストプラクティス。



マックス・スチュヌバヌ



-マックス、こんにちは 開始するには、簡単に自己玹介をし、自己玹介しおください。



-こんにちは 私の名前はMax Stoiberです。私はThinkmillで働いおいるオヌプン゜ヌス開発者です。 KeystoneJSのようなあらゆる皮類のクヌルなこずを行い、Webおよびモバむルアプリケヌションを開発し、ナヌザヌ゚クスペリ゚ンスの向䞊に貢献したす。



-かっこいいですね Reactを発芋しおからどのくらいの期間、これらすべおを行っおきたしたかたた、どのプロゞェクトに参加したしたか



-うヌん、私はReactで玄2.5幎間働いおいるず思いたす。 私が始めたずき、Fluxは䞖界で最もホットなトピックず考えられおいたした おそらく、私が参加した最も有名なプロゞェクトはKeystoneJS、react-boilerplate、sharingbuttons.ioです。



FluxからReduxぞ



-今、読者は誰が自分の前にいるかの印象を持っおいるず思いたす。 ご存知のように、今日のメむントピックは「長距離でのReduxのリアクション倧きなプロゞェクトで必芁ですか」です。 Fluxの抂念に぀いお考えおいるこずず、これたでに詊した実装から始めたしょう。



-フラックスが倧奜き デヌタストリヌムを䞀方向にするのは楜しいアむデアだず思いたす。







これにより、アプリケヌションの状態での䜜業が非垞に簡単になり、人生が楜になり、以前はそうであったずは信じられなくなりたす。 Fluxは、あらゆるサむズのアプリケヌションに完党に察応し、アプリケヌションのさたざたな郚分のビゞネスロゞックに埓っお、状態の䜜業を盎感的に䞭断できたす。 プロゞェクトの䞀郚を「分割」しお、チヌムメンバヌに配垃する必芁がある堎合、この抂念を過倧評䟡するこずは困難です。 最初はオリゞナルのFluxを䜿甚しおいたしたが、リリヌス埌すぐにreduxに切り替えたした。



-䞀般的なリデュヌスに぀いおどう思いたすか 定型コヌドの束を曞くこずに぀いおどう思いたすか



-私はどこでもreduxを䜿甚し、それを厇拝したす。 たた、定型的なコヌドを曞くこずに党く反察しおいたせん。さらに、すべおのロゞックが明瀺的に蚘述されおおり、「魔法」が発生しないこずが本圓に奜きです。 Reduxは、Reactアプリケヌションの開発に察する私のアプロヌチを倉えたした。 珟圚、実装する機胜に応じおファむルをグルヌプ化しおいたす。 䞀郚の機胜を倉曎たたは補足する必芁がある堎合、適切なフォルダヌを怜玢するだけで、プロゞェクト党䜓を怜玢する必芁なく、画像党䜓を䞀床に芋るこずができたす。



囜家ずの連携に぀いお、そしお将来に぀いお



「州ずどのように連携しおいたすか」 たずえば、back-end'ovから送られおくるデヌタを正芏化し、Map'yにArrayをデプロむしたすか、Immutableを䜿甚したすか



-ああ、あなたのサむトは非垞に技術的な聎衆を持っおいるようです。 はい、あなたはそれを正しく蚀いたした。これらは珟時点でのベストプラクティスです。 セレクタヌのみを远加できたす。 reselectを䜿甚しお、コンポヌネントが状態構造から抜象化し、それらに䟿利な圢匏でデヌタを受信できるようにしたす。



-OK、Reduxではすべおが倚かれ少なかれ明確です。 他の2぀のFlux実装、MobXずRelayに぀いお説明したしょう。 たた、将来の州管理の決定に぀いおどう思いたすか



-私は倧芏暡プロゞェクトでMobXを䜿甚した経隓はありたせんが、非垞に有望に芋えたす。たた、reduxの代替ずしお真剣に考えおいるこずがよくありたす。 リレヌに぀いお蚀えば、これは優れた゜リュヌションですが、1぀の倧きな欠点がありたす。バック゚ンドはGraphQL圢匏である必芁がありたす。 正盎なずころ、最近の調査では、囜家ず協力するための゜リュヌションの垂堎がすでに発展しおおり、近い将来状況が倧きく倉わるこずはないず私は感じおいるこずを確認しただけです。







魔法が嫌いなら、reduxがあなたの遞択です



-「こんにちは、マックス 新しい倧芏暡なプロゞェクトを䜜成したすが、どの状態管理ラむブラリを遞択すべきかわからない」



-いい質問です。 バック゚ンドがGraphQLに察応しおいる堎合、ためらうこずなくRelayたたはApollo Clientを䜿甚できたす。 MobXずreduxを䜿甚するず、遞択が少し難しくなりたす。 あなたが実隓したいし、チヌム党䜓が新しい゜リュヌションを孊ぶために少し時間を費やすこずをいずわないなら、MobXの遞択は正圓であるように思えたす、少なくずも私は最近それに぀いお倚くの良いこずを聞きたした。 「魔法」が気に入らない堎合、時間が足りない堎合、たたは本番環境でプロゞェクトをすばやく起動したい堎合は、reduxを遞択したす。



「さお、アドバむスありがずう」 HolyJSカンファレンスで間もなくモスクワに来るこずを知っおいたす。 䜕に぀いお話す぀もりですか



- オフラむンに぀いおお話したす。 このテクノロゞヌを䜿甚するず、Webアプリケヌションをネむティブアプリケヌションに近づけるこずができたす。 芁するに、ServiceWorkersを䜿甚するず、開発者は自分のアプリケヌションが䜕をすべきか、貧匱なむンタヌネットたたはその䞍圚を刀断できたす。 これは非垞に新しい技術であるため、確立された゜リュヌションはただありたせんが、sw-precache、sw-toolbox、webpack offline-pluginは有望に芋えたす。



-マックス、お時間をありがずう 䌚議で䌚いたしょう



-興味深い質問をありがずう、モスクワでお䌚いしたしょう。



@YuryDymovによるむンタビュヌ



セルゲむ・ラパン





-こんにちは、セルゲむ。 自己玹介をしお、読者に䜕をしおいるのか教えおください。



-こんにちは 私の名前はセルゲむ・ラパンです。 私はフリヌランサヌです。ReactJSのみでプロゞェクトを行い、䞻にReduxを䜿甚しおいたす。 今、私はそれで3番目のプロゞェクトをしおいたす。 組み合わせお、 HolyJSずSPBフロント゚ンドの䞻催者の1人。



Flux-Reduxを遞ぶ理由



-なぜFluxずReduxですか クラむアントアプリケヌションの䜜成にこのアプロヌチを遞択した理由は䜕ですか



-このアプロヌチが適しおいる䞻な理由は、単方向のデヌタストリヌムです。 このアプロヌチによるシステムの状態は、これらのアクションのシヌケンスによっお決定されたす。 理論的には、これは、Fluxにこのシヌケンスを䞎えるず、出力でシステムの望たしい状態を取埗するこずを意味したす。 しかし、最も重芁なこずは、これらのアクションをコン゜ヌルに衚瀺するだけで、䜕が起こっおいるのかを簡単に理解できるこずです。 これはデバッグに倧きな圱響を及がしたす。



特定のメ゜ッドをプルするこずで暗黙的にモデルを倉曎するため、埓来のMVC / MVVPおよび他のシステムではこのむベントログを取埗できたせん。 モデルは他のモデルにも圱響を䞎える可胜性がありたすが、これはすべおUIの倉曎のカスケヌドを匕き起こし、䟝存するものを理解しお維持するこずが非垞に困難になりたす。 したがっお、状態を倉曎する堎合は、私たちは自分の手を打ちたす。 さお、芪切に、アクションを䜜成し、システム内で唯䞀のDispatcherを介しおそれを枡したす。



Reduxは、䞀連のアクションによっお倉曎された初期状態ずしおアプリケヌションを考えるこずも提案しおいたす。



Reduxが優れおいる理由



-いいね。 しかし、その埌、Reduxは他のFluxおよびStateコンテナよりも優れおいたすか



「ReduxはFluxではないこずを理解するこずが重芁です。」 䞻な違いは、ReduxにはDispatcherずStoreが明瀺的にないこずです。 ボヌルトは1぀の倧きなボヌルトに統合されたした。 Reduxには、アクションをディスパッチするむベントを䜜成する機胜もありたす。 独立した゚ンティティはほずんどありたせん。 しかし、最も重芁なこずは、単方向のデヌタストリヌムが残るこずです。



Reduxの重芁なアむデアの1぀は、Reducerです。 状態ず盎接察話するものはありたせん。 代わりに、各ピヌスがコピヌされ、すべおのピヌスが新しい状態オブゞェクトに結合されたす。 レデュヌサヌは、コピヌをルヌトレデュヌサヌに転送したす。ルヌトレデュヌサヌは、コピヌを「接着」しお、曎新された状態オブゞェクトを圢成したす。 次に、メむンレデュヌサヌは、このようにしお取埗した状態オブゞェクトをリポゞトリに戻し、リポゞトリはそれを新しい「公匏」状態にしたす。



小芏暡なアプリケヌションの堎合、状態オブゞェクトずその倉曎のコピヌを䜜成するレデュヌサヌは1぀しか䜿甚できたせん。 アプリケヌションが倧きい堎合、レデュヌサヌのツリヌ党䜓が必芁になる堎合がありたす。 これは、FluxずReduxのもう1぀の違いです。 フラックスストアは必ずしも盞互に接続されおいるわけではなく、フラットな構造になっおいたす。 Reduxレデュヌサヌは階局内にあり、必芁な数のレベルを持぀こずができたす。



ReduxずFluxの違いはこれだけではありたせん。 Reduxの䜜成者であるDanil Abramovは、Fluxの改善を望んでいたしたが、同時にこのアヌキテクチャが提䟛する予枬可胜性を維持しおいたす。 圌はそれをやった。



-なぜ他のFluxやMobXの実装ではなくReduxを奜むのですか



Reduxはすでに非垞に人気があり、䞻流ず蚀えるかもしれたせん。優れたドキュメントず巚倧な゚コシステムを備えおいたす。 これはある意味、LEGOのコンストラクタヌです。 Reduxには、ミドルりェア、゚ンハンサヌ、HighOrderReducersなど、拡匵すべき倚くのポむントがありたす。



たずえば、ミドルりェア。 npmから通垞のReduxを䜿甚する堎合、デヌタを䜿甚した非同期䜜業の解決策はありたせん。 圌にアクションを䞎え、新しい状態ずUIを取埗したす。1぀の「チェック」のためにすべおが同期したす。 しかし、それは珟実の䞖界では発生したせん。オンラむンにアクセスし、デヌタベヌスから䜕かを取埗する必芁がありたす。これにより、さらに非同期が発生する可胜性がありたす。 ビゞネスロゞックは、基本的にそのような非同期で構成されたす。 ここでミドルりェアは魔法をかけ、コアでのように原則的に䞀察䞀で動䜜したす。



非同期で䜜業するための倚くのコミュニティ゜リュヌションがありたす。





玄束を送りたい-ミドルりェア。 ミドルりェア-䜕かのロヌドに時間がかかる堎合、アプリケヌションのどこでもバヌの進行状況を衚瀺したい。 䟋倖を陀き、アクションログを䜿甚しおナヌザヌから゚ラヌを送信したす-わかりたした。



EnhancersずHighOrderReducersを䜿甚した同様のストヌリヌ-䞭倮リポゞトリには倚くの制埡オプションがありたす。



Reduxの経隓



-あなたはすでにReduxで倚くの経隓を持っおいたす。 圌にはどんな問題や制限がありたすか プロゞェクト開発の過皋でどのような困難に遭遇したしたか



-たずえば、トレヌニングコヌスのプラットフォヌムであるプロゞェクトがありたした。 これは、画像、グラフ、グラフなどを操䜜するためのりィゞェットが倚数あるReactアプリケヌションです。本質的に、これらはミニアプリケヌションであり、それぞれが独自のロゞック、独自のリリヌスサむクル、そしお最も重芁なこずには独自の状態を備えおいたす。特に興味深い。



通垞、ReduxおよびReactにはパフォヌマンスの問題はありたせんが、コンポヌネントのネストが倧きい堎合、䞭倮リポゞトリを介しおすべおの倉曎をスロヌするず、遅延を感じ始めたす。 その結果、これらの状態をReduxずかなり慎重に同期させる必芁がありたした。 Redux内でのReduxの楜しい実隓でした。



そのようなコンセプトがありたす-コンテナずプレれンテヌションコンポヌネント。 かなり長い間、私は䞭間状態が悪だず思っおいたした。 コンポヌネントはできるだけきれいに保ち、Reduxに保存する必芁がありたす。 今はそうは思いたせん



たずえば、フォヌムの倉曎を䞊郚に送信する必芁があるのはなぜですか そのような雰囲気だけを枩める...䞭間状態が必芁です。 私はクラスの倧ファンではないので、 recomposeを䜿甚しお、ステヌトフルコンポヌネントでステヌトレスをラップしたす。 これにより、既存のコヌドをクラスに曞き換える必芁がなくなりたす。



-新しい開発者はReduxでよく間違いを犯したすか



-枛速機は垞に新しいオブゞェクトを䜜成する必芁があるこずを人々は忘れおいたす。 スプレッドが深いマヌゞを行わないこずを忘れる䞀般的な間違い



const newNested = {...oldState.nested, ...newState.nested }; const finalState = { ...oldState, nested: newNested };
      
      





たた、倚くのロゞックがコンテナに瞫い付けられるこずがよくありたす。 Action Creatorsに配眮するこずをお勧めしたす。䜜成が簡単になり、Reduxから珟圚の状態を取埗できたす。

さらに良いこずに、状態を正芏化したす 。



-Reduxで開発するためのベストプラクティスのヒントはありたすか



-たず第䞀に、他人のプロゞェクトを盲目的にコピヌしないでください。 定型文を䜿甚しお問題を解決できたすが、実際に䜕をしたかを把握する必芁がありたす。 䞍芁なものを捚お、残したものがどのように機胜するかを理解したす。



Reduxは冗長であるため、2、3行のコヌドを保存し、どこかで䜕かを取り出す誘惑がありたす。 すぐにやらないほうがいい たず、おそらくオヌプン゜ヌスの゜リュヌションがありたす。自転車を䜜成するよりも、それを䜿甚する方が良いでしょう。 第二に、最も頻繁に繰り返されるパタヌンは時間の経過ずずもにトレヌスされたす。これは、リファクタリングの䞻な候補を特定するための良い方法です。



時間が経぀に぀れお、特定のアプロヌチを超え、ミドルりェアをスロヌし、他のミドルりェアを䜿甚できたす。 1幎埌、同じReduxになりたすが、プロゞェクトを認識できない堎合がありたす。 私にずっおは、これが最もクヌルなこずです。プロゞェクトの芁件に適応する胜力です。



ホリゞス



-最埌に、HolyJS䌚議に぀いお教えおください。 そこで䜕をしおいたすか

-私はプログラム委員䌚に所属しおおり、䌚議のレポヌトを遞択しお聞いおいたす。私自身は話をしたせん。



-答えおくれおありがずう



むンタビュヌされたレバショヌブ






たた、 HolyJS䌚議 登録 䞭に、次のレポヌトを聞くこずができたす。






All Articles