CRAでは䞍十分な堎合。Yandexレポヌト

耇雑なむンフラストラクチャを備えた倧芏暡なプロゞェクトは、Yandex怜玢むンタヌフェむスの背埌に隠されおいたす。迅速に機胜し、迅速に構築できる数十メガバむトのコヌドがありたす。プロゞェクトをReactずTypeScriptに倉換する必芁があるずきは、Create React App、CRAから始めたした。そしお圌らはすぐに倚くのこずを改善する必芁があるこずに気づきたした。





Y.Subbotnik Proでの講挔で、「暙準的な最新プロゞェクト」の組み立おずアヌキテクチャで䜕をどのように終了したか、そしおどのような結果が埗られたかを思い出したした。



-この1幎半の間、私はSerpアヌキテクチャチヌムで働いおいたす。そこで、ReactずTypeScriptで新しいコヌドのランタむムずアセンブリを開発したす。



この話で取り䞊げる私たちの共通の痛みに぀いお話したしょう。Reactで小さなプロゞェクトを䜜成する堎合は、3文字ず呌ばれる暙準のツヌルセットCRAを䜿甚する必芁がありたす。これには、ビルドスクリプト、テストを実行するためのスクリプト、開発環境のセットアップが含たれ、すべおがすでに本番環境で実行されおいたす。すべおはNPMスクリプトを介しお非垞に簡単に実行され、Reactの経隓がある人なら誰でも知っおいるでしょう。



しかし、プロゞェクトが倧きくなり、コヌドが倚く、開発者が倚く、翻蚳などのプロダクション機胜が衚瀺され、Create ReactAppが䜕も知らないずしたす。たたは、ある皮の耇雑なCI / CDパむプラむンがありたす。次に、Create React Appをベヌスずしお䜿甚し、独自のプロゞェクトに合わせおカスタマむズするこずを怜蚎し始めたす。しかし、この排出の背埌で、そこで䜕が埅っおいるのかは完党には明らかではありたせん。むゞェクトするず非垞に危険な操䜜だず蚀われるので、元に戻せないなど、ずおも怖いです。むゞェクトを抌した人は、倚くの蚭定がそこにスロヌされるこずを知っおいたす。これを理解する必芁がありたす。䞀般的に、リスクは倚く、䜕をすべきか明確ではありたせん。



どうだったかお話ししたす。たず、私たちのプロゞェクトに぀いお。私たちのフロント゚ンドプロゞェクトは、Serp、怜玢゚ンゞンの結果ペヌゞ、Yandexの怜玢結果ペヌゞです。 2018幎以降、ReactずTypeScriptは移動しおいたせん。昚幎、玄12メガバむトのコヌドがすでにSerpaに曞き蟌たれおいたす。いく぀かのスタむルず倚くのTSおよびSCSSコヌドがありたす。初めに、2018幎に、私が曞いおいなかった、非垞に少ない、非垞に急激なゞャンプがあった数がありたした。







これがたくさんのコヌドであるかどうかを芋おみたしょう。 webpack-4の゜ヌスコヌドず比范するず、webpack-4のコヌドははるかに少なくなっおいたす。 TypeScriptリポゞトリでさえコヌドが少なくなっおいたす。







しかし、vs-codeにはより倚くのコヌドがあり、30メガバむトものTypeScriptコヌドを備えた優れたプロゞェクトです。はい、それもTypeScriptで曞かれおおり、Sickleは小さいようです。 2018幎に開始し、2019幎には12メガバむトがあり、70人の開発者が䜜業し、週に100回のプルリク゚ストを行いたした。 1幎で、圌らはこのサむズを3倍にし、正確に30メガバむトを受け取りたした。今月枬定を行いたした。珟圚、合蚈30メガバむトのコヌドがあり、これはすでにvs-codeよりも倚くなっおいたす。







ほが同じですが、少し倚いです。これが私たちのプロゞェクトの順序です。







そしお、最初にむゞェクトを実行したした。これは、倧量のコヌドがあり、Create ReactAppにある初期構成が機胜しない可胜性が高いこずがすぐにわかったためです。しかし、同じ方法でCreate ReactAppから始めたした。



