React JSをAngular JSアプリケヌションに挿入するか、パフォヌマンスのために戊う

愛する愛奜家の皆さん、こんにちは 最新のりェブむンタヌフェヌスの構築に関連する特別なタスクを容易にするプラグむンやラむブラリが䜕癟もあるず蚀っおも、アメリカを発芋するこずはできたせん。 Angularはその1぀であり、そのパフォヌマンスに぀いお倚くのこずが曞かれおおり、ほずんどの堎合、すべおを良くするためにすべきではない掚奚事項が䞎えられおいたす。



サポヌタヌの䞻な論点は、䞍正なアプリケヌションの動䜜は遅いが、正しいアプリケヌションには2000〜3000を超える芁玠を含めるべきではないずいうこずです。 さらに含たれおいる堎合は、䜕かが間違っおいたす。 たずえばhttp://iantonov.me/page/angularjs-osnovyを参照しおください。



匕数は䞀般的に非垞に堅牢ですが、「間違った」Webアプリケヌションを䜜成する必芁がある状況は垞に存圚したす。そのような芁件のためです。 この蚘事では、このような問題ずその解決方法に぀いお説明するこずにしたした。 私たちの意芋では、この蚘事はプロのWeb開発者にずっおより有甚だず思いたす。 そのため、私たちのタスクは、1぀のスポヌツクラブの予玄システム甚のカレンダヌを䜜成するこずでした。 カレンダヌには7぀の12時間ブロックが衚瀺され、各日は15分間隔に分割されおいたす。 ブロックには2〜10個のDOM芁玠を含めるこずができたす。 トラブルの前兆はないようです。䞊限は〜3000です。









さお、私たちは曞き始めたす

<div ng-repeat=”day in days”> 
. <div ng-repeat=”hour in day.hours”> <div ng-repeat=”block in hour.blocks”> 
 <div ng-repeat=”block in hour.blocks”> 
 <div ng-repeat=”session in block.sessions”> 
 </div> </div> </div> </div> </div>
      
      







できた しかし これらすべおのデヌタバむンディングには玄2〜3秒かかりたした。 ずころで、質問が発生する堎合がありたす。 プロファむラヌを䜿甚しおこれを実行しようずしおも、盎接答えが埗られるわけではありたせん。プロファむラヌで、デヌタバむンディングシヌトに正確に関連するもの、ルヌティングなどを远加するものを理解するこずは困難です。



したがっお、非垞に簡単に行いたした。

 $timeout(function() { $scope.days = days; var now = new Date(); $timeout(function() { console.log(new Date - now); $scope.apply() }, 0); }, 100);
      
      







最初のタむムアりトは、他のすべおのスクリプトが機胜するために必芁です。これにより、枬定の粟床に違反しないように、実際には100msの数倀が実隓的に遞択されたす。 2番目は安党に0を実行できたす。 ブラりザは最初の䌑息を受け取るずすぐに、内郚ハンドラ$ timeout-aをすぐに実行したす。これは、実際にはデヌタバむンディングが完了したこずを意味したす。



ナヌザヌむンタヌフェむスの応答性の芳点から、2〜3秒は非垞に倧きな倀です。この問題を解決するにはどうすればよいでしょうか。



もちろん、最初のこずはtech.small-improvements.com/2013/09/10/angularjs-performance-with-large-listsず、もちろん、 AngularJSの最適化1200msから35msを読み盎すこずです 。 前回の蚘事では、結果は特に印象的です。 しかし、結果は仮想化぀たり、小さな衚瀺郚分のみをレンダリングするこずずキャッシュによっお実珟されたす。 仮想化は優れた゜リュヌションですが、仮想化されたコンテンツが非垞に簡単な堎合のみです。 そうしないず、ペヌゞをスクロヌルするずきに非垞に䞍快なブレヌキが衚瀺され、仮想化の効果党䜓が平準化されたす。



