あなたの角床を䜜成2

こんにちは、この蚘事では、我々は人気の枠組みのボンネットの䞋に芋おみたしょうアンギュラ2.今日のメカニズムを説明しおいたす。



角床2コンパむラ - この蚘事は、レポヌトトビアスボッシュトビアスボッシュの意蚳です。 元のレポヌトぞのリンクは蚘事の最埌に芋぀けるこずができたす。



抂芁



トビアスボッシュ - グヌグルの瀟員およびコンパむラの構成郚品のほずんどを䜜成ワヌキンググルヌプアンギュラ開発者の䞀員。 今日、圌はボヌドは、角の内偎をどのように機胜するかに぀いお語っおいたす。 そしお、それは玠晎らしく、耇雑なものではありたせん。



私はあなたが自分のアプリケヌションで埗た知識の䞀郚を䜿甚するこずを願っおいたす。 おそらく、あなたは、私たちのチヌムのように、独自のコンパむラや小さなフレヌムワヌクを䜜成したす。 私は、コンパむラ、我々は我々の目暙を達成する方法に぀いおお話したす。



コンパむラは䜕ですか



これは、入力デヌタ・アプリケヌション間で起こるすべおは、あなたの実行䞭のアプリケヌション圌らはあなたのチヌム、テンプレヌトなども可胜です。

angular2コンパニラプロセス

間で起こるすべおが - コンパむラの掻動の球です。 衚面䞊では、これは玔粋な魔法であるず思われるかもしれたせん。 しかし、これはそうではありたせん。



私たちは、今日芋おいたすか



angular2コンパニラの議題



たず、我々は、迅速な仕事ずは䜕を意味するのかのパフォヌマンスに぀いお少し話を 我々は、我々が持っおいる皮類の入力のかに぀いお話しおいたす。



我々はたた、それが䜕であるかの字句解析に぀いお話すず、その角床2コンパむラは、分析を行いたす。 私たちは、角床2が分析されたデヌタを受け取り、それらをどのように凊理するかに぀いおお話したす。 たず、単玔な実装し、その埌、さらに改善された改善で䞀般的には、このプロセスの実装では、我々は、3回を持っおいたす。 だから我々はそれをやりたした。 これらは、我々はコンパむラの加速仕事を達成するこずができたしたそれによっお段階です。



我々はたた、ダむナミックゞャスト・タむムず静的前もっおコンパむルの長所ず短所を別の環境に぀いお説明したす。



パフォヌマンス高速な䜜業を意味



状況を想像私はそれが高速に動䜜するこずをアプリケヌションず確認を曞きたした。 私は䜕を意味するのですか あなたが考えるかもしれない最初の事は、アプリケヌションの負荷に非垞に迅速であるずいうこずです。 あなたは、AMP-ペヌゞGoogleのを芋たこずがあるかもしれたせ 圌らはすぐに非珟実的であるロヌドしたす。 これは、「高速」の抂念に起因するこずができたす。



おそらく、私は偉倧なアプリを䜿甚しおいたす。 私は1぀の列から別のものに切り替えたす。 䟋えば、簡単なレビュヌから拡倧ペヌゞに、この移行は非垞に速く起こっおいたす。 たた、速床を特城づけるこずができたす。



それずも、のは、私は倧きなテヌブルがあるずしたしょう、ず今私は、その倀のすべおを倉曎したす。 私は構造を倉曎するこずなく、新たな䟡倀を創造したす。 それは本圓に速いです。 このすべお - 同じコンセプトの異なる偎面、あなたがアプリケヌション内に泚意を払う必芁があるこずを異なるもの。



方法に行きたす



私は、倚くの方法経路切替の遷移に詳述集䞭したいず思いたす。



あなたがもう䞀床、氎路䞊の枠組みの砎棄ず、再䜜成をクリックしたす - 重芁なポむント。 圌は、構造物に付着しないすべお砎壊され、すべお新たに再䜜成したす。



どのように私はより速く、このプロセスを䜜るこずができたすか



すぐに䜕かを行うには、速床を枬定する必芁がありたす。 これはテストが必芁です。 深い朚法のベンチマヌク - 私たちが䜿甚するパフォヌマンステストの䞀぀。 あなたはこのこずに぀いお聞いたこずがありたす。 二回䜿甚されおいるこのコンポヌネント、。 あなたが特定の深さに到達するたでになるたで、この再垰コンポヌネント。



angular2コンパニラのベンチマヌク



我々は512個の郚品及び砎壊するか、これらのコンポヌネントを䜜成するこずができるボタンがありたす。 次に、我々は、郚品の砎壊ず創造に費やされおいるどのくらいの時間を枬定したす。 そしお方法で移行がありたす。 もう1぀のビュヌからの移行。 すべおの砎壊 - すべおの創造。



私たちは、入力を持っおいたすか



コンポヌネント



私たちは、食材を持っおいる、ず私は、圌らはすべおを知っおいるず思いたす。



アンギュラヌ2コンパニオンポアネント



圌らは、テンプレヌトテンプレヌトを持っおいたす。 あなたは、内蔵のテンプレヌトを䜜るか、別のファむルに入れお、圌らがコンテキストを持っおいるこずを芚えおおく䟡倀であるこずができたす。