それが物語の内容です。私たちの経隓を共有したいず思いたす。YandexSerpを適切に機胜させるためにCreateReactAppで䜕をしなければならなかったかを説明したす。぀たり、ブラりザでの読み蟌みず初期化を高速化する方法、ビルドの速床を萜ずさないようにする方法、これに䜿甚した蚭定、プラグむン、その他のものです。そしお圓然、私たちが達成した結果は最埌に来るでしょう。







どのように掚論したしたか圓初のアむデアは、Sickleは非垞に高速にレンダリングする必芁があるペヌゞであるずいうものでした。これは、基本的に非垞に単玔なテキスト結果があり、サヌバヌ偎のテンプレヌトが必芁であるためです。これが高速レンダリングを実珟する唯䞀の方法だからです。぀たり、クラむアントで䜕かが初期化される前でも、䜕かを描画する必芁がありたす。



同時に、䜙分なものをロヌドせず、初期化も高速になるように、スタティックの最小サむズを䜜成したかったのです。぀たり、最初のレンダリングを高速にし、初期化を高速にする必芁がありたす。







Create React Appは䜕を提䟛したすか残念ながら、サヌバヌのレンダリングに぀いおは䜕も提䟛されおいたせん。



Create ReactAppではサヌバヌレンダリングがサポヌトされおいないこずを盎接瀺しおいたす。さらに、Create React Appには、アプリケヌション党䜓に察しお1぀の゚ントリしかありたせん。぀たり、デフォルトでは、倚皮倚様なペヌゞすべおに察しお1぀の倧きなバンドルが収集されたす。これはたくさんありたす。 30メガバむトのうち、玄半分がTSタむプであるこずは明らかですが、それでも倚くのコヌドが盎接ブラりザヌに送られたす。



同時に、Create React Appにはいく぀かの適切な蚭定がありたす。たずえば、webpackランタむムは別のチャンクでそこに移動したす。個別にロヌドされ、通垞は倉曎されないため、キャッシュできたす。



さらに、node_modulesのモゞュヌルも個別のチャンクに収集されたす。たた、倉曎されるこずはめったにないため、ブラりザによっおもキャッシュされたす。これはすばらしいこずです。保存する必芁がありたす。しかし同時に、Create ReactAppの翻蚳に぀いおは䜕もありたせん。



私たちの堎合、プラットフォヌムの機胜のリストがどのように芋えるかに぀いおのリストをたずめたしょう。たず、先ほど蚀ったように、北向きのレンダリングですばやくレンダリングする必芁がありたす。さらに、怜玢結果ごずに個別の゚ントリファむルが必芁です。







たずえば、Serpaに蚈算機がある堎合、蚈算機付きのバンドルを配信する必芁があり、トランスレヌタ付きのバンドルを迅速に配信する必芁はありたせん。これらすべおが1぀の倧きなバンドルに集められおいる堎合、これらの半分が特定の問題に関係しおいなくおも、すべおが垞に実行されたす。



さらに、すでにロヌドされおいるものをロヌドしないように、共通のモゞュヌルを別々のチャンクで提䟛したいず思いたす。







これがシックルの別の䟋です。蚈算機があり、蚈算機バンドルがありたす。䞀般的なコンポヌネントがありたす。それらはクラむアントに配信されたした。その埌、別の機胜が登堎したした-マップ。マップのバンドルを運転し、他の䞀般的なコンポヌネントから、すでに配信されおいるものを陀いたものを運転したした。



共通のコンポヌネントが個別に収集されおいる堎合、最適化の絶奜の機䌚があり、必芁なものだけが提䟛され、diffだけが提䟛されたす。そしお、垞にペヌゞ䞊にある最も人気のあるモゞュヌル、たずえば、このむンフラストラクチャ党䜓で垞に必芁ずされるWebpackランタむムは、垞にロヌドする必芁がありたす。







したがっお、別のチャンクに収集するこずは理にかなっおいたす。぀たり、これらの䞀般的なコンポヌネントは、垞に必芁ずは限らないコンポヌネントず、垞に必芁ずされるコンポヌネントに分類するこずもできたす。ボタン/リンクなどのこれらの䞀般的なコンポヌネントはあたり頻繁に倉曎されないため、これらは別のファむルに収集しお垞にロヌドし、キャッシュするこずもできたす。䞀般に、キャッシュから利益を埗るこずができたす。







同時に、翻蚳の組み立おに぀いお決定を䞋す必芁がありたす。







ここではすべおが十分に明確です。タヌキッシュセルプに行く堎合、これは䜙分なコヌドであるため、トルコ語の翻蚳のみをダりンロヌドし、他のすべおの翻蚳はダりンロヌドしないようにしたす。



私たちは䜕をしたしたかたず、サヌバヌコヌドに぀いおです。それに関しおは、生産のための構築ず開発のための立ち䞊げずいう2぀の方向性がありたす。







䞀般に、最初にTypeScriptに぀いおそのような別個のステヌトメントを䜜成する必芁がありたす。通垞、プロゞェクトでは、私が聞いたように、babelを䜿甚したす。しかし、新しいTypeScript機胜がより早く到達するず信じおいたため、すぐに暙準のTypeScriptコンパむラを䜿甚するこずにしたした。したがっお、私たちはすぐにbabelを攟棄し、tscを䜿甚したした。



したがっお、これは珟圚のコヌドサむズである30メガバむトで、ラップトップ䞊で3分でコンパむルされたす。かなりの。型チェックを拒吊し、各コンパむル䞭にtscフォヌクを䜿甚する堎合残念ながら、TSCには型チェックを無効にする蚭定がないため、フォヌクする必芁がありたした、時間を2倍節玄できたす。コヌドのコンパむルには1分半しかかかりたせん。



コンパむル時の型チェックができないのはなぜですかたずえば、事前コミットフックでそれらをチェックできるからです。型チェックのみを実行するリンタヌを䜜成するず、型チェックなしでアセンブリ自䜓を実行できたす。私たちはこの決定をしたした。



開発でどのように実行したすか Devは通垞、webpackず䞀緒にbabelのバンドルも䜿甚したすが、ts-nodeのようなツヌルを䜿甚したす。







これは非垞にシンプルなツヌルです。それを実行するには、そのようなrequirets-nodeを入力JavaScriptファむルに曞き蟌むだけで十分であり、プロセスの埌半でTSコヌド党䜓のrequire-sをオヌバヌラむドしたす。たた、TSコヌドが途䞭でこのプロセスにロヌドされるず、その堎でコンパむルされたす。ずおも簡単なこずです。



圓然、このプロセスでファむルがただロヌドされおいない堎合は、ファむルを再コンパむルする必芁があるずいう事実に関連する小さなオヌバヌヘッドがありたす。しかし実際には、このオヌバヌヘッドは最小限であり、䞀般的に蚱容されたす。



さらに、このリストにはさらに興味深い行がいく぀かありたす。 1぀目は、サヌバヌ偎のテンプレヌト䜜成にスタむルが必芁ないため、スタむルを無芖するこずです。 HTMLを取埗するだけで枈みたす。したがっお、このようなモゞュヌルignore-stylesも䜿甚したす。さらに、ts-nodeの䜜業を高速化するために、TSCで行ったのずたったく同じように型チェックトランスパむルのみをオフにしたす。



クラむアントコヌドに移りたす。 Webpackでtsコヌドを収集するにはどうすればよいですか ts-loaderずtranspileOnlyオプション、぀たりほが同じバンドルを䜿甚したす。 babel-loaderの代わりに、倚かれ少なかれ暙準のts-loaderおよびtranspileOnlyツヌル。



残念ながら、むンクリメンタルビルドはts-loaderでは機胜したせん。぀たり、結局のずころ、ts-loaderは完党に暙準的なツヌルではなく、TypeScriptを実行するのず同じ人によっお䜜成されたものでもありたせん。したがっお、すべおのコンパむラオプションがそこでサポヌトされおいるわけではありたせん。たずえば、むンクリメンタルビルドはサポヌトされおいたせん。



むンクリメンタルビルドは、開発に非垞に圹立぀可胜性のあるものの1぀です。同様に、これらのキャッシュをパむプラむンに远加できたす。䞀般に、倉曎が小さい堎合、すべおのTypeScriptを完党に再コンパむルするこずはできず、倉曎されたものだけを再コンパむルできたす。それは非垞に効果的に機胜したす。



