Reactに良い蚀葉を蚀う

芪愛なる読者の皆さん、こんにちは



私たちはあなたを喜ばせたす-Reactラむブラリに関する悪名高いStoyan Stefanovの本はすでに完党に翻蚳されおいたす









倧芏暡なJavaScriptトランク䞊のこの若い芜は慎重に宣䌝するのに圹立぀ず考えたため、レビュヌず少し熱狂的な蚘事を読むこずをお勧めしたす。



ReactはすでにJavaScriptフレヌムワヌクの䞭で最も有望な䞻人公の1人になっおいたす。 このツヌルはシンプルで䜿いやすいですが、それにもかかわらず、Reactの有甚性を蚌明するメリットを明確に衚珟するこずは非垞に困難です。 プロゞェクトの著者自身でさえ、それを開発し始めお、圌らはそのような質問に党く答えるこずができなかったこずを認めたした。



Reactのピヌクに察する2぀の䞻な異議は次のずおりです。



  1. その䞍完党さ-Reactは、MeteorやAngularずは異なり、「フルスタック」フレヌムワヌクではありたせん。 ルヌタヌ、モデルのシステム、およびフレヌムワヌクを持っおいるはずのその他の倚くの機胜はありたせん。 MVCの「V」のみを実装しおいるず圌らは蚀いたすが、これは私が話をするケヌスずは皋遠いです。
  2. その構文は、ここではHTMLずJavascriptが混圚しおいたす。 プログラマヌはJSXを芋お、「でも...なぜ」ず尋ねたす。 たた、CSSミキシングを奜む人もいたす。


これらの問題の䞡方を匷調するずずもに、Reactの長所のいく぀かに焊点を圓おたす。 さあ、行こう



それでは、Reactずは正確には䜕ですか



Reactは、コンポヌネントを䜜成するためのJavaScriptラむブラリです。 各コンポヌネントには「倖芳」があり、これはrenderメ゜ッドずgetInitialState



定矩されたいく぀かの状態によっお蚭定されたす。 倖芳は珟圚の状態によっお異なりたす。 それは本質的に、すべおです。 そしお、これがReactを説明するのが非垞に難しい理由です-倚くの人にずっお、それはたさに「䞍完党さ」の感芚を匕き起こしたす。



䟋



 Counter = React.createClass getInitialState: -> count: 0 increment: -> @setState(count: @state.count + 1) render: -> <div> { @state.count } <button onClick={ @increment }>+</button> </div>
      
      





この䟋では、ボタンがあり、クリックするず、incrementメ゜ッドが呌び出されたす。 increment



メ゜ッドはsetStateを呌び出すため、珟圚の番号よりも1぀倚い新しい番号が蚭定されたす。



setState



メ゜ッドsetState



コンポヌネントを再びsetState



たす。 これは、Reactずそのクロヌンが同様のツヌルず異なるのはこのためです。 実際、Reactは「仮想DOM」ず呌ばれるドキュメントのオブゞェクトモデルをメモリに保存し「シャドりDOM」はわずかに異なる珟象です、そのDOMずブラりザヌに衚瀺されるものずの差を蚈算したす。 この違いに基づいお、䜜成する必芁がある倉曎のリストが䜜成されたす createElement



想像しおください。次に、これらの倉曎が適甚されたす。



もちろん、Reactでは、プロパティ小道具、タグのさたざたな属性など、他の倚くの抂念を理解する必芁がありたすが、DOMは最も重芁です。



Reactandずは䜕ですか



䞍完党さ。 良いか悪いか



Railsが登堎したずき、圌らの「満腹感」が特に宣䌝されおいたしたそのような蚀葉があればいいのですが。 それ以来、同等の自絊自足であるこずが刀明した遞択肢はありたせん。なぜなら、Railsにはデヌタベヌス抜象化のレベル、ルヌティングシステム、テンプレヌト゚ンゞンなどがあるからです。



私の知る限り、最初の遞択肢は、理由からのキャンプでした-コヌドの読み取り行で構成されるマむクロフレヌムワヌク。 それに続いお、シナトラ、チェリヌパむ、フラスコ、゚クスプレスなどが続きたした。 しかし、実際には、それらはすべおフレヌムワヌクの抂念を゚ミュレヌトし続けおおり、わずかに薄くなっおいるだけでなく、偏りが少ないように曞かれおいたす。 しかし、これらのツヌルは、倧隒ぎしおいないため販売されおおり、比范的小さなアプリケヌションの開発に䟿利です。



Reactを区別する䞍完党性は根本的に異なりたす。 Reactは単なるLite Angularではなく、根本的に異なるものです。 それは特定のタスクの非垞に良い仕事をしたすそれはりェブコンポヌネントで動䜜したす。 したがっお、プロゞェクトの倧きさに぀いお話すのは間違っおいたす。 ちなみに、Reactはパフォヌマンスに重点を眮いお䜜成されたした。それは、それを実行するFacebookコメントシステムです。したがっお、Reactは間違いなく巚倧な芏暡で䜜業するこずができたす。



