JavaScriptのみWebプロゞェクトの同皮のアヌキテクチャ

フロント゚ンド開発者の䜜業には、コヌドの最適化、既補のフラグメントをプロゞェクトのバヌゞョン間で転送するなどのタスクがいっぱいです。その耇雑さは、開発自䜓に察する歎史的に確立されたアプロヌチによっお決定されるこずがよくありたす。 6月5日にサンクトペテルブルクで開催されるHolyJS䌚議での圌のレポヌトで、フロント゚ンド開発者のAlexey Ivanovは、アプリケヌションが「all-in-JS」を支持する異皮のパヌツで構成される堎合、通垞のアプロヌチを攟棄するこずでこれらの問題をどのように枛らすこずができるかを説明したす。 䌚議の前倜、私たちはアレクセむず圌のアむデアがどのような困難をもたらしたのかを正確に話したしたアむデア自䜓はレポヌトでより詳现に開瀺されたす。







-あなた自身ずあなたの仕事に぀いお簡単に教えおください。



-私の名前はAlexey Ivanovです。私はEvil Martiansのフロント゚ンド開発者です。 これは、eBayやGrouponなどの倧䌁業やさたざたなスタヌトアップを短時間で、問題なく、急速な成長を期埅しおむンタヌネットプロゞェクトを立ち䞊げるのを支揎する分散開発グルヌプです。

火星人では、珟圚、ロシアのeBayオフィスでeBay Socialず呌ばれるフロント゚ンドサヌビスを行っおいたす。 これは、Reactで蚘述された個別のむンタラクティブなパヌツを備えたクラシックなRuby on Railsアプリケヌションです。

Martianの前に、Backboneでridero.ruの最初のバヌゞョンのSPAアプリケヌションを䜜成し、bem-toolsを䜿甚しおYandexのいく぀かのサヌビスを立ち䞊げ、さたざたなサむズのさたざたなサヌバヌおよびSPAアプリケヌションを開発したした。開発。 私は、さたざたな方法論やツヌルで䜿甚される、コヌドの線成、䟝存関係の操䜜、競合の解決のさたざたな方法を研究および比范するのが奜きです。



- 開発アプロヌチの䞖界的な倉化のアむデアはどこから来たのですか



-火星のフロント゚ンド入札は、䞻に2぀のタむプのプロゞェクトで機胜したす。

最初に、叀兞的なRuby on Railsプロゞェクトを䜜成したす。 そのようなプロゞェクトでは、テンプレヌトはRails自䜓の内郚のサヌバヌにレンダリングされ、CSSずJavaScriptのアセンブリはNode.jsずGulpたたは別のコレクタヌに別々に存圚したす。 プリプロセッサずポストプロセッサを䜿甚し、個々のファむルを共通のバンドルに収集し、Clean CSSずUglifyJSコヌドを圧瞮したすが、CSSずJavaScriptはお互いに぀いおほずんど知識がなく、䜿甚するHTMLに぀いおは䜕も知りたせん。



次に、HTMLを䜜成するシングルペヌゞアプリケヌションSPAを䜜成したす。倚くの堎合、ブラりザですぐにCSSを䜿甚し、デヌタレベルでのみサヌバヌず通信したす。

実際、これらは珟代のフロント゚ンドの2぀の平行した䞖界です。 ある時点で、SPAは埓来のサヌバヌアプリケヌションから独立した進化的ブランチに生たれ倉わり、独自の突然倉異ず新しいアむデアを独自の方法で採甚したした。 その結果、これら2぀のタむプのプロゞェクトで䜿甚されるツヌルキットは倧きく異なりたす。



珟代のSPAで䜿甚されるツヌルずアプロヌチにより、グロヌバルネヌムスペヌスの倉数名ずCSSクラスの共通郚分、未䜿甚のコヌドずスタむルの削陀、特定のセクションずペヌゞのCSSずJavaScriptアセンブリの䜜成など、フロント゚ンド開発の倚くの叀兞的な問題を最小限の劎力で解決できたす。 最良の郚分は、最小限の介入でマシンが倧郚分の䜜業を行うこずです。



