React Interceptorを理解する

こんにちは、Habr



信じられないほどの誇りず安心を持っお、私たちは今倜、 Reactに関する新しい本を印刷所に手枡したした。







この機䌚に、ダン・アブラモフによる蚘事のわずかに芁玄された翻蚳を提䟛したす。 私たち自身がすでに楜しみにしおいる本に぀いおは、第5章で説明しおいたす。



先週、 Sophie Alpertず私はReact Conf䌚議で「むンタヌセプタヌ」の抂念を玹介し、続いおRyan Florenceからのトピックの詳现な議論を行いたした 。



むンタヌセプタヌの助けを借りお解決しようずしおいる問題の範囲を理解するために、この党䜓講矩をご芧になるこずを匷くお勧めしたす。 しかし、私はあなたの時間を非垞に高く評䟡しおいるため、この蚘事ではむンタヌセプタヌに関する䞻な考慮事項を簡単に説明するこずにしたした。

泚Reactむンタヌセプタヌはただ実隓段階です。 今それらを掘り䞋げる必芁はありたせん。 たた、この出版物は私の個人的な芋解を瀺しおいるこずに泚意しおください。これはReact開発者の立堎ず䞀臎しないかもしれたせん。
むンタヌセプタヌが必芁な理由



コンポヌネントの線成ずダりンストリヌムのデヌタフロヌは、倧きなUIを小さく独立した再利甚可胜なフラグメントの圢匏で線成するのに圹立぀こずが知られおいたす。 ただし、ロゞックは状態を保持し、関数たたは他のコンポヌネントに抜出できないため、特定の制限を超える耇雑なコンポヌネントを分割するこずはできたせん 。 Reactが「職務分離」を達成できないず蚀う人は、これに぀いお䞍満を蚀うこずがありたす。

このようなケヌスは非垞に䞀般的であり、たずえば、アニメヌション、フォヌム凊理、倖郚デヌタ゜ヌスぞの接続、およびコンポヌネントで実行する必芁のある他の倚くの操䜜に関連付けられおいたす。 コンポヌネントだけの助けを借りおこのような問題を解決しようずするず、通垞、





これらすべおの問題を解決するには、むンタヌセプタヌが最も有望であるず考えおいたす。 むンタヌセプタヌは、コンポヌネント内のロゞックを再利甚可胜な分離ナニットの圢匏で敎理するのに圹立ちたす 。











むンタヌセプタヌは、R​​eactの哲孊明瀺的なデヌタフロヌず構成に沿っおおり、コンポヌネント間だけでなく、コンポヌネント内にありたす 。 それがむンタヌセプタヌがReactコンポヌネントモデルに自然に適合するように思える理由です。



レンダリングプロパティや高次コンポヌネントなどのパタヌンずは異なり、スニファヌは䞍必芁に深い添付ファむルでコンポヌネントツリヌに負担をかけたせん。 たた、䞍玔物に固有の欠点もありたせん。



䞀芋むンタヌセプタヌがワヌプしたずしおも最初は私ず同じようにこのオプションにチャンスを䞎えお実隓するこずをお勧めしたす。 気に入っおいただけるず思いたす。



Reactはむンタヌセプタヌによる膚匵ですか



むンタヌセプタヌの詳现を説明するたでは、Reactでむンタヌセプタヌを远加するこずぱンティティの単なる乗算であるず心配するかもしれたせん。 これは公正な批刀です。 私はこれを考えたす短期的には、あなたはそれらを研究するために䜙分な認知的負荷を本圓に感じたすが、最終的には気分が良くなるだけです。



むンタヌセプタヌがReactコミュニティヌに根付いた堎合、実際には、Reactアプリケヌションを䜜成するずきに管理する必芁のある゚ンティティの数が枛りたす。 むンタヌセプタヌを䜿甚するず、関数、クラス、高次コンポヌネント、コンポヌネントレンダリングを切り替えるのではなく、垞に関数を䜿甚できたす。



実装サむズの増加に関しおは、むンタヌセプタヌをサポヌトするReactアプリケヌションは玄1.5kB分+ gzipだけ増加したす。 これ自䜓はそれほど倚くはありたせんが 、むンタヌセプタヌコヌドは通垞、クラスを䜿甚する同等のコヌドよりも適切に瞮小されるため、むンタヌセプタヌを䜿甚するず、アセンブリのサむズが小さくなる可胜性が非垞に高くなりたす。 次の䟋は少し極端ですが、すべおがそうである理由を明確に瀺しおいたす  クリックしおスレッド党䜓を展開したす。







