私は このドキュメント を参照していて、コンパイルの概念に出くわしました。 JITまたはAOTコンパイルを使用できます。しかし、私はそれが非常に簡潔であり、詳細に次の点を知っている必要があると思いました、
JIT - TypeScriptを実行するのに間に合うようにコンパイルする。
AOT - ビルドフェーズ中にTypeScriptをコンパイルします。
いくつかの答えがありますが、私も私の調査結果のいくつかを追加したいと思います、なぜなら私は実際にコンパイルされているものと本当に混乱していたすべての場合と同様に、TS
- > JS
変換が行われます。参考として、 Jeff's blog からパラを取っています。
開発者によって書かれたTS
コードはJS
コードにコンパイルされます。現在、このコンパイルされたjs
コードはブラウザによって再度コンパイルされるので、html
はユーザーの操作に従って動的にレンダリングされ、それに応じてangular
(コンポーネントの場合は変更検出、依存性注入)のコードも実行時に生成されます。
(ブラウザコンパイラは、アプリケーションのディレクティブとコンポーネント、およびそれらに対応するHTMLとCSSを受け取り、すべてのビュー作成ロジックでインスタンスをすばやく削除するためのコンポーネントファクトリを作成します。)
Angular 2アプリケーションがブラウザでブートストラップされると、JITコンパイラは実行時にアプリケーション内のコンポーネントを分析してメモリ内にコードを生成するために多くの作業を実行します。ページが更新されると、行われた作業はすべて破棄され、JITコンパイラーはその作業を最初からやり直します。
開発者によって書かれたTS
コードはJS
コードにコンパイルされます、このjs
はすでにangle用にもコンパイルされています。さて、このコンパイルされたjs
コードは再びブラウザによってコンパイルされるので、html
をレンダリングすることができます。しかし、angular
の機能はAOT
コンパイラによって既に注意が払われているため、ブラウザはあまり気にする必要はありませんコンポーネントの作成、変更の検出、依存性注入について。だから、我々は持っています:
より速いレンダリング
AOTでは、ブラウザはコンパイル済みのアプリケーションをダウンロードします。ブラウザは実行可能コードをロードするので、最初にアプリケーションをコンパイルするのを待たずにアプリケーションをすぐにレンダリングできます。
非同期要求が少ない
コンパイラは外部のHTMLテンプレートとCSSスタイルシートをアプリケーションのJavaScript内にインライン化し、それらのソースファイルに対する別々のajaxリクエストを排除します。
小さいAngularフレームワークのダウンロードサイズ
アプリがすでにコンパイルされている場合は、Angularコンパイラをダウンロードする必要はありません。コンパイラはAngularのほぼ半分なので、これを省略するとアプリケーションのペイロードが大幅に減少します。
テンプレートエラーを早期に検出する
AOTコンパイラは、ビルドステップ中にユーザーが表示される前にテンプレートバインディングエラーを検出して報告します。
より良いセキュリティ
AOTは、HTMLテンプレートとコンポーネントがクライアントに提供されるずっと前からJavaScriptファイルにコンパイルします。読み取るテンプレートがなく、危険なクライアントサイドのHTMLまたはJavaScriptの評価もないため、インジェクション攻撃の機会が少なくなります。
残りの違いは、Benyamin、Nisar、Gaurangの箇条書きで既に説明されています。
気軽に私を直してください
BenyaminとNisarはここでいくつかの良い点を述べました。追加します。
理論的には、AOTは生産目的のためにJITよりも魅力的な選択肢に見えますが、私はAOTが本当に価値があるかどうか私には疑いがありました!
そうですね、私は Jeff Crossによる素晴らしい統計 を見つけました、そしてそれはAOTがアプリのブートストラップ時間を大幅に減らすことを証明します。下記のJeff Crossの記事から抜粋すると、それについての素早いアイデアがわかります。
JiT(ジャストインタイム)コンパイル
名前自体は動作を説明しています、それはちょうどブラウザでページをロードする時にコードをコンパイルします。ブラウザはコンパイラをダウンロードし、アプリケーションコードをビルドしてレンダリングします。
開発環境にはいいでしょう。
AoT(Ahead of Time)コンパイル
アプリケーション構築時にすべてのコードをコンパイルします。そのため、ブラウザはコンパイラをダウンロードしてコードをコンパイルしたくありません。この方法では、ブラウザはすでにコンパイルされたコードをロードするだけで簡単にアプリケーションをレンダリングできます。
実稼働環境で使用できます
JiTとAoTのコンパイルを以下のように比較できます
実際にはAngularコンパイラは1つだけです。 AOTとJITの違いは、タイミングとツーリングの問題です。 AOTでは、コンパイラは1組のライブラリを使用してビルド時に1回実行します。 JITでは、実行時にすべてのユーザーに対して異なるライブラリセットを使用して毎回実行されます。
かなり良い説明を見つけました ここ..
TLDR;
基本的には、angle2アプリでコードを2回コンパイルします。1回はTSからJSに変換し、次にブラウザはJSをバイナリに変換します。
後者は制御できませんが、TSからJSへのコンパイルがいつ実行されるかを制御できます。
Angular2では、JIT(デフォルト)を使用すると、コードがブラウザにロードされた後(つまりTS - > JS - > binary)に両方のコンパイルが行われます。 TS - > JSコンパイルをブラウザ上でオンザフライで実行することは、追加のオーバーヘッドであるだけでなく、Angular 2コンパイラは、Angular 2パッケージのほぼ半分のサイズであるため、これを回避すれば、サイズを削減できます。大幅にペイロード。
AOTはTSコードをJSに先入れして、コードの50%を占める角度付きコンパイラーの必要性をなくすことによって、コンパイル時間とコードのサイズを削減します
その日の終わりには、AOT(Ahead-of-Time)とJIT(Just-in-Time)が同じことを行います。どちらもAngularコードをコンパイルして、ネイティブ環境(別名ブラウザ)で実行できるようにします。主な違いはコンパイルが行われるときです。 AOTでは、Appがブラウザにダウンロードされる前にコードがコンパイルされます。 JITを使用すると、コードは実行時にブラウザでコンパイルされます。
AOTの利点: