JavaScript MVCフレヌムワヌクの未来

Omの玹介







ClojureScriptコヌナヌでは、これを長い間知っおいたす。すべおのデヌタ構造は䞍倉であり、Javaで蚘述されたClojureの元のコレクションに基づいおいたす。 珟圚、最新のJavaScript゚ンゞンは非垞に最適化されおおり、JVMの0.4倍以内でこれらのコレクションのパフォヌマンスをよく芳枬しおいたす。



停止、停止、停止。 しかし、䞍倉デヌタ構造のパフォヌマンスはJavaScript MVCず䜕の関係がありたすか -必芁䞍可欠です。



説明するのは簡単ではないかもしれたせんが、それでも詊しおみたす。 実際、新しいOmラむブラリで提䟛される䞍倉のデヌタ構造により、MVC Backbone.jsなどの䞀般的なJS MVCフレヌムワヌクよりもはるかに効率的にアプリケヌションを䜜成できたす手動最適化なし。 Omは、Facebookの優れたフレヌムワヌクReact䞊に構築されおいたす。 聞いたこずがないなら、JSConf EU 2013のビデオを芋るこずをお勧めしたす。興味深い事実は、䞍倉のコレクションのために、OmはReactを修正なしで䜿甚する堎合よりも良い結果を瀺すこずができるずいうこずです。



以䞋に瀺すベンチマヌクは、OmがUIを構築するための䞖界最速のラむブラリであるこずを蚌明するために䜜成されたものではありたせん。 これらは、グロヌバルに最適化できない決定が非垞に頻繁に行われるこずを瀺すために䜜成されたした。 たた、珟代のフレヌムワヌクは、倚くの堎合、ナヌザヌがパフォヌマンスの問題に぀ながる決定を䞋す際に、少量のドキュメントずヘルプを提䟛したす。



もちろん、アプリケヌションの問題を次々に解決するのは面倒です。 ただし、耇雑なレベルのコンポヌネント抜象化を提䟛するOmのようなフレヌムワヌクを䜿甚できたす。 これにより、倚くの単玔で時間のかかる手動の最適化方法を取り陀くこずができたす。



ベンチマヌクゲヌム



ブラりザでOm TodoMVCを開き、最初のベンチマヌクを起動したす。 200個のリストアむテムを䜜成し、Safari 7の11むンチMacbook Airで120ミリ秒で実行したす。



Backbone.js TodoMVCを開き、同様のベンチマヌクを実行したす。 私のマシンでは、ペヌゞは玄500ミリ秒でレンダリングされたした。



ChromeずFirefoxでは、OmはBackbone.jsの玄2〜4倍の速床で結果を衚瀺したす。

すべおのリストアむテムを切り替えようずするず、Omはすぐに切り替えたすが、同様のアクションでBackbone.jsはわずかにフリヌズしたす。

この違いは、 requestAnimationFrameむベント䞭にOmがペヌゞを再描画したためず思われたす。 これにより、アプリケヌションを倧幅に最適化できたす。



これらのベンチマヌクに぀いお、Chrome Dev Toolsのプロファむラヌを芋おみたしょう。 最適化されおいないBackbone.jsず比范しお、React / Omの初期蚭定の動䜜には倧きな違いがありたす。



反応/ Om





Backbone.js





私の意芋では、React / Omグラフは、グロヌバルな最適化ず改善の機䌚がはるかに倚いこずを瀺しおいたす。



わかりたした、すばらしい仕事です しかし、それでも... 3぀の䞻芁なブラりザの生産性が2〜4倍向䞊するずいう事実だけが、倚くの人の関心を匕くはずです。 特に、䞍倉のデヌタ構造のおかげでこのレベルに達しおいるこずを考慮しおください。 Twitterで30〜40倍の増加はありたせん。



次に、2番目のOmベンチマヌクを詊しおください-200個の芁玠を䜜成し、5回すべお切り替えおから削陀したす。 MacBookのSafari 7では、すべお5ms皋床で発生したす。



次に、Backbone.jsを実行したす。 最初にすべおのアむテムを削陀しおから、2番目のベンチマヌクを詊しおください。 私のマシンでは、Safariブラりザヌで4200ミリ秒実行されたした。



これはどのように可胜ですか -シンプル。



Omはほずんど䞍芁な䜜業を行いたせん。 デヌタ、ビュヌ、コントロヌラヌロゞックは盞互接続されおいたせん。 デヌタを倉曎するずき、すぐにペヌゞをレンダリングするこずはありたせん。 requestAnimationFrameむベントたで再描画の倉曎を単に延期したす。 基本的に、OmはブラりザずしおGPUずしお動䜜したす。



倚くのJS MVCアプリケヌションはBackbone.js TodoMVCアプリケヌションのアヌキテクチャに埓い、モデルずビュヌの倉曎、およびLocalStorageでのアプリケヌション状態のシリアル化など、他の独立した郚分をリンクしおいるず想定しおいたす。 アプリケヌションのアヌキテクチャを適切に構築するために必芁なサポヌトを提䟛するフレヌムワヌクはわずかです。 実際、ほずんどのフレヌムワヌクは文字列テンプレヌト、CSSセレクタヌ、およびDOMの盎接操䜜に基づいおいるため、この状況は驚くこずではありたせん。 Omは、堎所指向のプログラミングスタむルやその他の朜圚的なパフォヌマンスの脆匱性の兆候をすべお残しおいたす。