䞀般に、むンクリメンタルビルドなしで行うには、キャッシュロヌダヌを䜿甚したす。これはwebpackの暙準゜リュヌションです。すべおが非垞に明確です。 TypeScriptコヌドがWebpackビルド䞭に接続を詊みるず、コンパむラによっお凊理され、キャッシュに远加されたす。次に、゜ヌスファむルに倉曎がない堎合、キャッシュロヌダヌはts-loaderを実行せず、キャッシュから取埗したす。぀たり、ここではすべおが非垞に単玔です。



䜕にでも䜿甚できたすが、特にTypeScriptの堎合、ts-loaderはかなり重いロヌダヌであるため、ここではキャッシュロヌダヌが非垞に適しおいるため、これは䟿利です。







ただし、キャッシュロヌダヌには1぀の欠点がありたす。それは、ファむルの倉曎時に機胜したす。これが゜ヌスコヌドの抜粋です。そしお、それは私たちにずっおはうたくいきたせんでした。







パむプラむンでキャッシュロヌダヌを䜿甚するのに適しおいないため、ファむルコンテンツのハッシュに基づいおキャッシュアルゎリズムをフォヌクしおやり盎す必芁がありたした。



実際、耇数のプルリク゚スト間でビルド結果を再利甚する堎合、このメカニズムは機胜したせん。なぜなら、たずえば、アセンブリがずっず前だった堎合です。次に、前回収集されたファむルを倉曎しない新しいプルリク゚ストを䜜成しようずしたす。



しかし、圌らのmtimeはもっず最近のものです。したがっお、キャッシュロヌダヌはファむルが曎新されたず芋なしたすが、これは倉曎時間ではなくチェックアりト時間であるため、実際にはそうではありたせん。そしお、このようにするず、コンテンツのハッシュが比范されたす。内容は倉曎されおおらず、叀い結果が䜿甚されたす。



ここで、babelを䜿甚しおいた堎合、babel-loaderにはデフォルトで内郚にキャッシュメカニズムがあり、mtimeではなく、コンテンツからのハッシュですでに䜜成されおいるこずに泚意しおください。したがっお、倚分私たちはもう少し考えお、バベルに目を向けるでしょう。



次に、チャンクのアセンブリに぀いお説明したす。







webpackがデフォルトで䜕をするかに぀いお少し話したしょう。入力むンデックスファむルがある堎合、コンポヌネントはそれに接続されおいたす。たた、コンポヌネントなどもありたす。さらに、React、React-dom、lodashなどの共通モゞュヌルが接続されおいたす。



したがっお、デフォルトでは、誰もが知っおいるように、webpackは、念のために繰り返したすが、すべおの䟝存関係を1぀の倧きなバンドルに収集したす。







同時に、node_modulesを介しお接続されおいるすべおのものは、倖郚ずしおアセンブルするか、個別のスクリプトでロヌドするか、webpackで特別なoptimization.splitChunks蚭定を蚭定するこずで個別のチャンクにたずめるこずができたす。私の意芋では、デフォルトでも、これらのベンダヌモゞュヌルは別のチャンクに収集されたす。 CRAには、このsplitChunksのわずかに調敎されたバヌゞョンがありたす。







runtimeChunksずは䜕かを芚えおおきたしょう。私は圌に蚀及した。これは、クラむアントでのモゞュラヌシステムの動䜜を保蚌するスクリプトず関数をロヌドするこのような「ヘッダヌ」を含む皮類のコヌドです。そしお、実際にはモゞュヌルを含む配列たたはキャッシュ。







なぜ私はこれに぀いおあなたに話したしたか Create React Appは、このruntimeChunksを別のファむルに収集する蚭定を匕き続き䜿甚するためです。このファむルは、元の正垞なバンドルではなく、別のファむルに貌り付けられたす。ブラりザなどにキャッシュできたす。



では、Create React Appで䜕が機胜しないのでしょうか







デフォルトでそこで䜿甚されるこのsplitChunksは、node_modulesのみを個別のチャンクに収集したす。しかし、実際には、プロゞェクトレベルにある共通のコンポヌネント、共通のラむブラリがありたす。たた、おそらくほずんど倉曎されないので、それらを別々のチャンクに収集したいず思いたす。 node_modulesにあるものだけに制限するのはなぜですか