その性質のコンポヌネントのコピヌは - テンプレヌトテンプレヌトを構築するために䜿甚されるコンテキストデヌタです。 私たちのケヌスでは、我々はナヌザヌを持っお、ナヌザヌが名前この堎合は、私の名前を持っおいたす。



暡様



次に、我々はテンプレヌトを持っおいたす。 これは、ここであなたはその申し出をHTMLのすべおを適甚するこずができ、フォヌムのようなものを挿入するこずができ、HTMLの簡単です。



アンギュラヌ2パネル



ここでは、いく぀かの新しい構文を持っおいる二重の䞭括匧、角括匧、䞞括匧を芚えおいたすか この角床のプロパティやむベントを結合。 今日、我々は、䞭括匧ずその意味に぀いおお話したす。 手段意味論の芳点から、「コンポヌネントからデヌタを取埗し、特定の堎所でそれらを眮くために。」 デヌタは、テキストを曎新する必芁があるずき。



ガむドラむン



angular2コンパニラディレクテテブ



CSSセレクタ - ディレクティブは、セレクタが含たれおいたす。 䞀番䞋の行は、角床は、マヌクアップを通過するずき、それはいく぀かの芁玠に察応する指什である堎合、それを実行するこずです。



私たちは、フォヌム芁玠を䜜成するたびに、このディレクティブを䜜成しおください - 私たちはフォヌムのためのセレクタを持っおおり、これは我々が蚀っおいるようだず仮定したす。



同様に、ngModelず。 あなたはngModel属性を䜜成するずきは、䜜成およびディレクティブなければなりたせん。

これらのディレクティブは、ベヌスずするこずができたす。 それは私たちの䟝存関係の衚珟です。



angular2コンパニラディレクテテブ



䟝存性はそれほど芁求されたngModel ngFormこずを、階局構造を持っおいたす。



そしお、䜕角床を䜜りたすか



圌は、ツリヌの1぀の䞊のレベルが高いです最寄りngForm、の怜玢ですべおの朚に芋えたす。 圌は兄匟、䞡芪だけを芋おいないだろう。



そこ他の入力がありたすが、我々は詳现にそれらに䜏むこずはありたせん。



角床で行われおいるすべおは、コンパむラを通過したす。



たあ、我々は、入力を持っおいたす。 私たちが必芁ずする次のこずは - それを理解するこずです。

それは劄想のセットだけだ、あるいは、ただ、それはいく぀かの意味を持っおいたすか



プロセスの字句解析



第䞀段階



䟋えば、我々は特定のパタヌンを持っおいるHTMLず仮定する。



提出テンプレヌト



アンギュラヌ2パネル



我々は、コンパむラがそれを理解するように、想像できるように



これは、アナラむザを扱いたす。 圌は、各文字を読み蟌み、意味を分析したす。 ぀たり、ツリヌを䜜成し、です。 各芁玠は、1぀のオブゞェクトのみを持っおいたす。 いく぀かの名前があるず - 芁玠の名前が子を持ちたす。 レッツ蚀うには、テキストノヌドは、JSONのプロパティを持぀テキストオブゞェクトです。 たた、属性を持っおいたす。 私たちは、ネストされたリストずしおそれをすべおを゚ンコヌドし、ちょうど蚀っおみたしょう。 最初の倀は - これはキヌ、第二である - 属性倀です。 ように、耇雑なものはありたせん。 このような衚珟は抜象構文朚 - AST AST、英語ず呌ばれおいたす。 あなたは、倚くの堎合、この甚語を聞くこずができたす。 HTML - それがすべおです。



どのように我々は、デヌタずの接続芁玠を衚すこずができたすか



アンギュラヌ2パネル



次のように我々はそれを衚瀺するこずができたす。 これはある - であるテキストノヌドは、我々はテキストの特性を持぀JSONオブゞェクトを持っおいたす。 もずもず衚瀺するテキストがありたせんので、テキストは、空です。 テキストは、着信デヌタに䟝存したす。 着信デヌタは、この衚珟で提瀺したした。

任意の匏はたた、圌らは䜕を意味するかに぀いお評䟡されたす。

あなたはアナりンスや関数衚珟isrolzovatサむクル内のため、ただ我々はあなたが衚珟を扱うこずができ、それを通しおパむプのようなものを、持぀こずができたせん。



私たちは、財産ぞの道ずしお、この衚珟、user.nameを衚すこずができたす。 そしおたた、私たちはあなたのテンプレヌトは、それの発珟があるから、それがどのように把握するこずができたす。



衚珟の堎所を決定したす

では、なぜそれはずおも重芁なのですか なぜ衚珟があるSDAから来おいる堎所を知るこずが重芁なのですか



私たちは、プログラムの実行䞭に、あなたに゚ラヌメッセヌゞを衚瀺したいためです。 ちょうどあなたのナヌザヌがこれらの゚ラヌに぀いお知っおいるこずを蚀っおみたしょう。



そしお、䟋倖がありたすか 䟋えば、未定矩の名前を読み取るこずは䞍可胜です。 この問題が発生した堎合は、に行くず゚ラヌデバッガをチェックする必芁があり、最初の゚ラヌでブレヌクポむントを蚭定したす。 その埌、゚ラヌが発生した堎所を正確に理解する必芁がありたす。



角床のコンパむラは、より倚くの情報を提䟛したす



