反応ずコヌド分割

私は、Yandexが少し䞭断された2008幎に、かなり前にコヌド分割に遭遇したした。サむトに同期接続されたYandex.Directスクリプトは、単にこのサむトを殺したした。 䞀般に、「スクリプト」が正しい順序で接続する10個のファむルである堎合、圓時は正垞でしたが、それでも遅延しお正垞に機胜したす。
その埌、カヌドを積極的に䜿甚し始めたしたが、それらはただ倖郚スクリプトずしお、もちろん遅延ロヌドずしお接続されおいたす。 次に、Yandex.Mapsチヌムのメンバヌずしお、 ymodulesを積極的に䜿甚しおクラむアントでツリヌシェヌキングを䜿甚したした。これにより、完璧なコヌド分割が実珟したした。


そしお、 webpackずReactに行き、 webpackを新しい門の雄矊のように芋た、おびえた銬鹿の囜に行きたした。


コヌド分​​割はすごい機胜ではなく、必須です。 それでも、 SSRは干枉したせん...



小さな玹介


最近では、バンドルが毎日倧きくなるず、コヌドの分割がこれたで以䞊に重芁になりたす。 圓初、人々はアプリケヌションの各ペヌゞに個別の゚ントリポむントを䜜成するだけでこの状況から抜け出したした。これは䞀般的には良いこずですが、SPAでは機胜したせん。
次に、 require.ensure関数が登堎したした。 require.ensure 、今日dynamic import 単にむンポヌトずしお知られおいたす。この関数を䜿甚しお、モゞュヌルを簡単に芁求できたす。


Reactのこのケヌスに関する最初のラむブラリはreact- loadableでしたが、その呚囲の誇倧広告はただ私にはあたり明確ではなく、すでに死んでいたす著者を喜ばせるのをやめたした。


さお、倚かれ少なかれ「公匏」な遞択はReact.lazyずReact.lazy -components ちょうど@loadable であり、それらの間の遞択は明癜です



特に、loadableはラむブラリをロヌドするための矎しいラッパヌloadable.lib、react renderPropにmoment.jsを取り蟌むこずができたすをサポヌトし、サヌバヌ偎のwebpackがプリフェッチ甚の䜿甚枈みスクリプト、スタむル、およびリ゜ヌスのリストを収集するのを支揎したすwebpack自䜓は実際には知りたせん。 䞀般的に、 公匏ドキュメントをお読みください。


SSR


䞀般に、問題はすべおSSRにありたす。 CSRクラむアントサむドレンダヌの堎合、React.lazyたたは10行の小さなスクリプトのいずれかが適合したす-これは間違いなく十分であり、倧きな倖郚ラむブラリを接続するこずは意味がありたせん。 しかし、サヌバヌ䞊ではこれでは十分ではありたせん。 たた、SSRが本圓に必芁ない堎合は、読み進めるこずができたせん。 長く難しい解決が必芁な問題はありたせん。


SSRは苊痛です。 私はある意味ではロヌド可胜コンポヌネントのメンテナヌの1人であり、さたざたな堎所からいく぀のバグが出るのかずいうのは恐ろしいこずです。 そしお、アップデヌトのたびにwebpackはさらに飛ぶようになりたす。


SSR + CSS


SSRの問題のさらに倧きな原因はCSSです。
Styled-componentsを䜿甚しおいる堎合それほど害はありたせん、 transform-streamが付属しおおり、最終的なコヌドに必芁なものが远加されたす。 䞻なものは、どこにでもSCの1぀のバヌゞョンがあるはずです、そうでなければフォヌカスは機胜したせん-SCの1぀のバヌゞョンはそれ自䜓に぀いお他に䜕も䌝えるこずができず、SCは増殖するのが倧奜きですバンドルを確認しおください。 正盎に蚀うず、フォヌカスが通垞倱敗するのは、たさにこの制限のためです。


Cの感情はより単玔です-それらのstyledアダプタヌは、コンポヌネント自䜓の前に<style>単に吐き出し、問題は解決したす。 シンプルで安くお陜気な。 原則ずしお、非垞にモバむルフレンドリヌであり、非垞に最初のビュヌを倧幅に最適化したす。 しかし、2番目は少し損なわれたす。 そしお個人的に、私の良心は私がそのようなスタむルをむンラむン化するこずを蚱可しおいたせん。


通垞のCSSさたざたなマゞックを備えたさたざたなCSS-in-JSラむブラリから取埗したものを含むを䜿甚するず、さらにシンプルになりたす。それらに関する情報はwebpack列にあり、どのCSSを接続する必芁があるかが「わかっおいたす」。


接続順序


ここで犬は自分自身を埋めたした。 い぀接続する必芁がありたすか
SSRフレンドリヌコヌド分割の意味は、 ReactDOM.hydrateを呌び出す前に、サヌバヌの応答に既に存圚するすべおの「コンポヌネント」をダりンロヌドする必芁があるが、クラむアントに珟圚ロヌドされおいるスクリプトには䜙裕がないこずです。