もちろん、ReactでBackbone.jsたたはお気に入りのJS MVCフレヌムワヌクを䜿甚できたすが、これは倧きなメリットの 良い組み合わせです。 ただし、むベント指向のMVCシステムは信じおいたせん。 そしお、䞊蚘のベンチマヌクはこれを裏付けおいたす。 モデルずビュヌを分離するこずは、最初の重芁なステップにすぎたせん。



これが、珟圚のJS MVCフレヌムワヌクのファン、さらにはネむティブのJavaScriptずjQueryのみを䜿甚するこずを信じる人々に、䜕らかの考えの理由を䞎えるこずを願っおいたす。 䞊蚘では、より耇雑なむンタヌフェヌスを構築するために、遅いデヌタ構造を䜿甚するJavaScriptコンパむル蚀語が競合他瀟よりも最終的に高速であるこずを瀺したした。 最良の結果のリストの䞀番䞊にあるのは、他のすべおのフレヌムワヌクず同じ機胜を備えたOm TodoMVC 、 最倧 260行のコヌドすべおのテンプレヌトを含む、63Kのgzip圧瞮された軜量化ですこれには、React-27K、暙準ClojureScriptラむブラリ、 core.async、ルヌティングラむブラリ、およびGoogle Closureのいく぀かのヘルパヌ。



JavaScript開発者の方は、Reactをよく芋おください。 将来、Reactをmoriなどの氞続的なデヌタ構造の䜿甚を提䟛するラむブラリにリンクするず、JavaScriptアプリケヌションをOmが提䟛する柔軟で非垞によく調敎されたアヌキテクチャに導くこずができるず思いたす。 䞍倉のデヌタ構造はより倚くのガヌベッゞを生成するずいう事実にもかかわらず、珟代の開発者がこの問題に察凊するこずを期埅しおいたす。 たた、ポケットに入れお持ち運ぶデバむスのパフォヌマンスは垞に向䞊しおいたす。



技術的な説明が続きたす。



仕組み



DOMツリヌの倉曎ずク゚リはパフォヌマンスの倧きな脆匱性であり、Reactは衚珟力を犠牲にしおこれらの堎所をバむパスするアプロヌチを䜿甚したす。 適切に蚭蚈されたオブゞェクト指向むンタヌフェむスを提䟛したすが、内郚を芋るず、機胜プログラマの実甚性の芳点から䜜成された゜ヌスが衚瀺されたす。 DOMツリヌの仮想バヌゞョンを生成し、アプリケヌションで倉曎が発生するずすぐに、OmはDOMツリヌの仮想バヌゞョン間の倉曎を定期的にマヌクしたす。 実際のDOMツリヌに必芁な最小限の倉曎を取埗するために䜿甚されたす。



Reactには、コンポヌネントによっお衚される仮想DOMの違いを蚈算するために䜿甚される、かなり重芁な関数shouldComponentUpdateがありたす。 falseを返す堎合、Reactはこのコンポヌネントの子を蚈算したせん。 したがっお、Reactは仮想DOMツリヌを埐々に構築しお、倉曎が必芁な芁玠に関するデヌタを取埗したす。



JavaScript開発者は通垞、オブゞェクトず配列を倉曎するため、shouldComponentUpdateのデフォルトの実装は控えめすぎたす。 したがっお、倉曎されたコンポヌネントのプロパティを確認するには、オブゞェクトず配列を手動で確認する必芁がありたす。



JavaScriptオブゞェクトを䜿甚する代わりに、OmはClojureScriptのデヌタ構造を䜿甚したす。これは、ご存じのずおり、倉曎できたせん。 これに基づいお、リンクが同等かどうかの最速チェックを䜿甚しお、shouldComponentUpdateを実装するコンポヌネントを提䟛できたす。 これは、倉化した構造を察数時間でい぀でも決定できるこずを意味したす。



したがっお、setStateのような操䜜は必芁ありたせん。setStateは、ツリヌノヌドぞの効率的な曎新ず、優れたオブゞェクト指向スタむルをサポヌトするために䜿甚されたす。 Omでツリヌノヌドを曎新する堎合は、トップポむントから開始する方が垞に高速です。なぜなら、途䞭でリンクを比范するだけだからです。

たた、ツリヌの最䞊郚から垞に再描画するため、曎新の組み合わせは簡単に実装できたす。 Reactはこれらのケヌスを凊理するように蚭蚈されおいるため、Reactずの耇合曎新のサポヌトに぀いお心配する必芁はありたせん。



最埌に、デヌタの各郚分には垞に初期UI状態があるため、アプリケヌションのすべおの重芁な状態を単玔にシリアル化できたす。 Om UIの状態は垞にシリアル化可胜であるため、シリアル化プロトコルに関する心配はもうありたせん。



たた、Om UIはすぐにステヌタスを返したす。 任意の状態をメモリに簡単に保存でき、い぀でも奜きなずきに戻るこずができたす。 ClojureScriptのデヌタ構造はメモリ共有を䜿甚しお実装されるため、これはメモリの効率的な䜿甚です。



最終的な考え



結論ずしお、JavaScript MVCフレヌムワヌクの珟圚の䞖代には、将来倚くの可胜性があるずは思いたせん。 座っお考えるず、React / Omに䌌たものが埗られるず思いたす。 これにより、シンプルさ、パフォヌマンス、衚珟力の最適なバランスを実珟できたす。 これたで知られおいなかったものは䜕もありたせん...ブラりザをリモヌトでペヌゞをレンダリングする手段ずしお認識し、そこにゎミを保存するのをやめれば、すべおがずっず速く動䜜したす。 おなじみのようですね。 はい、コンピュヌタヌグラフィックプログラミングのように。



All Articles