考えるべきこずは次のずおりです。本栌的なフレヌムワヌクが必芁ですか、さらに、Reactに基づいお必芁なすべおのコンポヌネントを敎理できたすか。 たず、マシンむンタヌフェむスのサむズは本質的に重芁ではないこずに泚意しおください。 1GBフレヌムワヌクをダりンロヌドする必芁があるが、出力が柔軟で高速なアプリケヌションである堎合、これは問題ではありたせん。 䞀方、フロント゚ンドのサむズは非垞に重芁です。 フレヌムワヌクからの远加の負荷は、すぐに最終結果に圱響したす。



Reactには、完党なフレヌムワヌクのように芋える優れた機胜が他にもありたす。 ReactでBackboneモデルを混合する倚くの䟋を知っおいたす。 ルヌティングを远加するための優れたラむブラリがありたす 。 しかし、Reactコミュニティヌの䞻な成果の1぀はもちろんFluxです 。ただし、これはアプリケヌションアヌキテクチャぞのアプロヌチずいうよりもツヌルキットではありたせん。



Reactは略語MVCの単なるVですか



アンドレ・メデむロスが壮倧なプレれンテヌションで述べおいるように、Reactの機胜はVに限定されるものではありたせん。事実、Reactコンポヌネントには状態があるため、そのようなコンポヌネントはある意味でモデルです。 Medeirosが匷調しおいるように、状態の倉化に関する入力の衚瀺を提䟛するため、同時にコントロヌラヌの機胜、たたはビュヌの機胜も備えおいたす。 たた、コンポヌネントは他のコンポヌネントず情報を亀換し、それらに䟝存したす。 そのため、モデルずコントロヌラヌに適したラむブラリを探す必芁はありたせん。そのような意芋は間違っおいたす。



たた、Reactにはこれらのすべおが䞍可欠な抂念コンポヌネントの圢で含たれおいるため、責任分担が䞍十分に実装された、耇雑で関連性の高いコヌドを䜜成するための最も広い可胜性が開かれたす。



Medeirosは、MVIの原則 Model-View-Intentionを採甚するこずでこれらの問題を解決するこずを提案しおいたす。぀たり、Web開発ぞのかなり独特なアプロヌチを促進したす。 このアプロヌチの実装の1぀はLoopず呌ばれたす 。



HTMLずJSを混圚させる理由 ...䜕 CSSも???



10幎前、Web開発には、HTML、JS、およびCSSの分離ずいう独自の神聖な牛がありたした。 3぀のテクノロゞヌはすべお、個別のファむルずディレクトリに単独で存圚する必芁がありたした。 これらのファむルは、むンクルヌドを䜿甚しお行われた盞互参照のみが可胜です。



この分離がどれほど調和しおいるかに関係なく、これは単なる技術の区別であり、責任ではありたせん。 React Castはこのアプロヌチに疑問を抱いおおり、コンポヌネントレベルで分離が行われるべきであるこずを明確に芏定しおいたす。 コンポヌネントにはさたざたなテクノロゞヌを混圚させるこずができたすが、各コンポヌネントは適切にカプセル化および適合された芁玠であり、論理的に芋え、論理的に機胜したす。 そのような機胜のフレヌムワヌクにさたざたな技術や蚀語が関䞎しおいる堎合は、そうです。



これはすべお拒吊を匕き起こす可胜性があり、私の意芋では、これは最も䞍合理な偏芋によっお説明されたす。 ほんの数時間であなたはそれに慣れたす。 むンタヌネットで芋぀けたReactに関する意芋はすべお本質的に同じです。 突然、2぀の開いおいるファむルを隣接するタブに保持する必芁がなくなり、生産性が劇的に向䞊したす。

CSSをコンポヌネント領域に完党に移動するこずさえ䞻匵しおいたす。 ブランディングする前に、このテヌマに関するクリストファヌチェダりの興味深いプレれンテヌションをご芧ください。



反論



ここにぱコシステムがありたす。



私はこの蚘事を曞いおいたすが、ReactはGitHubでEmberを打ち負かしたした。 それはバックボヌンに劣り、圓然、Angularですが、「競合他瀟」よりもはるかに速く成長したす。



ReactはFacebookプロゞェクトであり、Facebookコメントシステムずほずんどの䌚瀟のプロゞェクトが実装されおいたす。 さらに、ReactはPinterest、AirBnB、 Khan Academy 、その他倚くのスタヌトアップで広く䜿甚されおいたす。 さらに、Atom゚ディタヌはReactの䞊に構築されおおり、MicrosoftはReactをサポヌトしおいたす。



したがっお、JavaScriptツヌルの技術的展望の䞻流に぀いお話すこずができる限り、Reactがすでに䞻流であるこずを蚌明しようずしおいたす。 これは、プロゞェクトが゚コシステムに成長するかどうかに関係なく、プロゞェクトのサポヌトに぀いおあたり心配する必芁がないこずを意味したす。 Reactのラむブラリのクラりドがあるこずを既に確認できたす-今のずころ、それらの品質を刀断するのは難しいです。



コヌドを刀断しやすい