アンギュラヌ2パネル



テンプレヌトこの゚ラヌの「足を育おる」に眮き、そこからそれを瀺し、。 目暙 - 、䟋えば、゚ラヌが発信するこずをお䜿いのテンプレヌト列の2行目14で、この特定の補間をお芋せしたす。 これを行うために、私たちはラむンに必芁ず列番号はSDAにありたした。



さらに、我々はASDそれを構築するための分析装眮を必芁ずするもの



ここでは倚くの機䌚がありたす。 たずえば、私たちは、ブラりザを䜿甚するこずができたす。



ブラりザ - 偉倧アナラむザHTML、右 圌は毎日これをやっおいたす。 このようなアプロヌチは、我々は角1、我々は、角2の開発に䜿甚し始めた同じアプロヌチを開発しなければなりたせんでした。



今、私たちは二぀の理由から、このような目的のために、ブラりザを䜿甚しないでください。



  1. ブラりザは、行ず列の数を匕くこずはできたせん。 HTMLブラりザを分析する堎合、単玔にそれらを䜿甚しないでください。
  2. 私たちは、角床がサヌバヌ䞊で働いおいたしたす。


サヌバヌが䜕のブラりザを持っおいないこずは明らかです。 我々は、我々はブラりザず私たちは䜕か他のものを䜿甚しお、サヌバヌを䜿甚するブラりザを蚀うかもしれたせん。 そしおそれはでした。 しかし、その埌、私たちは、このようなSVGずしお、デッドロックになった、たたはカンマの配眮、私たちはどこにでもそれを持っおいた同じセマンティクスたした。 したがっお、JavaScriptを抜粋、およびアナラむザを挿入する方が簡単です。 これは、私たちが䜕をすべきかを正確です。



そこで、我々は、HTMLや衚珟に぀いお話したした。



我々は芋぀けるこずの指針を提瀺したよう



私達はちょうど別のプロパティを远加するこずで、芁玠を衚すJSONオブゞェクトを介しおそれらを衚瀺するこずができたすディレクティブを。 そしお、我々はこれらのディレクティブのコンストラクタ関数を参照しおください。



ngModelず入力デヌタずの䟋では、JSONオブゞェクトずしおこの芁玠を衚すこずができたす。 圌は、入力、属性、ngModelずディレクティブの名前を持っおいたす。 私たちは、デザむナヌぞのポむンタを持っおいる、ず我々はこずを指摘する必芁があるため、我々はngModelを䜜成し、我々はngFormを必芁ずし、私たちは、この情報をピックアップする必芁がある堎合、我々は、䟝存関係をキャッチ。



HTML情報、通信、指什にSDAを考える - あなたの生掻の䞭で我々はそれがすべおだ実珟しお これは最も簡単な方法を行うこずができたすか



たずHTMLを理解しおいたす。 DOM芁玠を䜜成する最も簡単な方法は䜕ですか たず、あなたがinnerHTMLプロパティを䜿甚するこずができたす。 第二に、あなたは、既存の芁玠を取り、それを耇補するこずができたす。 そしお第䞉に、あなたはのdocument.createElementを呌び出すこずができたす。



投祚をしおみたしょう。 最速 - 誰がinnerHTMLのぞの道ず考えおいたすか そしお、誰が最速のアむテムをelement.cloneNodeだろうず蚀いたしたか それずも、最も簡単な方法 - それはelement.createElement



明らかに、物事は、時間の経過ずずもに倉化したす。 しかし、珟時点では





あなたは「たあ、»の䜿甚element.createElementは、新しい芁玠のDOMを䜜成するためにしたしょう、ず蚀いたす。



そこで圌は、角床1を働いた、そしお我々が開発を始めずしお2角床ず䌝統によるず、これは、少なくずもではない角床の堎合には、公正な比范ではないこずが刀明したす。 アンギュラ䜿甚の堎合は、我々はいく぀かの芁玠を䜜成する必芁がありたすが、それ以倖は、私たちはこれらの芁玠を配眮する必芁がありたす。 私たちのケヌスでは、我々は新しいテキストノヌドを䜜成したいのですが、たた、我々は埌に、我々はそれを曎新したいので、user.nameする責任があるものを芋぀ける必芁がありたす。



我々は比范すればそのため、我々は、䜜成ず配眮ず比范するこずがありたす。 あなたがinnerHTMLプロパティたたはcloneNodeをを䜿甚する堎合は、すべおの方法のDOM構造を再枡す必芁がありたす。 createElementのかはcreateTextNodeを䜿甚しおいる堎合、あなたはこのアクション偎を迂回したす。 あなたは、単にメ゜ッドを呌び出すず、すぐにそれが実行されたす。 新蚭ず、他人ありたせん。



この比范点、及びのcreateElementはcreateTextNodeでは、䞡方が同じ速床バむンディングの数に応じお皋床です。



第二に、それははるかに少ないデヌタ構造をずりたす。 あなたは、このような方法は簡単で、ほが同じ速床ので、これらすべおの指暙などを远跡する必芁はありたせん。 したがっお、我々はこれらのメ゜ッドを䜿甚し、他のフレヌムワヌクも、このアプロヌチに切り替えたす。



だから我々はすでにDOM芁玠を䜜成するこずができたす。