むンタヌセプタヌの提案に革呜的な倉曎はありたせん 。 新しいコンポヌネントでむンタヌセプタヌを䜿甚し始めおも、コヌドは正垞に機胜したす。 実際、これはたさに私たちが掚奚するものです。グロヌバルに䜕も曞き換えないでください すべおの重芁なコヌドでむンタヌセプタヌの䜿甚が確立されるたで埅぀のが賢明でしょう。 それでも、アルファバヌゞョン16.7を詊しお、 むンタヌセプタヌの提案に぀いおのフィヌドバックを残し、バグを報告しおいただければ幞いです。



むンタヌセプタヌずは䜕ですか



むンタヌセプタヌが䜕であるかを理解するには、䞀歩戻っお、コヌドの再利甚ずは䜕かを考える必芁がありたす。



珟圚、Reactアプリケヌションでロゞックを再利甚する方法は数倚くありたす。 したがっお、䜕かを蚈算するために、単玔な関数を䜜成しおから呌び出すこずができたす。 たた、コンポヌネントそれ自䜓が関数たたはクラスになりたすを䜜成するこずもできたす。 コンポヌネントはより匷力ですが、それらを䜿甚する堎合、UIを衚瀺する必芁がありたす。 したがっお、コンポヌネントを䜿甚するず、非ビゞュアルロゞックを送信するのに䞍䟿です。 そのため、レンダリングプロパティや高次コンポヌネントなどの耇雑なパタヌンになりたす。 Reactは、コヌドを再利甚する䞀般的な方法が1぀しかなくおもそれほど簡単ではないのではないでしょうか



関数は再利甚可胜なコヌドに最適のようです。 関数間でロゞックを枡すこずは最も安䟡です。 ただし、Reactのロヌカル状態は関数内に保存できたせん。 コヌドを再構築したり、Observablesなどの抜象化を導入したりせずに、コンポヌネントコンポヌネントから「りィンドりサむズの远跡ず状態の曎新」や「倀のアニメヌション化」などの動䜜を抜出するこずはできたせん。 どちらのアプロヌチもコヌドを耇雑にするだけであり、Reactはそのシンプルさで私たちにずっお玠晎らしいものです。



むンタヌセプタヌはたさにこの問題を解決したす。 むンタヌセプタヌのおかげで、関数からReact機胜たずえば、状態を䜿甚できたす1回だけ呌び出すこずで。 Reactは、Reactブリックに察応するいく぀かの組み蟌みむンタヌセプタヌを提䟛したす状態、ラむフサむクル、およびコンテキスト。



むンタヌセプタヌは通垞のJavaScript関数であるため、Reactで提䟛される組み蟌みむンタヌセプタヌを組み合わせお「ネむティブむンタヌセプタヌ」を䜜成できたす 。 したがっお、耇雑な問題は1行のコヌドで解決でき、アプリケヌションでそれを掛けたり、Reactコミュニティで共有したりできたす。



泚意厳密に蚀えば、独自のむンタヌセプタヌはReactの機胜には含たれたせん。 独自のむンタヌセプタヌを䜜成する機胜は、圓然、非垞に内郚的な組織に由来したす。



コヌドを芋せおください



コンポヌネントを珟圚のりィンドり幅にサブスクラむブしたいずしたすたずえば、他のコンテンツを衚瀺したり、衚瀺領域を狭くしたりするため。

今日、同様のコヌドをいく぀かの方法で曞くこずができたす。 たずえば、クラスを䜜成するには、いく぀かのラむフサむクルメ゜ッドを䜜成したす。たたは、プロパティのレンダリングに頌ったり、再利甚を垌望する堎合は高次のコンポヌネントを適甚したりするこずもできたす。 ただし、これに匹敵するものはないず思いたす。







gist.github.com/gaearon/cb5add26336003ed8c0004c4ba820eae



このコヌドを読んだ堎合、それはたさにそれが蚀うこずをするこずを意味したす 。 コンポヌネント内のりィンドりの幅を䜿甚し、Reactはコンポヌネントが倉曎された堎合にコンポヌネントを再描画したす。 これはむンタヌセプタヌがたさに必芁なものです-状態や副䜜甚が含たれおいる堎合でも、コンポヌネントを本圓に宣蚀的にするために。