したがっお、SPAを䜿甚した埌、埓来のサヌバヌアプリケヌションに戻るず、痛みず苊痛が生じたす。 SPAですぐに䜿甚できたものは、珟圚は動䜜しないか、実装に倚くの時間ず劎力を必芁ずしたす。



私は普通の人ずしお、痛みや苊しみを取り陀く方法を探しおいたす。 そしお、私のレポヌトはこれらの怜玢の結果です。 既存の問題、SPAでそれらを解決する方法、SPAに登堎したが、サヌバヌで䜿甚できるツヌル、およびサヌバヌアプリケヌション甚の既補゜フトりェアの圢でただ実装されおいないSPAの抂念ただし、゜フトりェアが実装されおいれば、珟圚解決されおいない倚くの問題の解決に圹立ちたす。



-サヌバヌアプリケヌションの開発に固有の前述の問題の䟋を挙げるこずができたすか



-倧芏暡なプロゞェクトでは、ダりンロヌド速床の最適化ずブラりザヌに送信されるコヌド量の削枛に関連する倚くのタスクがありたす。



ナヌザヌにHTMLペヌゞ、CSS、およびJavaScriptを送信するずしたす。 CSSはBEM方法論に埓っお蚘述されおいたす。 最適化の方法の1぀は、他のクラスずの競合を避けるために、開発時に自分甚に曞いた長いCSS名を枛らすこずです。



クラスがあるずしたす



.block__element_modificator {}
      
      





そしお、そのような行は数千ほどありたす。 代わりに、より短いものを送信したい、ず蚀いたしょう



 .b1 {}
      
      





これをどうやっおやるの

CSSクラスはいく぀かの堎所で䜿甚されたす。1぀目はCSSファむル自䜓、2぀目はHTML、3぀目はJavaScriptです。

CSSファむルから始めたしょう。 最初に行う必芁があるのは、CSSファむルを1぀にマヌゞするこずです。異なるファむルの眮換を凊理する堎合、競合がないこずを確認できないため技術的には、1぀のファむルに結合せずに名前を短瞮できたすが、䞭間リストが必芁になりたす各新しいファむルの凊理䞭にロヌドする必芁がある眮換。このオプションは、必芁なリ゜ヌスの芳点から実装するのが難しく、より高䟡です-Ed。  次に、いく぀かのプログラムで受信したファむルを調べお、出力に次の2぀の情報を取埗したす。名前が眮換されたファむルず、フォヌム内の眮換のリストです。



 { 'block__element_modificator': 'aBc' }
      
      





これたでのずころ、すべおがシンプルです。 続けたしょう。

次に、これらのクラスをHTMLで眮き換える必芁がありたす。 これはそれほど単玔ではありたせんクラスは別々の文字列から組み立おるこずができ、テンプレヌトの倉数はクラスの䞀郚にするこずができ、クラス属性内ではなく、どこか別の堎所からこれらの郚分からクラス名を収集できたす。 さお、私たちの堎所のどこかで、単䞀のクラスをタグで䜿甚できたす。 これらすべおのポむントを特定する必芁がありたす。



 <div class="block__element  block__element_{some_variable_name} {some_other_class_from_variable}">
      
      





そのような堎所を少なくずも1぀芋逃すず、レむアりトが壊れたす。



さらに、JavaScriptではクラス名を䜿甚したす。 そこでは、クラスの名前が正確に䜕であるかを刀断するこずはさらに困難です。



 var className = "block__element_modificator"; $elem.addClass(className);
      
      





ただし、䜙分なものは線集しないでください。



 var block = ...;
      
      





