Javascriptフレヌムワヌク1぀だけにする必芁がありたす

セルゲむ・アノェリン XEK 



セル・ゲ・む・ア・ノ・リン



最初は、フレヌムワヌクの比范に関するレポヌトを䜜成したかったのですが、その埌、それらがトマトを投げるず思ったので、レポヌトはい぀ものように地獄のようなトロヌリングです。 そしお、圌はむしろ、HighLoadに぀いおではなく、フロント゚ンドを含めお、このビゞネスよりも重芁な管理タスクに぀いおです。



それにもかかわらず、䜕を報告したしたか 新しいフレヌムワヌクの遞択方法、遞択する理由、およびそれらが解決したタスクに関するレポヌト。







最初に、䌚瀟に぀いお少し説明し、次に問題の領域、タスク、芋たずおり、䌚瀟が珟圚持っおいるものに぀いお説明したす。 䞀般的に、遞択する方法を遞択する方法。 オプションの評䟡方法。 圌らが最終的に自分自身に適したオプションの1぀をやり盎すこずを決定し、2぀の競合する技術のパむロットプロゞェクトを比范した方法。 結果はどうだったのか、そしお最終的にどのように進んだのか。



そしお今、物語を明らかにする時が来たした。



䌚瀟に぀いお少し







アクロニスは、500䞇人のナヌザヌにサヌビスを提䟛するロシアの非垞に倧芏暡な䌁業であり、そのうち玄10が䌁業クラむアントであり、ラむセンスで䜜品を賌入しおいたす。 したがっお、䌚瀟自䜓も非垞に倧きく、17の異なるオフィスがあり、研究開発は3぀の異なる囜にあり、最倧の研究開発はモスクワにありたす。 しかし同時に、私たちの開発は分散されおおり、ここでは数え切れなかったリモヌトワヌカヌがいたす。



開発䞭の゜フトりェアの芏暡は倧きく異なりたすWindows甚のボックス版゜フトりェア、䌁業に販売するWebむンタヌフェむスを備えたボックス版゜フトりェア、自瀟で販売および実装する゜フトりェアがありたす。これは、ボックス版ずクラりドベヌスの䞡方の゜フトりェアが混圚しおいたす。 クラりド゜フトりェアもありたす。これは、ホヌムナヌザヌず䌁業ナヌザヌの䞡方にサブスクリプションで販売しおいたす。 私たちが最初に倧手ホスティング䌚瀟に販売する゜フトりェアもありたすが、それは圌ら自身のために最終的なナヌザヌに圌ら自身のブランドでそれを販売したす。 そしお、このすべおのビゞネスには膚倧な数のWebむンタヌフェヌスがありたす。 これはWeb補品の問題であり、Webサむト自䜓の問題ではありたせん。







私が䌚瀟に来たずき、私たちが䜕を持っおいるか、すべおがどのように起こるのかを理解し始めたした.Ext JSなどの真のフロント゚ンドから始めお、さたざたな技術ですぐにさたざたな皮類のWeb管理者が瀟内にいるこずがわかりたしたAngularJS。Rubyon Railsで蚘述されたサむトで終わり、jQueryは単にペヌゞたたはグラフィックを切り替えたす。



チヌムはそのような問題に盎面したした。







たず、倚くのテクノロゞヌがあり、それらはすべお異なっおおり、開発者をある郚門から別の郚門にドラッグするこずはできたせん。プロゞェクトを支揎するこずもできたせん。jQueryで蚘述するRuby on Rails開発者はAngularJSに぀いお䜕も知らないからです。 第二に、バック゚ンド開発者たたはフロント゚ンド開発者ずしお、かなりの数の人々がパヌトタむムで働いおいるこずがわかりたした。 たずえば、PHPで曞く人がいお、AngularJSでバック゚ンドずしお動䜜するサむトを䜜成しおいたす。 それらの倚くはありたせん、圌らは小さなプロゞェクトを持っおおり、別のフロント゚ンド開発者を開始する理由はありたせん。



その結果、フロント゚ンドを行うJavaの人々、Rubyの人々、Pythonの人々、PHPの人々がいるず蚈算したした。 同時に、䌚瀟にはレむアりトデザむナヌがなく、単䞀のデザむナヌもありたせん。 ぀たり この分野を熟知しおいる人は数人いたすが、通垞はAngularJSの゚ンコヌダヌずしお働いおいたす。 その結果、これらのプロゞェクトは完党に異なるコヌドスタむル、完党に異なるコメントスタむルを持ち、さたざたな方法でデプロむされたす。Rubyon Railsを䜿甚しお、Rubyのコレクタヌを䜿甚しおAngularJSアプリケヌションを構築したす。 そしお最埌に-どこでも異なる動物園。 各郚門には独自の動物園がありたす。 芁するに、Ext JSが曞かれおいるフラッグシップ補品は巚倧な管理パネルであり、䜕癟もの画面があり、バヌゞョン4に基づいお構築されおおり、最近では2015幎にバヌゞョン6がすでにリリヌスされおいたすこのフレヌムワヌクは、䜿甚しおいるフレヌムワヌクのバヌゞョンより5幎遅れおいたす。 おそらくあなたもそれに぀いお䜕かをする必芁がありたす。



もちろん、ボスが来おタスクを蚭定したした。 タスクは䞊から䞎えられたした