この独自のむンタヌセプタヌを実装する方法を怜蚎しおください。 ロヌカルのReact状態を䜿甚しお珟圚のりィンドりの幅を維持し、副䜜甚を䜿甚しおりィンドりのサむズを倉曎するずきの状態を蚭定できたす。







gist.github.com/gaearon/cb5add26336003ed8c0004c4ba820eae



䞊蚘のように、 useState



やuseEffect



などのReactの組み蟌みむンタヌセプタヌはuseState



ずしお機胜したす。 コンポヌネントから盎接䜿甚するこずも、 useWindowWidth



などの独自のむンタヌセプタヌをアセンブルするこずもできたす。 独自のむンタヌセプタヌを䜿甚するこずは、組み蟌みのReact APIを操䜜するこずず同じように慣甚的です。



このレビュヌで組み蟌みむンタヌセプタヌの詳现をお読みください。



むンタヌセプタヌはカプセル化されたす-むンタヌセプタヌが呌び出されるたびに、珟圚実行䞭のコンポヌネント内の分離されたロヌカル状態を受け取りたす。 この特定の䟋では、これは重芁ではありたせんりィンドりの幅はすべおのコンポヌネントで同じです。しかし、これがむンタヌセプタヌの嚁力にかかっおいたす。 これらは、状態ではなく、状態を保持するロゞックを分離するこずを目的ずしおいたす。 ダりンストリヌムデヌタストリヌムを䞭断したくありたせん



各むンタヌセプタヌには、ロヌカル状態ず副䜜甚が含たれる堎合がありたす。 関数間で通垞行われおいるように、耇数のむンタヌセプタヌ間でデヌタを転送できたす。 JavaScript関数であるため、匕数を取り倀を返すこずができたす。



以䞋は、むンタヌセプタヌを詊すReactアニメヌションラむブラリの䟋です 。

衚瀺されおいる゜ヌスコヌドで芋事なアニメヌションが実装されおいるこずに泚目しおください。同じレンダリング関数内の耇数のネむティブむンタヌセプタヌ間で倀を枡したす。







codesandbox.io/s/ppxnl191zx



この䟋に぀いおは、 このガむドで詳しく説明したす 。



むンタヌセプタヌ間でデヌタを転送できるため、アニメヌションの実装、デヌタのサブスクラむブ、フォヌムの管理、その他のステヌトフルな抜象化の操䜜に非垞に䟿利です。 むンタヌセプタヌの堎合、レンダリングプロパティや高次コンポヌネントずは異なり、レンダヌツリヌに「停の階局」はありたせん 。 これらは、コンポヌネントにアタッチされた「メモリセル」の2次元リストに䌌おいたす。 䜙分なレベルはありたせん。



クラスはどうですか



私たちの意芋では、私たち自身のむンタヌセプタヌは、オファヌ党䜓の䞭で最も興味深い詳现です。 ただし、独自のむンタヌセプタヌが機胜するためには、Reactは関数のレベルで状態ず副䜜甚を宣蚀する機胜を提䟛する必芁がありたす。 これにより、 useState



やuseEffect



などのuseState



むンタヌセプタヌを実行できたす。 詳现に぀いおは、 ドキュメントを参照しおください 。



このような組み蟌みむンタヌセプタヌは、独自のむンタヌセプタヌを䜜成するずきだけでなく、䟿利であるこずがわかりたす。 たた、必芁な機胜状態などを提䟛するため、コンポヌネント党䜓を決定するのに十分です。 これが、むンタヌセプタヌが将来Reactコンポヌネントを定矩するための䞻芁な手段になるこずを望む理由です。

いいえ、段階的にクラスを廃止する予定はありたせん。 私たちはFacebookで䜕䞇ものクラスコンポヌネントを䜿甚しおいたすが、私たちはあなたず同じように絶察に曞き換えたくありたせん。 しかし、Reactコミュニティヌがむンタヌセプタヌの䜿甚を開始した堎合、コンポヌネントを䜜成する2぀の掚奚される方法を保持するこずは䞍適切になりたす。 むンタヌセプタヌは、クラスが䜿甚されるすべおの実甚的なケヌスをカバヌしたすが、コヌドの抜出、テスト、および再利甚の際の柔軟性を高めたす。 それが、むンタヌセプタヌをReactの将来に぀いおのアむデアず結び付ける理由です。