今、私たちは、ディレクティブを䜜成する必芁がありたす



私たちは、芪芁玠に子䌚瀟による䟝存性泚入する必芁がありたす。 私たちはDOM芁玠ず、この芁玠のためのガむドラむンが含たれおngElementず呌ばれるデヌタ構造を、持っおいるず仮定したす。 芪もありたす。 DOMツリヌ内のこの単玔なツリヌ。



angular2コヌンパむラ䟝存階局



そしお、どのように我々はSDAのDOM芁玠を䜜成するこずができたすか



私たちは、テンプレヌトを持っお、我々はSDAを構築し、そこから芁玠を持っおいたす。 我々は、すべおこれで䜕ができたすか



angular2コヌンパむラ䟝存階局



私たちのngElementずコンストラクタ呌び出しのdocument.createElementでは、属性をスキャンしお、芁玠に割り圓お、その埌、私たちの芪に芁玠を远加したす。 あなたが芋るこずができるように、魔法はありたせん。



そしお、ディレクティブに進みたす。 それがどのように動䜜したすか



私たちは、結合を確認し、䜕ずかそれらを埗る埌でそれに぀いおの詳现を教えおくれず、単に新しいデザむナヌのためのコヌルを再、スナップ圌を䞎えるず店舗地図。 地図は、ディレクティブのむンスタンスぞのディレクティブのタむプngModelに切り替わりたす。



そしお、すべおこの怜玢ディレクティブは、このように動䜜したす我々は、最初にチェック芁玠自䜓のディレクティブを、それはディレクティブを持っおいるかどうかを取埗する方法がありたす。 そうでない堎合、私たちは芪に戻っお、そこに確認しおください。



これは、あなたが行うこずができたす最も単玔なものです。 私たち自身がこの方向で開発したした。 そしおそれは動䜜したす。



重芁な詳现結合。 バむンディングを衚瀺するには



ノヌド - あなたは、単に目暙を持っおいるバむンディング・クラスを䜜成したす。 圌らは、テキストノヌドになりたす。

私たちは、プロパティは、この堎合には、ノヌドの倀である目暙、これは倀を配眮する堎所です。 そしお、衚珟。



angular2コヌンパむラ䟝存結合



スナップは、このように動䜜したすたびにあなたが匏を評䟡するか、それがちょうど倉曎されたずき、あなたはタヌゲットに保管しおください。



- タヌゲットの曎新ず以前に栌玍された他の倀を最初にそれが倉曎された堎合は、匏を評䟡するそれはあなたが次のメ゜ッドを持぀こずができる、です。



angular2コヌンパむラ䟝存結合



我々は先に述べたこれらの䟋倖に぀いおは、 - 私たちは、評䟡パスをトラッキングするためのキャッチ方法を詊しおみおください呌び出したす。 䟋倖がトリガされるず、我々は再生成し、圌のために、行ず列の数のモデルを䜜成したす。



だから我々は、行ず゚ラヌが発生した列数を取埗したす。 それは我々がビュヌに関連するすべおです。 これが最埌のデヌタ構造です。



angular2コンパニラビュヌ



プレれンテヌション - このテンプレヌト芁玠。 我々は、゚ラヌコヌドを芋た堎合には、ある - 私たちはたくさんのアむデアが衚瀺されたす。 それはちょうどテンプレヌト芁玠です。 そしお、我々は衚珟でそれらを結合したす。 プレれンテヌションは、芁玠をngのずスキャンずチェックは、その結合がダヌティチェック方法ならびに結合、成分を指したす。



だから我々は最初のステヌゞを終えたした。 私たちは、新しいコンパむラを持っおいたす。 これたで我々は、高速のように ほずんど角床1.持っお良いず同じレベル。 より簡単なアプロヌチを䜿甚しお、我々は同じ速床を達成しおいたす。 しかし、角床1は遅いではありたせん。



第二段階





angular2コンパむラ䟝存性第二のステップ



どのように我々は、プロセスをスピヌドアップするこずができたすか 次のステップは䜕ですか 我々は芋逃しおいるずいうこず 正しくしたしょう。



私たちは、デヌタ構造に関係しおいる䜕かを必芁ずしおいたす。 それはデヌタ構造になるず、実際には、これは非垞に難しい質問です。 最埌に比范したずき、我々はのtry-catchがあるプログラムを曞いたが、私たちはそれを無芖した堎合、我々はゆっくりずしたプロセスダりン機胜の倚くが衚瀺され、ポむントの倚くのこずをあなたが最適化したいです。 あなたがプログラムのデヌタ構造の遅い仕事の理由を考える堎合、圌らはあなたのプログラムに散圚しおいるので、それは、非垞に難しい問題です。 これは、デヌタ構造のこずだ、ただの掚枬です。



我々は実隓を行い、理解しようずしたした。 地図の内偎のngElements我々は、これらのガむドラむンを芋たした。



angular2コンパむラ䟝存性第二のステップ



これは、DOMツリヌ内の各芁玠のために、我々は新しいマップを䜜成するこずが刀明したすか 䞀぀は、我々はそれらを䜜成しおいない、䜕の指針が存圚しないこずを蚀うこずができたす。 それでも、私たちは垞に、マップを䜜成ガむドラむンず読み出した情報ずそれを埋めたす。 これは無駄なこずができ、それはメモリをオヌバヌロヌドするこずができ、読み取りは、ただしばらくの間、あたりにもかかりたす。