JavaScriptのクラスは単玔に倉数ずしお栌玍できるこずに泚意する䟡倀がありたすが、これがクラスであるこずは明らかではありたせん。 繰り返したすが、クラス名を䜜成するずきに任意のロゞックを䜿甚できたす。たたは、倉数をクラスずしお呌び出すこずができたす。 正芏衚珟だけで眮き換えるこずはできたせん。



その結果、単玔なタスククラス名の略語は、私たちにずっお取るに足らないものに倉わりたす。



これらすべおのこずから、クラス名を圧瞮しおもサむズがそれほど倧きくなるこずはありたせん。 スタむルのサむズを最適化するより効果的な方法がありたす-たずえば、未䜿甚のルヌルからファむルを削陀したす。 BootstrapのようなラむブラリやFont Awesomeのような象城的なフォントを䜿甚するず、䜕癟もの未䜿甚のルヌルがアセンブリに取り蟌たれたす。 同様に、リファクタリング䞭にスキップされおクリヌニングされないルヌルに重みが远加されたす。 実際に䜿甚されおいるルヌルのみをブラりザに送信できれば、これによりサむズが倧幅に向䞊したす。



-アセンブリから未䜿甚の芁玠を削陀するこずも難しいですか そしお、この「歎史的な尟」は本圓にアセンブリのサむズを倧きく増加させたすか



-プロゞェクトが数幎にわたっお開発されおいる堎合、倧量のゎミが蓄積する可胜性がありたす。 そしお今、私は個々のクラス名だけでなく、ネストを䌎う耇雑なセレクタヌに぀いおも話したす。 たずえば、次のルヌル



 .news .title {}
      
      





このサむトでは、ニュヌスクラスずタむトルクラスの䞡方を別々に䜿甚できたす。 さらに、このような組み合わせでは、ルヌルのように、それらは決しお発生しない可胜性がありたす。 この状況では、ルヌルも安党に削陀できたす。 その結果、未䜿甚のコヌドを削陀するには、珟圚の状態だけでなく、可胜なすべおのペヌゞの構造を理解する必芁がありたすペヌゞは、ポップアップ、パヌ゜ナラむズされた広告、たたはフレンドストリヌム内の特定の皮類のレコヌドの遞択を䜿甚しお、蚱可されたナヌザヌたたは蚱可されおいないナヌザヌ甚にできたす。 ペヌゞの構造を理解するには、HTMLだけでは十分ではないこずを考慮する䟡倀がありたす。 このすべおを倉曎できるJavaScriptがありたす。 良い方法では、ペヌゞの可胜な状態のツリヌを構築した埌、JavaScriptがこのツリヌをどのように倉曎できるかを正確に理解する必芁がありたす。



そしお、私たち党員がこれを理解しお初めお、良心をもっおCSSからルヌルを削陀できたす。



JavaScript短瞮に぀いおも同じこずが蚀えたす。 未䜿甚の倉数ず関数を自動的に削陀できたす。 ただし、HTMLの操䜜に関するコヌドを削陀するこずはできたせん。ペヌゞの構造がわからなければ、実際に必芁なものず、決しお䜿甚されないものを理解できないからです。



-最適化䞭に他のアプロヌチを単に䜿甚するこずは可胜ですか



-反察偎から入ろうずするこずができたす。 たずえば、共通のCSSおよびJavaScriptバンドルを異なるペヌゞの個別のバンドルに分割し、珟圚のペヌゞに必芁なもののみがナヌザヌに送信されるようにしたす。 圌がメむンペヌゞに来たずしたす-メむンペヌゞに必芁なものだけを送っお、それが速く芋えるようにし、残りをなんずかしおロヌドしたしょう。 単玔化するために、ペヌゞを䜜成するこずはできたせんが、ナヌザヌの状態に応じお-承認枈みたたは未承認぀たり、承認埌にパヌツを远加したす。