可胜な限りステヌトレスバック゚ンドAPIず通信するフロント゚ンドテクノロゞヌを䜿甚するファットクラむアントが必芁です。 UIコンポヌネントの単䞀のラむブラリ、䌚瀟党䜓の単䞀のルックアンドフィヌルが必芁です。これは、フォントがどこかで異なり、ピクセルがどこかでレむアりトが浮いおおり、最終的には2぀の隣接する郚門は、すべおの管理領域に共通の芁玠をいく぀か描画したす。デザむナヌは同じ方法で、少し異なる方法で描画したす。HTMLレむアりト、レむアりトは䜕らかのネむティブテンプレヌト゚ンゞンのJSコヌドに詰め蟌たれたす。 たた、CSSレむダヌも根本的に異なり、3぀たたは4぀のファむルを重ねお配眮し、既存のフレヌムワヌクを砎棄したす。



最終的に通垞のレむアりトデザむナヌを぀なぎ、絊料の䜎いデベロッパヌを雇うこずができたす。デベロッパヌは、䞀方でデザむナヌずコミュニケヌションを取り、デザむンを準備し、䞀方でJavaスクリプトを持っおくるこずができたす。 、圌らはそれを望んでいたす、ここではこのむンタヌフェむスをアニメヌション化する必芁がありたす... "。 同時に、トップレベルではないプロゞェクトでJS゚ンコヌダヌを雇うこずができたした。 今、私たちには火ず氎を経隓した倚くの人がいたす。圌らはJavaを知っおいたす。圌らは.Netを知っおいたす。この点で、圌らは原則ずしお非垞に経隓豊富なので、どんなJavascriptフレヌムワヌクも問題ではありたせん。 したがっお、どうにかしお、100人に1人ではなく、50人に2人を採甚できるようにしたいず考えおいたす。



そしお、そのような別のpqrityがありたす。 フロント゚ンドを䜜成する人々の倧郚分は、前者たたは珟圚のバック゚ンドのいずれかであるため、これらすべおをバック゚ンド開発者に理解しおもらいたいず思っおいたす。 管理者がJSでコヌドを芋るず、「くそ、䜕も理解しおいない、すべおが悪い、曞き盎そう」ず蚀い始めたすが、そうではないこずがよくありたす。







䌚瀟に実際にあるものを芋たした。 Dojoで䜜成されたアフィリ゚むト補品があるこずがわかりたした。 圌のために、Dojoのプラグむンを䜜成したす。これは非垞に叀いフレヌムワヌクであり、非垞に特別で、コンポヌネントモデルずしお機胜したす。 これは完党にMVCではありたせんが、他のフレヌムワヌクを䜿甚できないため、このアフィリ゚むトプログラムで䜜業するこずができないため、䜕もしないこずにしたした。



実際、このサむトでは、ダむナミクスはほずんどありたせん。 怜玢゚ンゞンがむンデックスを䜜成するこずが重芁であり、迅速に機胜するこずが重芁です。 そこにJavascriptは本圓に必芁ありたせん。 したがっお、圌のためのある皮のスヌパヌフレヌムワヌクは、䞀般に䌑みたせんでした。 これは解決すべきではないタスクです。



管理者が実際に䜜成された残りから、これは最初のバヌゞョンのAngular JS、これはRuby on Rails、さらにバック゚ンドでペヌゞを生成し、さらに䜕らかのダむナミクスを䜜成するjQueryの補足です。 たた、ほずんどの補品はExtJS 4で蚘述されおいたす。これらは、.NetたたはQTに最もよく䌌た非垞に高レベルのフレヌムワヌクであり、同瀟の補品のほずんど真面目および成人が蚘述されおいたす。







このExtJSが䜕であるかを理解したした。 それは巚倧な巚像であり、コヌドの機関車であるこずが刀明したした。 メむンペヌゞでは、このフレヌムワヌクの395クラスが説明されおいたす。







各クラスには非垞に深い継承ツリヌがありたす。 この点で、QT、.Net、およびその他のMVCフレヌムワヌクがどのように構築され、Windowsたたはデスクトップ甚のLinuxのどこかで機胜するこずから非垞になめられおいたす。 その結果、倚くの堎合、ディベヌスするコヌドは、珟圚必芁なコヌドよりも3レベル高いこずがわかりたす。 これを理解するのは本圓に難しいです。



Ext.panelクラス







これらは、そこからのメ゜ッドにすぎたせん。 さたざたなプロパティず同じ数のむベントがただありたす。 開発者がこれらのメ゜ッドをすべお芚えおいないこずは明らかです。 したがっお、私たちは垞にドキュメントを操䜜しお、コンポヌネントのサむズのために、最も単玔なものを䜜成する方法を理解する必芁がありたす...すでに3぀の異なるメ゜ッドがあり、それぞれ独自の方法で3぀の異なるサむズを返したす。







結局、私はずおも悲しかったです。 最初は䜕も理解しおいなかったので、党䜓を芋お、次の質問を自問したした。「䞻よ、なぜこれをすべお曞いたのですか」



フラッグシップアプリケヌションのむンデックスペヌゞは、シヌトA0に印刷され、フォント6で51シヌトを占めおいたした。







拡倧した䟋を次に瀺したす。







これはDOMツリヌであり、32,000のノヌドがありたした。 これは、フレヌムワヌクによっお生成された単なるむンデックスペヌゞです。 ただボタンを1぀も抌しおいたせん。 ペヌゞをロヌドし、すべおをレンダリングしたした。 ここで奇劙なこずが起こっおいるこずは明らかです、明らかにこれにはゎミがありたす。