別のアプロヌチは、さお、私たちは䞀぀の芁玠にのみ10ディレクティブを蚱可する」、ず蚀うこずかもしれたせん。 次は、私たちは、ディレクティブの芁玠ディレクティブず皮類のクラスinlinengElement 10プロパティを䜜成し、»なら、私たちは10条件文を䜜成しおいるディレクティブを芋぀けるこず。 それは高速ですか おそらく。



それは右、メモリリ゜ヌスを倧量に消費しないのですか



たずえば、むンストヌルあなたはプロパティではなく、マップを蚭定したす。 読み取りがあるため10の条件の少し遅いこずができたす。 これは、正確にはJavaScript VM甚に最適化された堎合、です。 JavaScriptのVMはあなたがあなたのレゞャヌでそれらをグヌグルこずができたす隠しクラスを䜜成するこずができたす。 これは、より高速なJavaScriptのVMを䜜成したす。 このデヌタ構造ぞの切り替え - これが加速するものです。 その埌、我々は、パフォヌマンステストの結果を芋おいきたす。 あなたが最適化デヌタ構造にするもう䞀぀ - 既存のコピヌの再利甚。



いく぀かのラむンが砎壊された堎合、もう䞀方は、なぜ、キャッシュ内のこれらの行をキャッシュや線が珟れるずすぐにデヌタを倉曎しないで、回埩 - あなたは論理的な質問を指定するこずができたすか だから我々はやりたした。 私たちは、提出の叀いコピヌを埩元する、いわゆるビュヌキャッシュを䜜成したした。



angular2コンパニラのビュヌキャッシシ



あなたは新しいプヌルに行く前に、状態を砎壊する必芁がありたす。 条件は、ディレクティブに含たれおいたす。 我々はすべおのディレクティブを殺すようにしたす。 プヌルから抜け出す方法がある堎合にさらに、あなたは、これらのディレクティブを再䜜成する必芁がありたす。 この方法では、氎和物ず脱氎を行いたす。 モデルで - すべおは、モデル、党䜓の状況から来おいるようDOMは、我々が保持しおいるノヌド。 我々だからずは、それを保ちたした。 ここでも、パフォヌマンステストを持っおいたした。



テスト環境



手動のJavaScriptコヌドずハヌドコヌディングされたずするプログラムです - あなたはこれらのテストの結果を理解するために、ベヌスラむンがあるこずに留意されたいです。 このようなプログラムは、任意のフレヌムワヌクで䜿甚されおいないで、プログラムは、ちょうどこの深いツリヌテストのために曞かれたした。 プログラムはdirtyCheckingを生産しおいたす。 私たちは、このプログラムナニットを匕き継ぎたした。 他のすべおの比率で比范されたす。 1の角床は、5.7のマヌクを受けたした。



angular2コンパニラのベンチマヌク



以前、我々は、最適化されたデヌタ構造ずし、ビュヌキャッシュなしで同じ速床を瀺したした。 私たちは、2.7のレベルにありたした。 だから、良い指暙です。 私たちは、による特性ぞの容易なアクセスに二回の速床を増加しおいたす。 最初に我々はここで我々の仕事が終わるず思いたした。



2段目の欠点



私たちは、これに基づいおアプリケヌションを䜜成したした。 しかし、その埌、私たちは欠点を芋たした



  1. 䞍良メモリずViewCacheの友人。 ク゚リ凊理ルヌトを切り替えお想像しおみおください。 それらがキャッシュされるので、あなたの叀い質問は、メモリ内に残るこずはないですか キャッシュからク゚リを削陀する際の質問はありたすか 実際には、これは非垞に難しい質問です。 あなたは、ナヌザヌがキャッシュ䜕かするかどうかを遞択できるようになるいく぀かの簡単な芁玠を、䜜成するこずができたす。 しかし、それは、少なくずも奇劙だろう。



  2. もう䞀぀の問題DOM芁玠が隠された状態を持っおいたす。 䟋えば、芁玠は、焊点に配眮されたす。 あなたが焊点に結合し、いない堎合でも項目が焊点にし、それから、それを削陀するか、たたはリタヌンがこのたたは他の芁玠のフォヌカスを倉曎するこずが䞡方にするこずができたす。 それに぀いお、私たちは考えおいたせんでした。 関連のバグがありたした。 あなたはこの道を行くこずができたす我々は完党に圌らの条件を削陀する項目を削陀し、さらにそれらを逆にするこずができたす。 私たちはDOMを再䜜成しなければならない堎合しかし、これは、ViewCache指暙を吊定するでしょう。 すべおの埌、我々は2.7の率を瀺したした。 我々は、このようなAの状況での速床に達しおきたように


第䞉段階



クラスビュヌ



次に考えたのは、私たちに起こった私たちは私たちのクラスビュヌで再び芋おみたしょう。 私たちは䜕がありたすか

これらは、すでに暩利、ngelementを最適化しおいる - 私たちは、コンポヌネントを持っおいたすか 私たちは、結合しおいたす。 しかし、クラスビュヌは、ただこれらの配列が含たれおいたす。 我々はたた、プロパティのみを䜿甚しおいたすInlineViewを䜜成できたすか いいえ配列ありたせん。 それは可胜ですか それはそう、刀明したした。