Reactを支持する䞻な議論の1぀は、その論理に関連しおいたす。 これは非垞に真実の声明であり、その重みず重芁性を過小評䟡すべきではありたせん。



私の意芋では、コヌドを刀断するこずは、その䞭の匱い郚分ず匷い郚分を分離できるだけではありたせん。 これは、問題認識から論理的に、どこで䜕が起こっおいるかむベント、デヌタストリヌムなどを理解し、これらの芁玠を迅速に評䟡し、最埌に問題を排陀するこずを意味したす。



興味深いのは、プログラムの品質を考えるずき、バグの数だけでなく、䞀般的にアゞャむルで「バグがあっおはならない」ずいう考えだけでなく、バ​​グを修正するのにどれくらい時間がかかるかに぀いおも泚意を払う必芁がありたす。 このアむデアを習埗した私は、1幎埌にしか取り陀くこずができなかったバグを思い出したした。 それはひどいメモリリヌクを匕き起こし、特にピヌク負荷でプログラム党䜓を倧幅に遅くしたした。 バグの数だけから進んでいくず、そのような欠陥はほんの䞀握りになりたすが、決定自䜓は非垞に悪いものになりたす。



したがっお、バグを修正する期間は、コヌドを刀断するこずが難しいかどうかを瀺したす。 バグを修正するのに倚くの時間がかかる堎合、これは開発者が問題を発芋する前にかなり察凊しなければならないこずを意味したす-そしおその逆も同様です。



Reactを䜿甚するず、コヌドの説明が簡単になり、いく぀かの理由が同時に発生したす。 メむン-DOMステヌトレス。 䟋ずしお、埓来のjQueryでの切り替えの実装方法を怜蚎したす。



 // html <section> <div class="toggled">HERE I AM</div> <button class="toggler">Toggle!</button> </section> // coffescript $('.toggler').on 'click', -> $('.toggled').toggle()
      
      





䞀芋、すべおがシンプルです。 しかし、ここで問題がありたす。divが衚瀺されおいるかどうかをどのように確認したすか はい、蚀うこずができたす「ボタンボタンを偶数回クリックするず、ボタンが衚瀺され、そうでない堎合は衚瀺されたせん。」



 Toggler = React.createClass getInitialState: -> visible: true toggle: -> @setState(visible: !@state.visible) render: -> <section> { @state.visible && <div>HERE I AM</div> } <button onClick={ @toggle }>Toggle!</button> </section>
      
      





そしお今、状況は根本的に倉化しおいたす。 あなたは蚀うこずができたす「それが芋えるならば、それは衚瀺されたす。」 鉄則あなたのコヌドが理解しやすいなら、このコヌドで䜕かを衚珟するこずははるかに明確になりたす。



再利甚



これは魔法の蚀葉です。 バック゚ンドの䞖界では、コヌドフラグメントの再利甚が珟実です。 たずえば、宝石や卵などです。 しかし、クラむアント偎では、新しいプロゞェクトごずにすべおを再床組み立おる必芁があるように芋えるかもしれたせん。 実際、DOMバむパスツヌルやURLパヌサヌなどを再利甚するのは簡単ですが、コンテンツ自䜓に関しおは、各プロゞェクトが異なっお芋え始め、レむアりトの各芁玠は独創性であり、「1぀のサむズにすべお適合」したせん。



あるプロゞェクトから別のプロゞェクトにコンポヌネントが移行するのを芋たこずはありたせんが、通知やボタン、さらに蚘事やリストなどの「分子」たたは「オヌガニック」なものを含むりィンドりのようなアトミック゚ンティティが存圚する理由はわかりたせん芖芚的なデザむンをマヌクアップや動䜜から分離した堎合、タスクを「そのたた」䜿甚するこずはできたせん。



異なる䌁業で同じ開発が繰り返し䜿甚され、コンポヌネントが実装された無料のラむブラリを人々がどのように曞くかを芋るのは興味深いでしょう。 良い䟋はMaterialUIです。



プロゞェクトの成長



私が取り組んだクラむアント偎のプロゞェクトの倚くは、圓初非垞に小芏暡でしたが、その埌倧幅に成長したした。 いく぀かはリファクタリングを経お完党に異なる構造を獲埗したか、ある時点で、その䞭に即興構造が導入されたした。これは、増倧する耇雑さに察凊するのに圹立぀ず思われたした。 どちらの堎合も、そのような䜜業には倚くの時間ず劎力が必芁です-ただし、重芁なリファクタリングず同様に、開発を倧幅にスピヌドアップできたす。



コンポヌネントベヌスの開発の重芁な特城の1぀は、プロゞェクトのこれらの段階ず非垞に有機的に調和しおいるこずです。 コンポヌネントの小さなセットずきちんず敎理されたデヌタフロヌで開始されたプロゞェクトが、このような根本的な倉曎を必芁ずするこずは想像できたせん。そのすべおの郚分は非垞に安定しおいたす。



以䞊です。 実際、ここではFluxトピックに぀いおはほずんど觊れたせんでしたが、これはすでに完党に異なる蚘事の玠材です。










All Articles