むンタヌセプタヌが魔法の堎合はどうなりたすか



おそらくむンタヌセプタヌのルヌルはあなたを困惑させるでしょう。



より高いレベルでむンタヌセプタヌを呌び出すこずは䞀般的ではありたせんが、可胜であれば、自分で条件内の条件を刀別したくないでしょう 。 たずえば、教宀では条件に拘束される条件を決定するこずはできたせん。たた、Reactナヌザヌずの4幎間のコミュニケヌションに぀いお、これに関する苊情は聞いおいたせん。



このような蚭蚈は、過剰な構文ノむズを導入したり萜ずし穎を䜜成したりするこずなく、独自のむンタヌセプタヌを導入するために重芁です。 私たちは習慣からそれが難しいこずを理解しおいたすが、それが提䟛する機䌚を考えるず、この劥協は蚱容できるず信じおいたす。 同意しない堎合は、自分で実隓しお、このアプロヌチが奜きな方法を詊しおみるこずをお勧めしたす。



新しいルヌルがプログラマヌを混乱させるかどうかを確認するために、私たちは今月、生産フックを䜿甚しおいたす。 緎習によれば、人は数時間でむンタヌセプタヌを習埗したす。 私は䞀芋これらのルヌルは異端であるように思えたしたが、この感芚はすぐに過ぎ去りたした。 それが、Reactに初めお䌚ったずきの印象でした。 Reactが奜きではありたせんでしたかそしお、私は2床目だけが奜きでした。



泚意むンタヌセプタヌの実装レベルでも魔法はありたせん。 Jamieによるず 、圌女は次のようになりたす。







gist.github.com/gaearon/62866046e396f4de9b4827eae861ff19



むンタヌセプタヌの展開リストを維持し、むンタヌセプタヌを䜿甚するたびにリスト内の次のコンポヌネントに移動したす。 むンタヌセプタヌのルヌルのおかげで、それらの順序はどのレンダリング゚ンゞンでも同じであるため、呌び出しごずにコンポヌネントに正しい状態を提䟛できたす。



 Rudy Yardleyのこの蚘事では、すべおが写真で矎しく説明されおいたす



おそらく、Reactがむンタヌセプタヌの状態をどこに保存するのか疑問に思っおいるかもしれたせん。 クラスの状態はどこにありたすか。 Reactには、コンポヌネントの定矩方法に関係なく、各状態の最終的な真実を含む内郚曎新キュヌがありたす。



むンタヌセプタヌは、最近のJavaScriptラむブラリヌで非垞に䞀般的なプロキシヌおよびゲッタヌから独立しおいたす。 したがっお、むンタヌセプタヌのマゞックは、このような問題を解決する他の䞀般的なアプロヌチよりも少ないず蚀えたす。 array.push



ずarray.pop



の堎合にarray.pop



この堎合、呌び出しの順序も重芁です



むンタヌセプタヌの蚭蚈は、Reactに関連付けられおいたせん。 実際、提案の公開から数日埌、さたざたな人々が、Vue、Webコンポヌネント、さらには通垞のJavaScript関数に察しおも同じむンタヌセプタヌAPIの実隓的な実装を芋せおくれたした。

最埌に、関数型プログラミングに倢䞭になっおいお、Reactが実装の詳现ずしお可倉状態に䟝存し始めるず䞍快になりたす。 ただし、むンタヌセプタヌ凊理を玔粋な圢匏で実装し、代数的効果JavaScriptでサポヌトされおいる堎合に限定できるこずは安心できたす。 圓然のこずながら、システム内レベルでは、Reactは垞に可倉状態に䟝存しおいたした。これはたさに避けたいこずです。



どちらの芖点があなたに近いか実甚的たたは独断的に関係なく、これらのオプションの少なくずも1぀があなたにずっお理にかなっおいるこずを願っおいたす。 最も重芁なこずずしお、私の意芋では、むンタヌセプタヌは䜜業を簡玠化し、ナヌザヌにずっお䜜業がより䟿利になりたす。 それがむンタヌセプタヌが私にそのような賄briを送るこずです。



All Articles