どのように芋えたすか 玄そう。



angular2コンパニラビュヌ



暡様



そこで、我々は、以前のように、テンプレヌトになり、すべおの芁玠のために、私たちはただ、曞き蟌みコヌドはよ。 このパタヌンのために、私たちは私たちのクラスのビュヌを衚瀺するコヌドを䜜成したす。各芁玠のコンストラクタヌで、document.createElementを呌び出したす。この芁玠はNode0プロパティに栌玍されたす。最初の芁玠では、2番目の芁玠では、再びnode1に栌玍されるdocument.createElementを呌び出したす。さらに、芁玠を芪にアタッチする必芁がある堎合、プロパティがありたすか正しい順序ですべおを行う必芁がありたす。このプロパティを䜿甚しお、以前の状態を参照できたす。これが、DOMで行うこずです。



angular2コンパむラテンプレヌト



ディレクティブディレクティブ



に぀いおも同様です。各むンスタンスのプロパティがありたす。繰り返しになりたすが、アクションの順序が正しいこずを確認する必芁がありたす。䟝存関係が最初に来おから、これらの䟝存関係を䜿甚するコンポヌネントです。たずngFormを䜿甚し、次にngModelを䜿甚したす。



バむンディング



次に、バむンディング。ダヌティチェックを行うコヌドを䜜成するだけです。匏を取埗し、JavaScriptに倉換したす。この堎合、this.component user.nameになりたす。これは、コンポヌネントからuser.nameを取埗し、それをプロパティでもある以前の倀ず比范するこずを意味したす。倀が倉曎された堎合、テキストノヌドを曎新したす。最埌に、すべおをデヌタ構造の衚珟に瞮小したす。プロパティのみがありたす。プロパティを介したクむックアクセスが䜿甚されるすべおの堎所に、Mapずいう配列はありたせん。



これにより、プロセスが倧幅に高速化されたす。すぐにこれを芋るこずができるように数字を衚瀺したす。



問題は、これをどのように行うかです。



誰かがこの新しいクラスを評䟡する文字列を䜜成する必芁があるずしたしょう。これはどのように行われたすか珟圚の実装では、実装101で行ったこずをそのたた適甚したす。



䞀番䞋の行は次のずおりです。以前にDOMノヌドを䜜成した堎合、DOMノヌドを䜜成するコヌドを䜜成しおいたす。芁玠を比范するために䜿甚した堎合、芁玠を比范するコヌドを䜜成しおいたす。最埌に、ディレクティブむンスタンスたたはDOMノヌドを参照しおいた堎合、ディレクティブむンスタンスずDOMノヌドが保存されおいる堎所にプロパティを保存したす。この堎合、コヌドは次のようになりたす。



最初のステップでのangular2コンパむラの違い



以前はngelementがありたしたが、compileElementができたした。実際、これらのクラスは珟圚コンパむラに存圚しおいたす。 compileElement、compileViewなどがありたす。



衚瀺は次のようになりたす。DOM芁玠を取埗する前は、DOM芁玠が栌玍されおいるプロパティしかありたせん。以前はdocument.createElementを呌び出しおいたしたが、この新しい文字列補間を䜿甚しお行を䜜成しおいたす。これは、this.document +そのプロパティ名がADDずいう名前のdocument.createElementず等しいずいうコヌドを䜜成するのに最適です。



最埌に、以前にappendChildを呌び出した堎合、子を芪にアタッチするコヌドを䜜成しおいたす。ディレクティブの䟝存関係の怜玢でも同じこずが起こりたす。すべおが同じアルゎリズムに埓っお行われたすが、珟圚はこれらの目的のためにのみコヌドを䜜成しおいたす。



angular2コンパむラヌの違いのベンチマヌク



むンゞケヌタヌを芋るず、速床が倧幅に向䞊しおいるこずがわかりたす。以前のむンゞケヌタヌが2.7だった堎合、1.5になりたした。ほが2倍の速床です。それでも、ViewCacheは少し高速のたたです。しかし、私たちはそれを䜿甚するオプションを排陀し、あなたはすでに私たちの決定の理由を知っおいたす。私たちは玠晎らしい仕事をし、すでに終わっおいたかもしれたせん。しかし、ありたせん。



動的ゞャストむンタむムコンパむル



それでは、最初に動的ゞャストむンタむムコンパむルに぀いお説明したした。動的-これは、ブラりザヌでコンパむルするこずを意味したす。



angular2コンパむラjit



これは次のように機胜するこずを思い出しおください。サヌバヌ䞊に受信デヌタがありたす。ブラりザはそれらをロヌドしお遞択し、すべおを分析しお、元のビュヌクラスを䜜成したす。次に、別のクラスを取埗するためにこの゜ヌスコヌドを評䟡する必芁がありたす。その埌、このクラスを䜜成し、動䜜するアプリケヌションを取埗できたす。この郚分には特定の問題がありたす。



  1. , . - , , . . , . , . .



  2. – , , Angular . , , .



  3. – eval. eval , - - . eval, , .

    (, — eval )



  4. , (, ). , , . , Angular . これはあたり良くありたせん。



  5. , , . ( , , ), - , :



    1. -, , , , .
    2. -, . , , . Closure ( « »), Google .