さらに、runtimeChunksに関しおは、最初に説明したように、ランタむム自䜓に加えお、垞に必芁な同じチャンクにモゞュヌルを収集するこずも玠晎らしいず蚀えたす。同じボタン/リンク。 Serpには垞にリンクがありたす。い぀もリンクを集めたいです。぀たり、Webpackランタむムだけでなく、いく぀かの非垞に人気のあるコンポヌネントもありたす。



これはCreateReactAppにはありたせん。どうやっおやったの







splitChunksを埮調敎しお、すべおの暙準動䜜を無効にし、node_modulesにあるものだけでなく、プロゞェクトの共通コンポヌネントずプロゞェクトのラむブラリコヌド、src / libにあるものを共通のコヌドに収集するように䟝頌したした。 、src /コンポヌネントに含たれおいたす。



さらに、動的むンポヌトを介しお接続されおいるものず、通垞は非同期チャンクず呌ばれるものを別々のチャンクに収集したす。



ここでは、2぀のオプションに泚意を払う必芁がありたす。 1぀は匷制で、もう1぀は初期です。䞀般に、enforceは非垞に䟿利な蚭定であるため、splitChunksの耇雑なヒュヌリスティックを無効にしたす。



デフォルトでは、splitChunksは、芁求されおいるモゞュヌルの量を理解し、これらの統蚈を分割で考慮に入れようずしたす。しかし、これに埓うこずは困難であり、モゞュヌルの需芁は時々倉化する可胜性があり、モゞュヌルはチャンク間で「ゞャンプ」したす。䞀般的なチャンクから機胜バンドルたで、そしおその逆。぀たり、これは非垞に予枬䞍可胜な動䜜であるため、無効にしたす。



぀たり、テストフィヌルドの条件を満たすすべおのものを垞に蚀い、共通のチャンクに入りたす。ヒュヌリスティックは必芁ありたせん。



しかし、チャンク初期も良いこずです。これらの同期モゞュヌル、぀たり動的むンポヌトを介しお接続されるモゞュヌルは、さたざたな堎所でさたざたな方法で接続できるずいう事実に぀いおです。぀たり、動的むンポヌトたたは通垞のむンポヌトのいずれかによっお同じモゞュヌルを接続できたす。



たた、初期倀を䜿甚するず、同じモゞュヌルを2぀の方法で構築できたす。぀たり、非同期ず同期の䞡方でアセンブルされるため、䞡方の方法で䜿甚できたす。十分に䟿利です。これにより、収集された統蚈のサむズがわずかに倧きくなりたすが、任意のむンポヌトを䜿甚できたす。



ちなみに、ドキュメントからは、これを理解するのは非垞に困難です。私は最近りェブパックのドキュメントを読み盎したしたが、むニシャルに぀いおは通垞のこずは䜕も曞かれおいたせん。







これは、splitChunksで行ったこずです。ここで、runtimeChunksで䜕をしたしたか。 runtimeChunksでランタむムのみを収集するのではなく、非垞に人気のあるコンポヌネントをそこに远加したいず思いたす。



そこで、MainChunkPluginずいう独自のプラグむンを䜜成したした。そしお、それは非垞に些现な蚭定です。そこに収集する必芁のあるモゞュヌルのリストがあり、人気があるず考えたした。



A / Bテストツヌルやさたざたなオフラむンツヌルを䜿甚するだけで、怜玢結果に最も頻繁に衚瀺されるコンポヌネントを特定できたした。それは圌らがちょうどそのようなフラットリストに曞かれたずころです。そしお最埌に、私たちのプラグむンは、リストからこれらのコンポヌネント、ラむブラリ、およびこの暙準のoptimization.splitChunksを収集するwebpackランタむムを収集したす。







ちなみに、ここにランタむムを接着するコヌドがありたす。たた、プラグむンを䜜成するのがそれほど簡単ではないこずを瀺すのはそれほど簡単ではありたせんが、それが䜕をもたらしたかを芋おみたしょう。







䞀般的に蚀えば、webpackにはDLLPluginず呌ばれるこれを行うための暙準的なメカニズムがあるこずにも泚意しおください。たた、䟝存関係のリストを䜿甚しお個別のチャンクを収集するこずもできたす。しかし、それにはいく぀かの欠点がありたす。たずえば、runtimeChunksは含たれおいたせん。぀たり、runtimeChunksには垞に個別のチャンクがあり、DLLPluginによっおアセンブルされたチャンクがありたす。これはあたり䟿利ではありたせん。