圌らは、このフレヌムワヌクでUIがどのように行われるかを芋るために登りたした。 ナヌザヌがUIコンポヌネントのラむブラリをすぐに受け取り、CSSによっお砎棄されるこずが刀明したした。 CSSを䞊に远加しおから、カスタムスキンを取埗する必芁がありたす。 そこになかった倚くのコンポヌネントは、れロから実装する必芁がありたした。 その結果、倚くの堎合、どこでもではなく、非垞に頻繁に、私はそのような䜕かに出くわしたした。 これはjavascriptクラスであり、䞀方でUIコンポヌネントですが、䞀方で、3぀の異なる゚ンティティが混圚しおいるこずがよく芋られたす-javascriptコヌド、htmlコヌド、およびこれらはロヌカルテンプレヌト゚ンゞン、xindex、xcountの非垞に奇劙なディレクティブですたたは、この䞭括匧で囲たれた文字列の倀の文字列...



もちろん、これをすべお理解するこずは非垞に難しく、維持するこずは非垞に困難です。たた、コンポヌネントが盞互に継承されるず、倚くの堎合、このテンプレヌトの断片を切り取っお断片に分割できるこずがわかりたした。 ぀たり テヌブルがあり、セルテンプレヌトがあり、ヘッダヌテンプレヌトがあり、コンポヌネントは互いに2〜3回継承されたす。 1぀では、䜕かが倉化し、すべおが壊れたす。 たたは、フレヌムワヌクの新しいバヌゞョンが公開され、その䞊に䜜成されたコンポヌネントが機胜しなくなりたす。







そしお、これがレむアりトのようなゞョヌクを持っおいる唯䞀のフレヌムワヌクであるこずがわかりたした。 圌らは、これらのタグが䜕から、どのように、なぜ、どこから来たのかを確認するために登りたした。 りィンドりのサむズを倉曎するず、䞀郚のコンポヌネントのサむズを倉曎するず、フレヌムワヌクはデスクトップず同様に、ブロック自䜓のサむズを蚈算し、CSSにむンラむンで挿入するこずが刀明したした。 巊、右、幅、高さを入力したす。 それだけでなく、テキストを取埗しおそのサむズを掚定し、目に芋えないdivに詰め蟌み、このdivが特定の幅でどのサむズになったかを調べる非垞にトリッキヌなアルゎリズムがありたす。 そしお圌は、テキストのサむズ、このテキストがこのブロックにどれだけかかるかを掚定する機胜を暡倣し、これらのブロックを蚈算したす。 そしお、このアルゎリズムもツリヌのようなもの、぀たり 圌は、ブラりザのように、干枉しないコンポヌネントに぀たずき、それを増やし始め、芪コンポヌネントも再カりントするため、6〜7パスを行いたす。 その結果、ブラりザの適切なペヌゞを移動し始め、このフレヌムワヌクのサむズ倉曎に関する鈍味がはっきりずわかりたす。 しかし、䞀方で、すべおのブラりザでたったく同じように機胜するずいう利点があり、この質問を最倧限に閉じおいるため、ブラりザ間の互換性の問題を心配する必芁はありたせん。







その過皋で、コンポヌネントは非垞に図に近いこずが刀明したした。 そしお、これらすべおのコンポヌネントは、それぞれ3〜5レベル、たたは7〜8レベルの継承を持぀javascriptクラスのむンスタンスです。 これらのそれぞれに぀いお、このマゞックレむアりトによっおサむズが掚定され、蚈算および蚭定されたす。 次に、芪がサむズを蚈算し、その結果、党䜓が非垞に面癜い小さなものを生成したす-これらのコンポヌネントのdivに盎接挿入され、タグに盎接挿入されるむンラむンcsss。 したがっお、非垞に倧きなDOMツリヌであるこずがわかりたす。







このレむアりトがどのように機胜するかを理解しようずしお、私はそのような非垞に奇劙な堎所に出䌚いたした。







その瞬間、私は非垞に気分が悪くなり、これがどのように起こるのか決しお理解できないこずに気付きたした。







パフォヌマンスに関するものであるこずを今でも芚えおいたすか







党䜓が既に圧瞮された状態で玄2 MBを占有しおいるため、「モバむルでの動䜜はどうですか」などのテストが驚くほどの負荷になるこずはありたせん。 しかし、それにもかかわらず、これは私たちにずっおそれほど倧きな問題ではありたせん。なぜなら、ほずんどのクラむアントは䌁業であり、䜕かを蚭定する必芁があるずき、管理パネルに行くからです。 補品の賌入埌最初の週、たたは地獄のピペット、すなわち バックアップを取埗する必芁がありたす。 そしお、ク゜男の地獄を持っおいる人は、管理パネルが最終的にロヌドされるたで16秒埅぀準備ができおいたす。 さらに、ここではかなり现いチャネルに぀いお説明しおいたす。











フレヌムワヌクを䜿甚するず、明確で非垞に耇雑でわかりにくくなりたす。 アプリケヌション自䜓はどうですか 私たちはアプリケヌションコヌドに乗り蟌みたした。







コヌドにはコメントがほずんどないこずがわかりたす。 いく぀かの難しい堎所は説明されおいたせん。 すべおのアプリケヌションは密結合されおいたす。 1぀のクラスではなく、2.5千行の長いクラスの代わりに、通垞1000行の3぀たたは4぀のクラスを凊理したす。これらは互いに非垞に厳密に認識しおいるため、通信し、むベントを自身に転送し、内郚の状態を倉曎したす。 たた、モデルずビゞネスロゞックの間、およびビゞネスロゞックずビュヌの間の境界には非垞に倧きな問題がありたす。 「特定の機胜パネルを実装する魔法のパネル」のようなものず呌ばれるビュヌクラスがあり、同時に自分自身を描画し、子コンポヌネントを描画したす。さらに、次に、内郚のパネル、および通知を送信するこずができたすが、ビュヌクラスからサヌバヌに登るこずもよくありたす。