そのため、コンパむラの実行䞭に改善された瞮小を䜿甚するず、これが起こりたす。



マヌクアップのコンポヌネントがブラりザに読み蟌たれ、ブラりザがテンプレヌトを解析しおビュヌクラスを䜜成したす。これたでのずころ、すべおが順調に進んでいたす。ブラりザはuser.nameを䜿甚し、コンポヌネントにはuser.nameも含たれたす。このuser.nameのみが高床な瞮小技術を䜿甚しお瞮小されたす。したがっお、コンポヌネントはC1などず呌ばれ、ナヌザヌは突然Uになり、名前はNになりたす。問題は、ミニファむダがテンプレヌトを認識しおいないこずです。実際、user.nameはただテンプレヌトにありたす。



そのため、テンプレヌトが実行され、user.nameが䜜成されたすが、これはコンポヌネントには存圚したせん。この問題には特定の解決策がありたす。このプロパティを瞮小する必芁がないこずをコンポヌネントに䌝えるこずができたす。しかし、それは私たちが必芁ずするものではありたせん。このプロパティを瞮小できる必芁がありたすが、これはオンラむンでのコンパむルおよび評䟡では機胜したせん。



静的先行コンパむル



この理由から、次のステップは静的先行コンパむルの出珟でした。圌女は次のように働いおいたす。



angular2コンパむラaot

この堎合も、サヌバヌで解析される入力があり、ビュヌクラスもサヌバヌで䜜成されたす。



次に、ブラりザはそれらを取埗し、通垞のスクリプトテキストのように通垞のJavaScriptコヌドをロヌドするようにロヌドし、必芁な芁玠を䜜成したす。



このコンパむル方法は玠晎らしいです。なぜなら、分析はサヌバヌ䞊で行われしたがっお、迅速に行われる、コンパむラヌをブラりザヌに転送する必芁がないからですこれも玠晎らしいこずです。たた、これはスクリプトであるため、評䟡を䜿甚しなくなりたした。したがっお、このようなコンパむルはどのブラりザヌにも適しおいたす。



たた、静的なコンパむルは、サヌバヌ䞊にビュヌクラスを䜜成し、ミニファむダを実行するず、ビュヌクラスもミニファむできるため、ミニファむの改善に最適です。ミニファむダが仕事を終えたので、クラスの名前が倉曎されたプロパティを取埗したす。



玠晎らしい、今改善された瞮小を䜿甚できたす。したがっお、速床むンゞケヌタはさらに䜎䞋しおいたす。



静的コンパむルの欠点したがっお、静的コンパむルができたした



。これですべおうたくいきたしたよねしかし、い぀ものように、欠点がありたす。最初の問題は、静的コンパむルを䜿甚しお別のコヌドを䜜成する必芁があるこずです。



ブラりザヌで評䟡するには、ES5暙準に埓っおコヌドを䜜成する必芁がありたす。ロヌカル倉数を䜿甚するコヌド、たたは関数に枡される匕数を受け取るコヌドを䜜成しおいたす。require.jsなどを䜿甚しおいたせん。



コヌドはサヌバヌで生成されるため、次の2぀の理由でTypeScriptコヌドを生成する必芁がありたした。





angular2コンパむラのaot出力



ES6 2016のサポヌトをどのように提䟛したしたか



実際、コンパむラヌに粟通しおいる堎合、共通のパタヌンがありたす。文字列を䜜成する代わりに、出力に䌌たデヌタ構造が䜜成されたすが、このデヌタ構造このADDは異なる出力デヌタにシリアル化できたす。



ASDには、倉数宣蚀、メ゜ッド呌び出しなどの機胜に加えお、タむプが含たれおいたす。次に、ES5の堎合は型なしですべおシリアル化し、TypeScriptの堎合は型でシリアル化したす。



次のようになりたす宣蚀された倉数内で生成されたASD出力declare var name ELを指定したす。これにより、TypeScriptで倉数コヌドが䜜成され、タむプが䜜成されたす。 ES5では、タむプは省略されたす。



次に、メ゜ッドを呌び出すこずができたす。たず、ドキュメント倉数を読み取りたすグロヌバル倉数であるため。そしお、圌女のために、これらの匕数でcreateElementメ゜ッドを呌び出すこずができたす。



文字列を解析する堎合は、文字列を正しく゚スケヌプする必芁があるため、リテラルを倀「div」で配眮したした。倀には匕甚笊が含たれおいる可胜性があるため、コヌドを読み取るずきに゚スケヌプする必芁がある堎合はスキップしおください。したがっお、この方法でそれを行うこずができたす。良いニュヌスは、生成されたコヌドがサヌバヌずブラりザヌの䞡方で同じように芋えるこずです。異なるコヌドはありたせん。



静的コンパむラの開発䞭に発生した2番目の問題は、メタデヌタの割り圓おです。このコヌドを芋おください。



angular2コンパむラヌaotデコレヌタヌ



このコヌドの問題は䜕ですかCookieに䟝存するある皮のディレクティブがあり、Cookieがある堎合、ディレクティブは別のこずをするずしたす。動䜜したす。コンパむルできたす。玠晎らしい。



しかし、これは静的コンパむルでは機胜したせん。あなたがそれに぀いお考えるなら、なぜですかこれらすべおをES5のレベルに䞋げるず、たさにそのようなコヌドが埗られたす。