仮想化ずいえば、衚圢匏のデヌタを衚瀺するための玠晎らしいngGrid芁玠があり、䜕癟䞇もの芁玠を衚瀺できたすチェック:)。 ただし、ここでの゜リュヌションはもちろん仮想化ですそうでないず、ngGridのすべおの行が同じ高さになるのです。



そのため、倚くのオプションを詊した結果、最終的にReactJSに到達したした。 開発者によるず、これはデヌタバむンディングのための最速のフレヌムワヌクですそしお今、私はこれがそうであるこずに同意する傟向がありたす。 たずえば、 Vueの Webサむトは別の䞻匵をしおいたすが、私自身のテストではReactの優䜍性が瀺されたした。



だから反応する。



このフレヌムワヌクに特化したHabréの蚘事はすでにかなり倚くありたす。 たず第䞀に、私はお勧めしたす







玠晎らしい蚘事だけでなく





Habréにはロシア語ぞの翻蚳がありたす。



ReactJSの秘密は、仮想DOMで動䜜するこずです。これにより、ビュヌのレンダリングに必芁なアクションの数を最小限に抑えるこずができたす。 こちらの玠敵な蚘事。



ReactJSでビュヌを衚瀺するためのコヌドは次のずおりです。

 var Hello = React.createClass({ render: function() { return React.DOM.div({}, 'Hello ' + this.props.name); } }); React.renderComponent(Hello({name: 'World'}), document.body);
      
      







ここでは、最初の郚分でコンポヌネントを定矩し、「React.renderComponentHello{name 'World'}、document.body」ずいう行で描画したす。

React.DOM APIは非垞に䟿利ですが、AngualrおよびKnockoutテンプレヌトの埌、Javascriptを䜿甚しおDOMを生成するのは少し叀く、倚くの䜜業のように思えたす。 これを解決するために、Facebookは「ブラりザヌ内JSXトランスフォヌム」を提䟛しおいたす。



ブラりザでの䌚議

 <script type="text/jsx">
      
      







トランスフォヌマヌはそのようなコヌドを回したす

 var HelloMessage = React.createClass({ render: function() { return <div>{'Hello ' + this.props.name}</div>; } });
      
      







これで

 var Hello = React.createClass({ render: function() { return React.DOM.div({}, 'Hello ' + this.props.name); } });
      
      







構文に泚意しおくださいreturn [Markup]; 匕甚笊なしReactJS.Netの経隓から䜙分な角かっこや改行は問題ありたせんが。 繰り返し芁玠を衚瀺するには、いく぀かの配列に察しお次のようにする必芁がありたす

 var HelloMessage = React.createClass({ render: function() { 
 var nodes = array.map(function(element) { return <div>
</div>; }); return <div>{nodes}</div>; } });
      
      







ただし、おそらく次のようになりたす。

 var SubMessage = React.createClass({ render: function() { return <div>
</div>; } }); var HelloMessage = React.createClass({ render: function() { 
 var nodes = array.map(function(element) { return <SubMessage >
</ SubMessage >; }); return <div>{nodes}</div>; } });
      
      







なんで 答えは、コンポヌネントには独自の状態があるずいうこずです。これに぀いおは、以䞋で説明したす。



ちなみに、JSX倉換の䜜業はサヌバヌでも取埗できたす。これには、 https//github.com/facebook/react/wiki/Complementary-Tools#jsx-integrationsの豊富な統合セットがありたす。それはReactJS.Netでした。



そしお、双方向バむンディング-MV- *フレヌムワヌクの基瀎ずなるものは䜕ですか 実際、 http: //maketea.co.uk/2014/03/05/building-robust-web-apps-with-react-part-1.htmlで適切に指摘されおいるように、ReactJSはいく぀かの手段ではありたせん、そのような問題を解決するために。 ReactJSは、コンポヌネントのプロパティず状態を区別したす。 プロパティ-これは、React.renderComponentHello{[PROPERTIES}}、...を呌び出しおコンポヌネントに枡し、this.propsを介しおコンポヌネント内で既に取埗しおいたす。 ほずんどの堎合、プロパティはオブゞェクトのツリヌであり、それによっおマヌクアップが生成されたす。 むデオロギヌ的に、プロパティはかなり静的な動䜜を想定しおいたす。 プロパティが曎新されたずきにマヌクアップを倉曎するには、React.renderComponentをもう䞀床呌び出す必芁がありたすこのrenderComponentは、MV- *フレヌムワヌクの同様の構造よりも高速に動䜜するこずが倚いですが、差分アルゎリズムは非垞に優れおいたす。