したがっお、非垞に条件付きでそのようなmvcがありたしたが、M + CVであるこずが刀明したした。 ぀たり コントロヌルずビュヌの境界は非垞に䞍明確です。 モデルにはビゞネスロゞックがあり、コントロヌラヌにはビゞネスロゞックがあり、ビュヌにはビゞネスロゞック、UIロゞックがあり、アプリケヌションの状態も3皮類すべおのクラスに広がっおいるこずがわかりたした。 したがっお、たずえば、このデヌタがどこから来たのか、誰が信頌できるポむントであり、このデヌタがどこから来たのか、そしお珟時点でこのデヌタの最も信頌できるコピヌを誰が保管しおいるのかを理解するこずは困難です。なぜなら、それはアプリケヌションのいく぀かの郚分にあるからです。







たた、Ext JSフレヌムワヌク自䜓がすべおのナヌザヌをパブリッシュ/サブスクラむブで構築されたアヌキテクチャに向かわせるこずも刀明したした。これは、原則ずしお、すべおのUIコンポヌネントがこのメカニズムに関連付けられおおり、プログラマヌがフレヌムワヌクが提䟛するものを知らずに遞択するためです。 たた、パブリッシュ/サブスクラむブが正しいパタヌンですが、100ペヌゞのアプリケヌションを芋るず、それを理解しようずしおいるこずがわかりたす。「くそ、このパネルでこのボタンをクリックするずどのような圱響がありたすか」そしお圌女は䜕を匕きたすか」







そしお、最初に、むベントは暗黙的に芪クラスに分類され、その結果、ビゞネスロゞックを持぀いく぀かのクラスに分類されるセカンダリむベントが生成され、さらに倚くのむベントが生成されるこずがわかりたした。 その埌、フレヌムワヌクによっおむベントの䞀郚が無芖され、モデルが倉曎されるず、このモデルは「自分のデヌタが倉曎された」ずいうむベントを生成したす。 さらに5぀のクラスが衚瀺され、その倉曎にサブスクラむブされたす。これらのクラスは、このモデルの状態に応じお状態を倉曎したす。



その結果、3時間埌にようやく調和のずれた画像を構築し、すべおのむベントが非垞に類䌌した名前を持ち、どこでもonclickがあるこずを理解したす。 理解する必芁がありたす。これは、抌したこのボタンからのonclick、たたは抌した隣のボタンからのonclickです。 フレヌムワヌクは、任意のコンポヌネントのサブスクリプションを犁止しないためです。 ぀たり 誰かのスヌパヌコントロヌラヌから特定のパネルのボタンにアクセスしお、onclickでサブスクラむブできたす。 そしお、それは匕甚笊でオンクリックされたす。 これらのコンポヌネントには独自の遞択性がないため、そのようなこずを議論するのは非垞に困難です。 ぀たり XPathに䌌たComponentQueryず呌ばれる独自のメカニズムがあり、「特定の名前で特定のパネルにネストされおいるすべおのボタンを芋぀ける」ずいうRegExク゚リを䜜成できたす。 したがっお、䜕かをリファクタリングしようずするず、䞀般的に、特定のむベントに反応する堎所をすべお芋぀けるこずは非垞に困難です。 倚くの堎合、これにより、アプリケヌションがフリヌズするずきにむベントサむクルが発生したした。これは、子むベントが垞に衚瀺され、凊理を開始するためです。このサむクルは無限です。 「このむベントがすでに私に届いおいる堎合、私はそれを凊理したせん」のようにトリッキヌを曞くたで、それ以䞊凊理したせん。 ぀たり 耇雑なアヌキテクチャに぀いおです。



すべお順調です。







そしお今、倧きな質問がありたす。 ビュヌロゞック間、異なるクラス間での機胜の広がりず、蚀語、技術、その他の間の責任範囲の非垞に貧匱な境界の間の密接な関係がある倧芏暡なアプリケヌションのコヌドでは、通垞そうではありたせんか







そしおそれが起こった。 そしお、実際には、なぜそれが起こったのかは明らかではありたせん。 私の意芋では、より良いかもしれないからです。 しかし、芁するに、Arrayオブゞェクトをチェックし、残りはそれがどのように行われるかです。 そしお、この氞遠の物語は、テストの䜜成を開始するず、アプリケヌションに぀いお倚くのこずを孊ぶずいうこずです。実際、1぀の関数を呌び出すために15個のオブゞェクトをロックするのは非垞にhemoなので、それほど倚くの接続を行う必芁はありたせん。 そしお、この点で、圌らはテストを「さようなら」に受けたした。



調査結果は䜕ですか もちろん、そのような結論は...







しかし、本圓に、本圓の結論は䜕ですか







開発者、特にJavaで博士論文を擁護したこずがない開発者にずっお、フレヌムワヌクを理解するのは非垞に難しいこず。 第二に、出おきたコヌドは非垞に玛らわしいです。 倚くの接続があり、すべおのクラスがお互いを知っおおり、衚瀺されるむベントは誰にも制埡されたせん。これにより、アプリケヌションの状態倉曎が花火のような爆発に぀ながりたす。 , - 
 , . , , , JS-, html, CSS . ? 
 ? 40-60 . « », UI JS- JS-. ぀たり , , , , .



, — ? , , . . publish/subscribe, mv, , mvc. dependency injection , , 








, , , , , — , , , , , . , , , , , - , .



: , -, API, – . , -, - , JS- - , , , .. .



, , , . - . , . UI .







( ) — , « , ». , , , , , . ぀たり .



, , - - , - , , - .



, . , ? .







, , PHP, JS , .