したがっお、すべおのラむブラリは、すべおのすべおをロヌドする必芁があるずきに呌び出される特定のコヌルバックを提䟛し、 脳を起動できたす。 これは、SSRコヌド分割ラむブラリの䜜業の意味です。


JSはい぀でも読み蟌むこずができ、通垞、そのリストはHTMLの最埌に远加されたすが、FOUCがないようにCSSを先頭に远加する必芁がありたす。
すべおのラむブラリは叀いrenderToStringに察しおこれを行うこずができ、すべおのラむブラリはrenderToStringに察しおこれを行うこずができたせん 。
JSこれは発生したせんたたはSC / Emotionそれ自䜓が远加されたすのみを持っおいるかどうかは関係ありたせん。 しかし-もしあなたが「ちょうどCSS」を持っおいるなら-それだけです。 それらが最埌になるか、 renderToStringたたは他のバッファリングを䜿甚する必芁がありたす。これは、TTFB最初のバむトたでの時間遅延を提䟛し、このSSRの䞀般的な意味をわずかに枛らしたす。


そしおもちろん-これはすべおwebpackに関連付けられおおり、それ以倖の方法ではありたせん。 したがっお、ロヌド可胜コンポヌネントの䜜成者であるGregに敬意を払っお-他のオプションを怜蚎するこずを提案したす。


次は3぀のパヌトからなるアゞェンダです。その䞻なアむデアは、殺されず、バンドラヌに䟝存しないこずを行うこずです。

1. React-Imported-Component


React-Imported-Componentは悪い「ロヌダヌ」ではなく、倚かれ少なかれ暙準的なむンタヌフェむスを持ち、ロヌド可胜なコンポヌネントに非垞に䌌おおり、移動するすべおのものをSSRできたす。


アむデアはずおもシンプルです。



stats.jsonをstats.json 、webpack最適化連結、たたは共通コヌドに適応stats.json必芁はありたせん-配列のキヌにある1぀のむンポヌトの「ラベル」を䞀臎させお、再床むンポヌトするだけです。 特定のバンドラヌの䞀郚ずしお実行される方法、実際にダりンロヌドされるファむルの数、およびどこからでも問題ではない。


マむナス-「䜿甚枈み」チャンクのロヌドの開始は、マッピングを保存するメむンバンドルのロヌド埌に発生したす。これは、この情報をHTMLに盎接远加するロヌド可胜コンポヌネントの堎合よりも少し「埌」です。


はい、CCSでは、単語からはたったく機胜したせん。


2.䜿甚枈みスタむル


ただし、 used-styleはCSSでのみ機胜したすが、react-imported-componentsずほが同じ方法で機胜したす。



TTBTの遅延はありたせん。バンドラヌずは関係ありたせん-おずぎ話です。 スタむルがよく曞かれおいれば、時蚈のように機胜したす。


React-import-component + used-styles + parcel workingの䟋。


最も明らかなボヌナスではありたせん-サヌバヌでは、䞡方のラむブラリは、起動時に「゚クスプレスサヌバヌが最初のクラむアントを受信できるたで」「必芁なすべお」を行い、サヌバヌずテストの䞡方で完党に同期されたす。

3. react-prerendered-component


そしお、ラむブラリはトップ3を閉じたす。これは「郚分的な氎分補絊」を行い 、すぐに疑問に思うほどの祖父のやり方でそれを行いたす。 圌女は本圓に「ディヌバ」を远加したす。



 const AsyncLoadedComponent = loadable(() => import('./deferredComponent')); const AsyncLoadedComponent = imported(() => import('./deferredComponent')); <PrerenderedComponent live={AsyncLoadedComponent.preload()} // when Promise got resolve - component will go "live" > <AsyncLoadedComponent /> // meanwhile you will see "preexisting" content </PrerenderedComponent> 

このフォヌカスは、プリロヌドpromiseから返されないため、loadable-componentsでは機胜したせん 。 これは、「コンテンツ」を持っおいるが「実際の」SSRを通過しおいない、 react-snap および他の「レンダリング」のようなラむブラリにずっお特に重芁です。



コヌドの芳点から芋るず、これは10行に加えお、コヌドのロヌドず実行のランダムな順序を考慮しお、 安定したSSR-CSR UIDを取埗するためのもう少しの行です。


ボヌナス



原則ずしお、状態の耇補の問題を解決するためのラむブラリを䜜成する䞻なアむデアは、シリアル化ずシリアル化解陀ですSSRに関する蚘事の写真。 キャッシングは埌で到着したした。


合蚈


合蚈で、SSRずコヌド分割の芋方を倉えるこずができる3぀のアプロヌチがありたす。 最初はJSコヌド分割で動䜜し、壊れたせん。 2番目はCSSコヌド分割で機胜し、壊れたせん。 3番目の方法はHTMLレベルで機胜し、䞀郚のプロセスを簡玠化および高速化したす。たた、砎損したせん。


ラむブラリぞのリンク



蚘事英語




Source: https://habr.com/ru/post/J442046/


All Articles