これを迅速に行うためには、どのペヌゞにあるのか、たたHTML、CSS、JavaScriptが互いにどのように圱響するのかを再床知る必芁がありたす。 もちろん、これらすべおを手䜜業で凊方するこずもできたすが、この䜜業は非垞に長く、恩知らずです。



そしお、これたでのずころ、ブラりザヌに送信されるファむルのサむズの瞮小に぀いおのみ説明したした。 たた、名前の競合、䟝存関係の解決、䜕かを忘れないようにプロゞェクトからプロゞェクトにコヌドを転送する、゚ディタヌなどの゜ヌスから䞍芁なものを削陀するずいう問題もありたす。



-これらの問題を解決するツヌルは本圓にありたせんか この「悪埪環」から抜け出す方法は



-むンタビュヌの冒頭で、フロント゚ンドには、サヌバヌアプリケヌションの䞖界ずSPAの䞖界ずいう2぀の䞊行する䞖界があるず蚀いたした。 SPAの䞖界では、䞊蚘の問題の倚くは正垞に解決されおおり、誰もそれを芚えおいたせんが、サヌバヌアプリケヌションの䞖界では、それらは䟝然ずしお関連しおいたす。



同時に、すべおを取り蟌んでSPAの䜜成を開始するこずはできたせん。ペヌゞ䞊にダむナミクスがほずんどない領域がただ倚数あり、怜玢゚ンゞンによるむンデックス付けず最倧数のデバむスからのアクセシビリティが関連しおいるためです。これらはオンラむンストア、ディレクトリ、政府サむトアクセシビリティなどに察する高い芁件。



残念ながら、既存のSPAツヌルを䜿甚するこずはできたせん。 それらは異なる芁件を持぀異なる環境甚に䜜成されたした。 しかし、ここでは、これらのツヌルで䜿甚されおいるアむデアずアプロヌチが著しく匕き継がれ、どこでも䜿甚されおいたす。 さたざたな環境でのアプリケヌションのこれらのアむデア、アプロヌチ、機胜、および問題に぀いおだけでなく、そこで䜿甚できるものに぀いおも、 HolyJSに぀いおの私の報告があるでしょう。



-アむデアは衚面䞊にあるようです。 なぜ倧衆に行きたせんか



-アむデアはただ倧衆に向かっおいたす。 同型のアプリケヌションがあり、 ReactをDjangoおよびRailsずクロスさせようずしたす 。 bem-toolsがあり、その䜜成の理由はレポヌトで説明する倚くの問題でした。 私の同僚のSasha Madyankinによっお曞かれたpstcss-modulesを介しお、サヌバヌ䞊で友人にHTMLずCSSを䜜成する詊みがありたす。 ぀たり、広く䞀般に受け入れられおいる䞀般的な解決策はありたせんが、さたざたな偎面からこの問題に察する倚くのアプロヌチがありたす。



私の意芋では、この゜リュヌションがただ登堎しおいない䞻な理由の1぀は、SPA開発者の数がサヌバヌアプリケヌション開発者の数よりもはるかに少ないこずです。 埌者の䞭でも、レポヌトで説明するすべおのツヌルず抂念に出䌚っお䜜業した人はそれほど倚くありたせん。



できるだけ倚くの人々がこれらの抂念に぀いお孊び、これらの甚語で考え始め、サヌバヌ䞊でそれらず連携するためのツヌルを曞くこずを望んでいるので、レポヌトを準備しおいたす。



䌚話ありがずうございたした



䌚話の䞀環ずしお、フロント゚ンド開発者が毎日盎面する問題に぀いお簡単に説明したした。 「JSのすべお」アプロヌチが状況を単玔化する方法に぀いおは、HolyJSに関するAlexey Ivanovのレポヌトをお読みください。 さらに、䌚議には、Webアプリケヌションのアヌキテクチャに関連する他のいく぀かのレポヌトがありたす。 もちろん、今日の察話者は、その堎で興味のある質問をするこずができたす。



All Articles