そしお、これらの数千のフレヌムワヌクは、それぞれが2滎の氎ず同様に、特にフラックスフレヌムワヌクで互いに類䌌しおいるこずがよくありたす-それは盎接「あなたの名前をJSポむントず考えおください」。 そしお、Google Web Toolkitが長い間死んだこの地獄から、私たちはどういうわけか遞択しなければなりたせん。 どうする もちろん、䜕かを考え、他の人がむンタヌネット䞊で䜕かを遞択する方法を確認し、結果を盗むためにどこかに登る必芁がありたした。



その結果、結果を消去するこずはできたせんでした。結果はすべお非垞に異なるため、正盎な評䟡を行う必芁がありたす。 したがっお、圓局に察しおは、䌁業やあらゆる皮類のサむトがどのようなフレヌムワヌクを䜿甚しおいるかを珟実的か぀公平に評䟡する詊みが行われたした。







そこからスラむドを切り取ったのは䌁業やサむトに぀いおでした。それは正盎な数字のたたです。 これは、Githubがさたざたなテクノロゞヌに登堎しおから䞀般的に蚘述されたコヌドの行数です。 プラスたたはマむナス。







このスラむドは、2015幎に海倖で行われた䞻芁なカンファレンスで、どのテクノロゞヌがどのように報告されたかを瀺しおいたす。



そしお、どこでも絵は異なりたす。







この写真では、Googleの傟向が人気を怜玢しおいたす。 それらのいく぀かがありたす...ここで、よく芋るず、React jsずAngular jsを陀くすべおのテクノロゞヌが実際に枛少しおいるこずがわかりたす。







Dojo、Yahoo ui dip、そしお愛するExt jsの叀いフレヌムワヌクを採甚するず、すべおが衰退したす。 この点で、React jsずAngular jsず戊う人はいたせん。これは、これが唯䞀の問題だからです。



このような調査では、2.5千人の開発者が調査され、それぞれが1぀のテクノロゞヌを遞択したした。







これは、クラりドIDEを䜜成および販売するアメリカの䌚瀟です。 結果は、たったく異なる写真でした。 ぀たり 補品をサポヌトする開発者はただ匷力です。たずえば、䞀般的には時代遅れのBackboneですが、それにもかかわらず、ただ完成䞭のプロゞェクトが数倚くありたす。







そしおこれがロシア垂堎です。 私たちは宇宙で働いおいないこずは明らかであり、䌚瀟で補品を䜜る必芁があり、倚くの補品ず蚈画があり、誰かを雇う必芁があるため、誰を雇うこずができるかを評䟡しようずしたした。 ここで、䞀般的に、写真は異なりたす。 ExtJSのバヌゞョンの1぀かなり長いためずBackboneのバヌゞョンのいく぀か2008幎に生たれたためで、䜕らかの圢で誰かが察凊しおいるこずが刀明したした。 ぀たり これは、このフレヌムワヌクでこの人がリアルタむムで䜕かを行う準備ができおいるこずを保蚌するものではありたせんが、それにもかかわらず、React jsずAngular jsの成長しおいる技術の䞭で、BackboneずExtJSが突然珟れ、それらがあり、それらの倚くがありたす。 Reactの知識を超えるバックボヌンゞョブ これはロシア垂堎のすばらしい写真です。







その結果、これらすべおの研究を可胜な限り暪断し、興味のあるものを残したした。 圌らはそこにDojoを远加し、最初に切り替えたいExtJS 6を远加したした。 Dojoは、Parallelsで䜿甚されおおり、Parallelsず密接に統合されおおり、その䞊に䜕かが曞かれおいるためです。







ここでは、5぀のスラむドが倧胆に圫られおいたす。 そこにある話は非垞に退屈なので、私たち党員に合わなかった理由に぀いおは語りたせん。 私はそこで止たりたせん。 自分のために勉匷するために登ったら、自分のために䜕らかの絵を描くでしょう。 目暙に基づいお評䟡したした。 タスクの1぀は、既存のコヌドの䞀郚にテクノロゞヌを倚かれ少なかれ埋め蟌むこずでした。 モノリシックなフレヌムワヌクではなく、埐々に導入できるいく぀かのテクニックずラむブラリのセットが必芁です。 この点で、Knockoutはフレヌムワヌクではなく、UIラむブラリであるDojoは単なるマンモスであり、ExtJS 6は新しいアヌキテクチャを導入しおいたすが、実際にはExtJS 4ず倧差ないこずがわかりたした。 䜕らかの皮類のサポヌトが登堎し、モバむルデバむスでの動䜜が改善されたしたが、コンセプトは倉曎されおいたせん。 そこのアヌキテクチャは少し良くなりたしたが、私たちが掚定したように、ExtJS 6で正盎にアヌキテクチャを曞き換えるのずほが同じです。他のフレヌムワヌクでそれを改造するこずを提案するのず同じです-コストはほが同じです。 その結果、すべお同じUIレむダヌ、すべお同じパブリッシュ/サブスクラむブのために拒吊されたした。



実際、真の候補者は2人しかいたせんでした。







最初の-AngularJS-明らかな理由で、䌚瀟のいく぀かの郚門ず䞀郚の倖郚アドバむザヌによっおただ非垞に積極的に支持されおいたした。 しかし、圌には非垞に興味深いゞレンマが生じたした。 䞀方で、それは本圓に非垞に良い解決策に芋えたしたが、䞀方で、Habrず、䞀般的には英語のむンタヌネットで倚くの蚘事を芋たした。ずおもクヌルですが、私たちは混乱しおいたす。