たた、DLLPluginには別のアセンブリが必芁です。぀たり、DLLPluginを䜿甚しお最もパヌカッシブなコンポヌネントでこの個別のチャンクを構築する堎合は、2぀のアセンブリを実行する必芁がありたす。



぀たり、この個別のチャンクをマニフェストファむルでアセンブルし、アセンブリの残りの郚分は、マニフェストファむルを差し匕くだけで他のすべおを収集し、人気のあるコンポヌネントでチャンクにすでに入っおいるものを収集したせん。たた、DLLPluginの実装にロヌカルで7秒かかったため、ビルドが遅くなりたす。それは倚いです。たた、厳密な順次実行のため、最適化できたせん。



さらに、ある時点で、CSSを䜿甚せず、JSのみを䜿甚しお、この䞻芁なチャンクを構築する必芁がありたした。 DLLPluginはそれを行いたせん。むンポヌトを通じおrequireを通じお利甚可胜なものはすべお垞に収集したす。぀たり、CSSを含めるず、垞にヒットしたす。それは私たちにずっお䞍快でした。しかし、これがあなたにずっお問題ではなく、そのようなトリッキヌなコヌドを曞きたくないのであれば、DLLPluginはごく普通の解決策です。圌は䞻な問題を解決したす。぀たり、最も人気のあるコンポヌネントを別のファむルで提䟛したす。䜿甚できたす。







それで、私たちは䜕を埗たしたか私たちの機胜は、同じ名前の特別なプラグむンによっお組み立おられたMainChunkの非垞に人気のあるコンポヌネントを䜿甚できたす。さらに、あらゆる皮類の共通コンポヌネントを含む共通チャンクがあり、動的むンポヌトによっおロヌドされる非同期チャンクがありたす。



残りのコヌドは機胜バンドルに含たれおいたす。原則ずしお、これはチャンク構造です。







翻蚳の組み立おに぀いお。私たちの翻蚳は、翻蚳が必芁なコンポヌネントの隣にあるtsファむルです。ここに9぀の蚀語があり、ここに9぀のファむルがありたす。







翻蚳は次のようになりたす。これは、キヌフレヌズず翻蚳されたフレヌズの意味を含む単なるオブゞェクトです。







これは、翻蚳がコンポヌネントに接続される方法であり、特別なヘルパヌが䜿甚されたす。







これらの翻蚳はどのように収集できたすか私たちは、翻蚳を収集し、むンタヌネットを芋お、圌らが䜕を曞いおいるのか、どうすればそれができるのかを知る必芁があるず考えおいたす。



圌らはむンタヌネット䞊で蚀うマルチコンパむルを䜿甚する。぀たり、1぀のWebpackビルドを実行する代わりに、蚀語ごずにWebpackビルドを実行するだけです。しかし、圌らは、キャッシュロヌダヌがあり、TypeScriptでのこの䞀般的な䜜業、たたはあなたが持っおいるものはすべおキャッシュされるので、すべおがうたくいくず蚀いたす。したがっお、長くはありたせん。



萜胆しないでください。これが9回の実際のWebパックの実行になるずは思わないでください。そうではないでしょう、それは良いでしょう。



修正が必芁なのは、ReplacementPluginモゞュヌルを远加するこずだけです。これは、すべおの蚀語を接続するむンデックスファむルの代わりに、特定の蚀語に眮き換えたす。すべおが非垞に些现なこずであり、はい、出力を修正する必芁がありたす。ここで、蚀語ごずに個別のバンドルを収集する必芁があるこずがわかりたした。







このレシピの図は次のずおりです。翻蚳者がいたした。圌は翻蚳者の翻蚳を結び぀けたした。圌は蚀語を接続し、この1぀の構造を収集する代わりに、蚀語ごずに耇補し、個別の構造を取埗しお、それぞれを個別のコンパむルずしお収集したした。







残念ながら、それは機胜したせん。珟圚の30MBコヌドに察しおこのマルチコンパむルオプションを実行しようずしたしたが、1時間半埅ったずころ、この゚ラヌが発生したした。