デコレヌタは最終的に䜕をしたすかメタデヌタのコンストラクタにプロパティを远加したす。最埌に、圌は単にSomeDirにメモを远加したす。



問題は、サヌバヌでこれを実行するず機胜しないこずです。結局のずころ、サヌバヌ䞊にドキュメントはありたせん。どうする



サヌバヌ䞊にブラりザ環境を構築し、ドキュメント倉数、りィンドり倉数などを宣蚀するこずを提案できたす。これは機胜する堎合もありたすが、ほずんどの堎合機胜したせん。 2番目の方法珟圚、ASDに粟通しおいたすかASDを凊理し、コヌドを評䟡せずにASDからメタデヌタを削陀したす。 ASDでは、䜕らかの圢で衚珟できたす。



angular2コンパむラヌaotデコレヌタヌ



したがっお、ADD SomeDirクラスには、呌び出す芁玠を参照するdecoratorsプロパティがありたすこれは、ディレクティブず匕数が定矩されおいる匏です。次のこずが起こりたす。メタデヌタをJSONファむルに取り蟌み、静的コンパむラヌがこれらのファむルを取埗しお、それらからテンプレヌトを䜜成したす。明らかに、制限がありたす。 JavaScriptコヌドを盎接評䟡するこずはありたせんので、ブラりザで慣れおいるこずをすべお行うこずはできたせん。



そのため、私たちの静的コンパむラは私たちを制限したすが、あなたはメモを眮くこずができたす。ただし、䞊蚘の方法を䜿甚する堎合、これはすべおの堎合に機胜したす。



さお、もう䞀床パフォヌマンステストに぀いお説明したしょう。



angular2コンパむラAOTベンチマヌク



これは私たちが曞いた簡単なプログラムです。たた、読み蟌み時間が倧幅に短瞮されたした。これは、分析を行わなくなったためであり、Angular 2コンパむラがロヌドされなくなったためです。ほが3倍高速です。サむズは、すでにgzip圢匏で瞮小された144キロバむトから49に瞮小されたした。比范のために、瞮小が改善されたReactラむブラリの重量は46 kbになりたした。



次に、いく぀かの実䟋を瀺したす



。Angularコンポヌネントがあるずしたす。ngFormずngModelがありたす。 ngModelには、䟝存関係ずしおngFormがありたす。



angular2コンパむラヌの䟋



ここにNGCを远加したす-メタデヌタを匕き出しおサポヌトするずき、これらのモゞュヌルはTypeScriptに䟝存するため、これらはTypeScriptコンパむラにたたがる_nodeモゞュヌルです。生成されたコヌドを芋るず、非垞に銎染みがあるこずがわかりたす。 user.nameがありたす。倀が倉曎された堎合、ディレクティブ入力を曎新したす。前の倀ず比范しお蚭定するだけです。



これには良い面がありたす。テンプレヌトでuser.nameをwrongNameに倉曎するずしたす。テンプレヌトは、ナヌザヌではなくuser.nameを参照したす。 wrongName。生成されたコヌドを芋るず、TypeScriptぱラヌをスロヌしたす。



angular2 compiler example generated code



これらの衚珟にはコンポヌネントのタむプに基づいたタむプがあるためです。そしお今、それらをコンパむルするず、TypeScriptを䜿甚したずいう理由だけで、コヌドに゚ラヌが芋぀かりたす。他に䜕も必芁ありたせんでした。



うたくいきたしたが、さらに良くなるよう努力しおいたす。



私たちの目暙は、10 kb gzipのサむズを達成するこずです。プロトタむプの䞀郚のサむズは25 kbであり、コンパむラヌをさらに小さくする方法に぀いおいく぀かのアむデアがありたす。次に、ベヌスラむンの開始点よりもさらに速くなりたいです。これは制限ではないこずを認識しおおり、ベヌスラむンよりもさらに速くなる可胜性がありたす。



倉曎はありたせん。倉曎を行い、異なるコヌドを生成したす。唯䞀のこず-速床の違いのみが衚瀺されたす。



結論ずしお



パフォヌマンス、パフォヌマンスのさたざたな偎面に぀いお話したした。

入力に぀いお説明したした。

分析ずは䜕か、ASDASTを孊びたした。テンプレヌトを衚瀺する方法ず実装方法に぀いお説明したした。

document.createElementは、Angularフレヌムワヌクに最適であるこずを孊びたした。

プロパティず非衚瀺クラスによる迅速なアクセスは、コヌドを最適化するための優れたツヌルであるこずを孊びたした。

コヌド生成評䟡が正しく行われた堎合、぀たり、評䟡の助けだけでなく、オフラむンサポヌト、ASDの掟生もが玠晎らしい匷力なものであるこずを孊びたした。これは、隠しクラスを生成するのに圹立ちたす。

静的Ahead Of Timeおよび動的Just In Timeコンパむル、および最適化できるものに぀いお説明したした。

そしお最埌に、良い䟋を芋おみたした。スラむドに私のプレれンテヌションぞのリンクがありたす。



ご枅聎ありがずうございたした。



玠材リンク
— Angular 2 — How it works

— Angular2 Compiler — Tobias Bosch

— Twitter Account — Tobias Bosch



All Articles