この問題に関する私たちの芋解は、私たちが2぀のプロゞェクトを持っおいるバヌゞョン1を採甚し、゜ヌスコヌドを座っお吞うず、このフレヌムワヌクは個別の郚分に分割する非垞に優れたモゞュヌル性を持ち、それぞれが独自の小さな機胜を䜜りたす-これは非垞に䟿利で優れおいたす。 しかし、単䞀のスタむルのファむルレむアりトはなく、単䞀のスタむルの倉数の呜名や単䞀のスタむルのコヌドフォヌマット、぀たり これはどういうわけかフレヌムワヌクでヒヌプに到達したいものですが、ネバヌマむンドは倱敗したす。 そしお、時間の経過ずずもに、このレむアりトスタむルは倉わりたす。 たた、コヌドには、良い意味で別のクラスにする必芁がある堎所がしばしばあるこずを自分から付け加えたすが、䜕らかの理由で、それらは関数を持぀オブゞェクトの圢でそこに抌し蟌たれたす。 デバッグが難しく、さたざたなトリッキヌな「マゞック」、いく぀かの新しいテクノロゞヌずの統合は非垞に困難です。これは、暙準が完党に独自のものであるためです。このビゞネスを組み立おる方法も明確ではありたせんが、この問題は解決できたす。 しかし、最悪なのは、圓局に販売できなかったこずです。みんな、「みんな、新しいバヌゞョンを䜜っおいるのに、コヌドに互換性がない」ず蚀ったからです。 次に䜕をすべきかは䞍明です。







わかりたした。圌らはバヌゞョン2を芖聎したした。バヌゞョン2は、䞀般的に芋た目は玠晎らしく、必芁なもの、このようなバック゚ンド指向のアプロヌチ、すべおが棚に配眮されおいる、非垞に優れたTypeScript構文が必芁です。 しかし、それはいたいたしい、䞀般に、リリヌスの可胜性はありたせん。 私は、最も重芁なこずずしお、このスヌパヌメガグヌグル瀟を理解しおいない、それは長い間Pythonで働いおきたした... pythonがバヌゞョン2から3に切り替える方法の䟋は、これを行う方法の単なる教科曞の䟋です。 叀いバヌゞョンの構文を維持する必芁があり、バックワヌド互換でなければなりたせん。 そしお、ここでいく぀かの地獄のような地獄は簡単です。 互換性がなくなりたす。 「私たちは今、䜕か新しいこずをしおいたす。 こちらがアルファ版です。ドキュメントはありたせん。 開始時は䞍明確であり、最も重芁なこずは、3぀の蚀語すべおで異なる構文を䜿甚しおいるこずです。 たあ、病気になる、気にしないでください



これは解決策ですか 申し蚳ありたせんが、これはフロント゚ンド開発゚ンゞンですか、誰もが倧奜きな最もクヌルなフレヌムワヌクですか そしお、4人が珟圚AngularJSで曞いおいる管理者はどうすればよいですか 来お、蚀っおください「みんな、あなたは知っおいる、私たちはただ座っおすべおを曞き盎す。 私たちには䜕も良くなるこずはありたせん。新しいバヌゞョンに移行するだけです。」 -「なぜ動くの」-「たあ、圌らは叀いものを捚おたから」 そしお、もちろん、圌らは私に尋ねたす「聞いおください、しかし、Pythonのようなものがありたす、䟋えば、2から3で」。 ぀たり 䜕らかの皮類のパヌサヌを蚭定しおみたしょう。コヌドを再フォヌマットし、䜕らかの圢でアセンブルを開始したす。 「ごめん、いや。 さらに、それだけでなく、いや、それでもすべおを倉えたす。 明日は別の構文になりたす。」 そしお、これは誰にも売るこずも䞍可胜です。 取締圹䌚は私を芋お、明日のために私を解雇したす、それがすべおです。 ぀たり AngularJSをどうするかは䞍明です。







さらに調査を開始し、2番目の解決策がありたした-これはFacebookが䜜成したReact JSです。 驚いたこずに、これはフレヌムワヌクではなく、単なるUIラむブラリであるこずが刀明したした。 非垞に明確な理解可胜な構造を持ち、これは単䞀のデヌタフロヌであり、デヌタのみを受け取り、それらを描画するだけであるこずは明らかです。 各コンポヌネントは分離されおおり、各コンポヌネントは、入力ずしお受け取るもの、最終的に描画するもの、内郚状態ずしお保存するものの宣蚀を持っおいたす。 いいえ、䞀般的に、どこかから接続し、それがどのように機胜するかを孊び、知る必芁があるある皮の魔法のフィルタヌやその他のゎミ...この点で、すべおが予枬可胜で非垞にクヌルです。 パフォヌマンスを調敎するための非垞に簡単な機䌚があるこずを気に入っおいたす。それがどのように機胜するか、それをどのように䜿甚するかが明確であり、それに぀いお非垞に耇雑なものはありたせん。 必芁のないサヌバヌレンダリングもありたすが、それは玠晎らしいこずです。







Facebookが積極的に掚進しおいるFluxアヌキテクチャは、これたでずっず進んでいたす。 私たちはすべおを芋おいたが、私たちはそうであったように、たあたあだった。 䞀方で、その䞀方向のデヌタフロヌ、および同期凊理は、アプリケヌションの特定の状態が明確に理解されるステヌトマシンのようなものです。 しかし、アプリケヌションを独立したブロックに分割する方法ず、Angular JSのようにそれをいく぀かの個別の゚ンティティに分割する方法はあたり明確ではありたせん。 どうやら、ストアデヌタを栌玍するフォヌムには明らかにアンチパタヌンがあり、同時にビゞネスロゞックを実装し、このデヌタを倉曎するためのロゞックも実装しおいるようです。 ぀たり モデルであるず同時にコントロヌラヌでもありたす。 ナニヌクな名前のむベントを持぀単䞀のむベントバスずしおの単䞀のディスパッチャずいうアむデアは、コヌド内で䜕かが倉曎された箇所をすばやく芋぀け、迅速なリファクタリングを実行し、コンポヌネントが盞互に分離しお動䜜するずいう点で非垞に優れおいたす。 しかし、ダむナミクスがどのように提䟛されるか、たずえば、互いに独立しお動䜜するず同時に同じむベントを生成する1぀の画面で2぀のりィンドりを開く方法などは完党に理解䞍胜です...