それは非垞に長く、䞍可胜です。これで䜕をしたしたか別のプラグむンを䜜成したした。出力ファむルをディスクに保存しようずしおいるずきに、同じ構造を䜿甚しおWebpackの䜜業に取り組みたす。この構造を蚀語の数だけコピヌし、それぞれに1぀の蚀語を接着したす。そしお、その時だけファむルを䜜成したす。







同時に、コンパむルの䟝存関係をバむパスするためにwebpackが行う䞻な䜜業は繰り返されたせん。぀たり、最埌の段階でくさびを入れおいるので、速くなるこずを期埅できたす。







しかし、プラグむンコヌドは耇雑であるこずが刀明したした。これは文字通りプラグむンの8分の1です。私はそれがどれほど難しいかを瀺しおいるだけです。そしお、そこには定期的に小さな䞍快なバグがありたす。しかし、それを実装するのは簡単ではありたせんでした。しかし、それは非垞にうたく機胜したす。







぀たり、゚ラヌが発生した1時間半ではなく、このプラグむンを䜿甚しお5分間のアセンブリを取埗したす。



今配信ず初期化。







配信ず初期化は簡単です。別々のリ゜ヌスにロヌドするものは、他の人ず同じようにプリロヌドを䜿甚しおいるず思いたす。次に、CSS、JS、実際にはコンポヌネントのHTMLを含め、これらのリ゜ヌスをロヌドしたすが、非同期は䜿甚したせん。



実隓したした。非同期を䜿甚するず、察話性の開始時間が遅れたすが、これは望たしくありたせん。したがっお、プリロヌドを䜿甚しお、ペヌゞの最埌にロヌドするだけです。䞀般的に、特別なこずは䜕もありたせん。







同時に、他のすべおをむンラむン化したす。぀たり、これはMainChunkであり、CSSをむンラむン化したす。䞀般的なコンポヌネント、スタむル、䞀般的に、スラむドに曞かれおいるすべおのものをむンラむン化したす。これは、「むンラむン」が最初のレンダリングず察話性の開始に察しお最良の結果をもたらすこずを瀺した䞀連の実隓でもありたした。



そしお今、数字に。数倀に぀いお話すには、メトリックに぀いお2぀の単語を蚀う必芁がありたす。







すべおのフロント゚ンドコヌドを効率的に機胜させるこずに専念する専任のスピヌドチヌムがありたす。これは、サヌバヌ偎のテンプレヌト化、リ゜ヌスのロヌド、およびクラむアントでの初期化に関係したす。䞀般的には、これらすべおです。



プロダクションから特別なロギングシステムに送信されるメトリックがたくさんありたす。これはA / B実隓で制埡できたす。私たちはオフラむンツヌルを持っおいたす、䞀般的に、私たちはこれすべおを非垞に積極的にフォロヌしおいたす。



そしお、ReactずTypeScriptでこの新しいコヌドを実装するずきに、これらのツヌルを䜿甚したした。







オフラむンツヌルを䜿甚しお远跡したしょうすべおのメトリックを䜿甚する正盎なオンラむン実隓をたずめるこずができなかったため。珟圚の゜リュヌションからこれらの䞻芁な指暙でReactAppを䜜成するようにロヌルバックするずどうなるか芋おみたしょう。



このツヌルは非垞に簡単に機胜したす。すべおのSerpがただReactで曞き換えられおいないため、リク゚ストのスラむスが取埗されたす。この堎合、Reactの機胜を備えたリク゚ストが取埗されたす。次に、テンプレヌトが攻撃され、枬定倀が収集され、これらの結果ずメトリックを比范しお芋぀ける特別なナヌティリティに挿入されたす。この堎合、統蚈的に有意な結果のみが残りたす。䞀般的に、すべおがそこに合理的です。



しばらく様子を芋おみたしょう。







実際、必芁な翻蚳だけでなくすべおの翻蚳を収集するMultiPluginを無効にしおも、統蚈的に有意な倉化は芋られたせんでした。



最初は少し動揺しおいたしたが、実際には、これは問題ではないこずに気付きたした。珟圚、倚くの翻蚳がReactに倉換されおいる機胜があたりないためです。したがっお、そのような機胜がさらにある堎合、これらの重芁な倉曎は間違いなく衚瀺されたす。珟圚、䞻にロシアで衚瀺されおいる機胜があり、翻蚳がありたせん。たた、コンポヌネントに含たれるコヌドの量は、翻蚳の量を倧幅に䞊回っおいたす。したがっお、すべおの翻蚳が進行䞭であるこずは認識できたせん。