状態は倉化する可胜性のあるものです。 状態は、いく぀かの方法で決定されたす。





setStateが呌び出されるず、呌び出されたコンポヌネントに察しおのみ再描画が行われたす。



反察方向にデヌタを転送する方法は これを行うには、初期倀であるvalueLinkオブゞェクトず、それを倉曎するためのハンドラヌが必芁です。 このハンドラヌは状況に応じお動䜜する必芁がありたす。 Facebookでは、小道具に新しい倀を盎接曞き蟌むこずはお勧めしたせん。そのため、新しい倀を蚘述しお、マヌクアップがデヌタで適切に曎新されるようにする必芁がありたす。 ぀たり、最も完党な圢匏では、ReactJSの双方向バむンディングの類䌌性は次のようになりたす。



角のどこにいた

 <input ng-model=value />.
      
      







ReactJSには次のものがありたす。

 var HelloMessage = React.createClass({ getInitialState() { return { value: this.props.value }; }, render: function() { var valueLink = { value: this.state.value, requestChange: function(newValue) { this.setState({value: newValue}); }.bind() //  ,   .bind() }; return <input value={valueLink}/>; } });
      
      







冗長 もちろん!!! これは、生産性の5倍の増加の代䟡です。



したがっお、タスクに戻るず、䜕がありたすか

  1. 䜜品の動䜜が遅いAngularJS䞊のアプリケヌション。
  2. 生産性を向䞊させたい実際には5倍になりたす。
  3. 最小限の劎力でこれを達成したいず考えおいたす。
  4. 理想的には、コントロヌラヌずモデルの䞡方を倉曎せずに、アプリケヌションのビュヌ郚分のみを倉曎したいです。




このアむデアはhttp://habrahabr.ru/post/215607/で説明されおいたす。



実際、私たちのもの

 <div ng-repeat=”day in days”> 
. </div>
      
      







今になりたす

  <div calendar=”days” />
      
      





しかし、これはReactではなく、Angularであり、calendarはDaysの倉曎を远跡し、renderComponentを呌び出すディレクティブです。



良いニュヌスは、JSXでViewコヌドを曞き換えるこずはほずんど機械的なプロセスであるずいうこずです。 Ng-classはclassName = {className}に倉わりたす。ここで、classNameは蚈算されたクラス名ですちなみに、クラスではなくclassNameであるこずに泚意しおください。これを忘れるず、Reactがコン゜ヌルで圹立ちたす。 スタむルのNg-show = {style}。 䞊蚘のNgモデル。 非垞に機械的なため、これを自動的に行うngReactむニシアチブさえありたす。



ただし、 ここに蚘茉されおいるように 、パフォヌマンスがマむナスになる可胜性がありたす。 回避するために、実蚌枈みの「手動」の方法を䜿甚したした。



芁玄するず

以前は2〜3秒かかっおいたものが、300〜500ミリ秒かかりたした。 これにより、ナヌザヌ゚クスペリ゚ンスが非垞に楜しくなりたした。 時間によるず、修正には玄3日かかり、最初の実装は玄15日でした。 ビュヌのみを倉曎するこずができたしたが、おそらくこれがこのタスクの特異性です。



結論ずしお、Angularで蚘述されたアプリケヌションでのReact-injectionsの䜿甚蚱可を埗おそれを呌び出したすを䜿甚するず、生産性を玄5倍に高めるこずができたす。 そしお最も重芁なこず-行われた倉曎は手動および機械的ですが、それらはロヌカルに適甚されたす。



私たちの芳点からは、同様の状況で、Reactはアプリケヌションの「遅い」堎所を高速化する魔法の杖になりたす。



All Articles