抂しお、Facebookはコヌドに匵り出しおいたせんでした。そこにはありたせん。これはフレヌムワヌクではなく、䞀皮のアヌキテクチャのアむデアです。 たた、むベントバスず呌ばれる80幎代に発明されたした。







わかった このゎミを実装するサヌドパヌティのフレヌムワヌクを芋おみたしょう。 私は5぀の䜜品をレビュヌしたしたが、それらはすべお2滎のようであり、AngularJSよりもこの点ではるかに悪く、Ext JSよりもはるかに悪いです。 はい、アヌキテクチャがどのように機胜するかを確認する方が良いですが、ストアの動的な䜜成、アンロヌド、およびストア間のUIコンポヌネントの䜕らかのリンクにより、アプリケヌションの䞀郚が盞互に分離しお動䜜し、 2぀のコンポヌネントは、同じビュヌず2぀のコントロヌラヌを䜿甚しお同じように䜜成され、これらのむベントで互いに戊うこずはありたせんでした。 したがっお、この点で、Webアプリケヌションの開発では、すべおが非垞に奇劙です。 倚くの堎合、これを行う方法は明確ではありたせん。 しかし、これらのフレヌムワヌクでは、過去5幎間のjavascriptの開発を、同型、npm-modules、ラむブラリ機胜のレンダリングの圢匏、ES6サポヌトの圢匏で芋るこずができたす-これは良いこずです。 ただ、それは気にせず、むチゞクはありたせん、䞀般的に、圌らはテストむンフラストラクチャを持たず、テストを曞く方法は明確ではありたせん。 特にこの新しいスヌパヌ階局では、テストの曞き方が䞍明確です。 そしお、囜際化はありたせん。



途䞭で、タむプスクリプトに遭遇したした。 この点で、それは䞀般に爆匟です。







最も玠晎らしいこず-自分で「バむク」を䜜りたいず思うさたざたな開発者から䞍必芁な創造性を取り陀くこず-これで完璧にできるず思いたした。 Typescriptはトランスコンパむラです。 型を蚭定するだけで、同じ構文でjavascriptのようなコヌドを蚘述したす。 ぀たり 各倉数には型があり、耇雑になる堎合があり、同時に耇数の型を持぀こずができ、その結果、これらの型が削陀され、これらの型が単玔に削陀されるたったく同じ構文を持぀javascriptファむルが䜜成されたす。 ECMAScript 2006芏栌に準拠した䟿利な構文シュガヌがいく぀かありたす。 ECMAScript 6から5の単なるコンパむラ。







たずえば、契玄党䜓を䜜成できるずき、぀たりそのような耇雑なデヌタ型がありたす。 ネストされた構造を持぀オブゞェクトがあり、そのようなunningなネストされたオブゞェクトがAPIから来おいるこず、たたはたずえばフィヌルドが繰り返されおいるこずを事前に知っおいるアプリケヌションのさたざたな郚分がありたす。 これをアプリケヌションの別々の郚分間の接着剀の䞀皮ずしお䜿甚したす。 誰もが䜕らかのビゞネスむンタヌフェむスに焊点を圓おおこのビゞネスロゞックを䜜成したす。 たた、コンパむラは、これらのフィヌルドぞのアクセスを正しく敎理しおいる堎合、フィヌルドの正しい型を意味しおいる堎合、コンパむルできるかどうかをビルドするずきにすぐにチェックしたす。







次に、むンタヌフェヌスがありたす。 将来を芋据えお-私たちが曞いたフレヌムワヌクはむンタヌフェヌスに倧きく基づいおいたす。 私たちは、固䜓の原則に導かれ、より小さな責任領域に分割し、さたざたなクラスを小さなむンタヌフェヌスに䟝存させたす。 アプリケヌションのデカップリングが倧きくなっおいるこずがわかりたす。







Pythonの堎合ず同様に、䞀般的なサポヌトがありたす。 Pythonのようにデコレヌタがあり、C ++の䞖界では慣䟋ずなっおいるゞェネリックがあり、積極的に䜿甚しおいたす。 たた、耇合型がありたす。 たれに、回避できない堎合は、この倉数に文字列たたは数倀のいずれかが含たれるず蚀うこずができたす。 圌もこれでうたく動䜜したす。







その結果、この研究の埌、質問はさらに倚くなりたした。 どのアヌキテクチャを遞択したすか どの゜リュヌションが正しいですか ECMAScript 6の圢匏のjavascriptの開発に遅れずに぀いおいく方法は UIコンポヌネントのラむブラリはどこで入手できたすか



この点で、Ext JSは打撃を保持するのに非垞に積極的です。 独自のアセンブリ、囜際化のメカニズム、明確なアヌキテクチャなどを備えおいたす。 ぀たり その埌起こったこずは奇劙であるこずが刀明したが、代替手段はない。 たあ、圌女はそうですが、圌女は自分でやらなければなりたせん。 その結果、Typescriptフレヌムワヌクが必芁であり、この時点で誰もがTypescriptフレヌムワヌクを望んでいたした。 なし-誰も望んでいたせん。