正盎な実隓が行われた堎合、おそらくそれはより正盎な実隓で顕著になるでしょう。しかし、オフラむンツヌルはこれらの倉曎を衚瀺したせんでした。







MainChunkPluginを無効にするず、察話機胜の開始時間が遅くなり、HTMLの読み蟌みも倧幅に遅くなりたす。したがっお、それは非垞に必芁です。



個別のリ゜ヌスによっおこの個別のチャンクにロヌドされおいたすべおのコヌドがHTMLにむンラむン化されるようになったため、HTMLのロヌドが遅くなるのはなぜですか。すべおをむンラむン化するようなものですが、察話性も遅くなりたす。原則ずしお、かなり期埅されおいたす。



そしお今、質問すべおを1぀のバンドルに入れ、共通のコンポヌネントでチャンクを䜿甚しないずどうなるでしょうか。これはたったく幞せな絵ではないこずがわかりたした。







最初のレンダリングは劇的に遅くなりたす。むンタラクティブ性もほが2倍になりたした。これにより、すべおのコヌドが別のリ゜ヌスで配信され始めるため、HTMLが小さくなりたす。しかし、ご芧のずおり、察話性は圹に立ちたせん。



そしお組み立お。最埌のスラむド。











珟圚のプロゞェクトのCreateReact Appのビルド時間は、ラップトップで3分かかりたす。そしお、私たちのすべおの鐘ず笛で-5分。長いです







しかし、実際には、1぀のバンドルにたずめるず、3分になりたす。 MultiPluginなしでビルドするず、Create ReactAppよりもさらに高速になりたす。ただし、前のスラむドで瀺したように、元のビルドスクリプトに察するこれらの倉曎を拒吊するこずはできたせん。これがないず、速床メトリックが非垞に悪くなるためです。



それでは、このレポヌトから孊ぶのに圹立぀こずを芋おいきたしょう。







TypeScriptを䜿甚する方法はBabelだけではありたせん。 TSC、ts-nodeおよびts-loaderを䜿甚できたす。それは非垞にうたく機胜したす。



そうは蚀っおも、TypeScriptチェック、タむプチェックは、ビルドするたびに実行する必芁はありたせん。これにより、速床が倧幅に䜎䞋したす。芚えおいるように、2回です。したがっお、そのようなものを別々のチェック、たずえば事前コミットフックに配眮するこずをお勧めしたす。



頻繁に䜿甚するコンポヌネントを別のチャンクに収集するこずをお勧めしたす。共通のコンポヌネントを別々のチャンクに収集するこずも望たしいです。これにより、必芁なものだけをロヌドでき、diffだけをロヌドできるからです。



最も重芁なこずは、すべおのペヌゞですべおのコヌドを䜿甚しおいない堎合は、コヌドを個別の゚ントリに分割し、個別のバンドルを収集しお、ナヌザヌに察応するタむプの怜玢結果が衚瀺されたらダりンロヌドする必芁があるこずです。必芁なファむルのみをダりンロヌドしおください。あなたが芋おきたように、これは最倧の結果をもたらしたす。かなり明癜なこずですが、ただCreate React Appに残っおいるため、党員がこれを行うかどうかはわかりたせん。



マルチコンパむルは非垞に長いです。マルチコンパむルは問題なく、内郚のどこかにあるキャッシュでこれらすべおを凊理できるず誰かが蚀っおも、信じないでください。プリロヌドずむンラむンを䜿甚しおも結果が埗られたす。



シックルに関するいく぀かのリンク



  • clck.ru/PdRdhずclck.ru/PdRjb-ReactでSerpを曞き盎すこずに関する2぀のレポヌト。これは最初の段階であり、どのようにしおこれに到達したのか、なぜそれを始めたのかに぀いおです。2番目のレポヌトは、管理の芳点からこれらすべおをどのように蚈画および実行したか、ステヌゞはどのようなものであったかに぀いおです。
  • clck.ru/PdRnr-速床メトリックに関するレポヌト。オンラむンツヌルがどのように機胜するのか、他に䜕があるのか​​ず突然疑問に思った人向けです。


ありがずうございたす。



All Articles