さお、䜕をすべきか 自分でタスクを曞きたしょう。 JS゚ンコヌダヌはコヌドを蚘述する必芁がありたす。 レむアりト蚭蚈者は、組版しお蚭蚈者ずやり取りする必芁がありたす。 明らかに、デザむナヌが理解できるようにUIレむダヌをできるだけシンプルにする必芁があり、プログラマヌがコンポヌネントをひどく継承せずに3レベルたたは4レベルでCSSスタむルをひどく継承せずに理解できるようにする必芁がありたす。 明確でわかりやすいアヌキテクチャ、バック゚ンド開発者が理解できるコヌドを䜜成する必芁があり、責任の領域を分離する必芁がありたす-個別のレむアりト、個別のコヌド、個別のコントロヌラヌ、個別のデヌタストレヌゞ、アプリケヌション状態を1皮類のクラスタむプに詰め蟌み、モデルず呌びたす そしお、最も重芁なこずは、より倚くの境界、芏則、および暙準ネヌミング、コヌドのフォヌマット、ファむルレむアりトなどです。 そしお同時にTypescriptで。 そしお同時に、党䜓が既存のコヌドに埋め蟌たれる必芁があるため、この党䜓がモノリシックフレヌムワヌクではありたせん。







最終的に、Este.jsずいうフレヌムワヌクを䜿甚したした。 圌はあなたに䜕も語りたせん;圌は最も革呜的で革新的でした。 圌が䜕もなくなるたで、圌らはスムヌズにコピヌしたした。



最埌に、いく぀かの問題がありたした。







最初の問題。 storeは流動的なアンチパタヌンの䞀皮であるこずがわかりたす。 実際には、良いこずは䜕もありたせん。 その結果、デヌタを保存しお倉曎できるクラスに戻し、コントロヌラヌのビゞネスロゞックを個別に分割したした。 これは、状態を持぀オブゞェクトを別々に杭打ちしたずきにフラックス開発が行われる堎所ずほが同じです。 このオブゞェクトには、単にストアず呌ばれる状態がありたす。







そんな感じでした。



次のような結果になりたした。







぀たり AngularJSずほが同じ、モゞュヌルず同じメカニズムを持぀分離ブロック。 各モゞュヌルには、耇数のコントロヌラヌの1぀ず通信する1぀以䞊のストアがありたす。 そしお最終的に、この党䜓がビュヌずは別に機胜したす。 Viewはストアデヌタのみを読み取り、単䞀のディスパッチャヌがコントロヌラヌ間で分散する特定のアクションを生成したす実際には、単䞀のブロックではなく、各分離ブロックが独自に持぀こずができたす。コントロヌラヌはそれぞれむベントにサブスクラむブし、応答するかどうかを決定したすこのむベントかどうか。 その結果、私たちのアプリケヌションは、互いに埋め蟌たれたアプリケヌションのセットずしお機胜し、それぞれがフラックスの内偎にありたす。 これは、ビュヌが単玔にネストされ、コントロヌラヌが分離されおいる階局型MVCです。



2番目の問題は、Facebookが次のようなテンプレヌトの実行を提案しおいるこずです。







もちろん、私たちは長い間苊しんでいたしたが、これはたったく遞択肢ではないこずに気付き、自分で足を撃ちたした。 UIコンポヌネントの本質が、ある皮のテンプレヌトを取り、それをレンダリングするこずである堎合、倚くのJSコヌド、ブレヌス、括匧、ロゞック、およびすべおを䞀緒にUIコンポヌネントに混圚させる必芁がある理由はたったくわかりたせん。ブラりザで。 wix-react-templatesのようなプロゞェクトを芋お、非垞によく䌌た独自のプロゞェクトを䜜成したした。 しかし、そこにはコヌドがありたせん。 else、倉数、それ以倖の堎合、繰り返しを提䟛するブロックのみがありたす。 ぀たり コンポヌネントのタスクは、この倉数に衚瀺される内容を事前にこの倉数に詰め蟌むこずです。 たた、コンポヌネントのタスクは、どのブロックをどのデヌタで反埩するかを瀺すこずです。 テンプレヌトは次のようになりたす。







ここでは、これらのテンプレヌト甚に独自のパヌサヌを䜜成したした。これにより、DOMツリヌが䜜成され、JSXによっお生成されたテンプレヌトず非垞によく䌌たテンプレヌトが生成されたす。







珟圚、このケヌスはすでに自動的に生成されおおり、Reactはこのケヌスで動䜜したす。







UIコンポヌネントの本質は、いく぀かの小道具を宣蚀し、いく぀かの状態を宣蚀し、最も簡単な方法でこれらの小道具をブロックず倉数に詰め蟌むこずです。 圌らは特定のツリヌを構築し、それをレンダリングしたす。







翻蚳のために、これらのテンプレヌトのテキストを噛み合わせおファむルを生成する小さなものを䜜成したした。 このファむルをペンでロシア語に翻蚳したす。 䜕らかの皮類のレむアりトをそこに远加できたす。 最埌の行にスパンが远加されおいるこずに泚意しおください。 私たちは蚀葉の倚元化のためにこのビゞネスを築いおいたす。







, , , span .







, Facebook , , . .



?







, , , java. dependency injection, , — React lodash. — , , MVC — MVC. React. web-pack








— Ext JS 6, React. , , , , . , - .



— , , , - , , , , json rest, , API .



:







, , , , flux + react 2- 5- . , UI , ExtJS, , , , , .







, . , , , 60 , 15 — , - , , , -, — .







. react', - 4 .







, 10 , , 2 . 4 2 - UI , .







, , , , UI . , « » « , ». , , , , . , UI Ext JS, , - , - - , , , - . , , , , .







, : ; , , — . , , . ぀たり react' , , , , , .







連絡先



» XEK

» s@averin.ru

» facebook

» twitter

» Acronis



— HighLoad++ . 2016 — HighLoad++ , 7 8 .



- HighLoad.Guide — , , , . 30 . !

















All Articles