136 votes

Compilation Just-in-Time (JiT) ou Ahead-of-Time (AoT) dans Angular

Je faisais référence cette documentation et je suis tombé sur le concept de compilation. On peut utiliser la compilation JIT ou AOT. Cependant, je l'ai trouvé très bref et j'ai besoin de connaître les points suivants en détail,

  • Différences entre ces deux techniques
  • Recommandation sur le moment où il faut utiliser quoi

169voto

Benyamin Shoham Points 1171

JIT - Compile TypeScript juste à temps pour l'exécuter.

  • Compilé dans le navigateur.
  • Chaque fichier est compilé séparément.
  • Il n'est pas nécessaire de construire après avoir modifié votre code et avant de recharger la page du navigateur.
  • Convient au développement local.

AOT - Compiler TypeScript pendant la phase de construction.

  • Compilé par la machine elle-même, via la ligne de commande (plus rapide).
  • Tous les codes sont compilés ensemble et les scripts contiennent du HTML/CSS.
  • Pas besoin de déployer le compilateur (la moitié de la taille d'Angular).
  • Plus sécurisé, source originale non divulguée.
  • Convient pour les constructions de production.

2 votes

Par ailleurs, j'ai constaté que les performances étaient très médiocres lors de l'utilisation de la compilation Just-in-Time, notamment sur les anciens appareils Android. De plus, l'écart de rendu au premier chargement de la page est beaucoup plus important (sur les anciens appareils Android, jusqu'à 10 secondes, selon la taille du projet).

42 votes

Le typecript n'est pas compilé juste à temps, le navigateur ne peut pas le faire. Dans les deux cas, le typecript est compilé pendant le processus de construction.

2 votes

@Robouste : C'est exactement ce qui me perturbe.. Ce qui est vraiment compilé à l'avance et juste à temps... (si TJS est compilé immédiatement). Lorsque je demande une page dans l'explorateur, le javascript sera téléchargé et exécuté dans le navigateur, Est-ce que l'un des JS tapés doit venir dans le navigateur ? ?? non, pas du tout...Alors qu'est-ce qui est compilé à l'avance et juste à temps.. ?? C'est en fait le compilateur angulaire qui est visé. ce lien répondra à toutes les questions : " angular.io/guide/aot-compiler "

82voto

Shashank Vivek Points 3858

Bien qu'il y ait quelques réponses, je voudrais aussi ajouter certaines de mes conclusions, car J'ai été vraiment confus avec ce qui a été compilé. comme dans tous les cas, TS --> JS la conversion se produit. Je prends un peu de para de Le blog de Jeff comme référence.

JIT

Le site TS le code écrit par le développeur est compilé en JS code. Maintenant, ce code compilé js Le code est à nouveau compilé par le navigateur afin que le html peuvent être rendus de manière dynamique en fonction de l'action de l'utilisateur et les codes correspondants pour les angular ( pour les composants, la détection des changements, l'injection de dépendances) sont également générés au moment de l'exécution.

(Le compilateur du navigateur est ce qui prend les directives et les composants d'une application, ainsi que leur HTML et CSS correspondants, et crée des usines de composants pour estampiller rapidement les instances avec toute leur logique de création de vues).

Lorsqu'une application Angular 2 est amorcée dans le navigateur, le compilateur JIT effectue un travail considérable pour analyser les composants de l'application au moment de l'exécution et générer du code en mémoire. Lorsque la page est rafraîchie, tout le travail qui a été effectué est jeté et le compilateur JIT recommence tout le travail.

AOT

Le site TS le code écrit par le développeur est compilé en JS code, ce js a déjà été compilé pour angular également . Maintenant, cette compilé js Le code est à nouveau compilé par le navigateur afin que le html peut être rendu. Mais, Le problème ici est que les caractéristiques de angular ont déjà été prises en charge par AOT Le compilateur et donc le navigateur n'ont pas à s'inquiéter beaucoup. sur la création de composants, la détection des changements, l'injection de dépendances. Donc, nous avons :

Rendu plus rapide

Avec l'AOT, le navigateur télécharge une version précompilée de l'application. Le navigateur charge le code exécutable afin de pouvoir rendre l'application immédiatement, sans attendre la compilation préalable de l'application.

Moins de demandes asynchrones

Le compilateur intègre les modèles HTML externes et les feuilles de style CSS dans le JavaScript de l'application, éliminant ainsi les requêtes ajax distinctes pour ces fichiers sources.

Réduction de la taille de téléchargement du framework Angular

Il n'est pas nécessaire de télécharger le compilateur Angular si l'application est déjà compilée. Le compilateur représente environ la moitié d'Angular lui-même, de sorte que son omission réduit considérablement la charge utile de l'application.

Détecter plus tôt les erreurs de modèle

Le compilateur AOT détecte et signale les erreurs de liaison des modèles pendant l'étape de construction, avant que les utilisateurs ne puissent les voir.

Une meilleure sécurité

AOT compile les modèles et les composants HTML en fichiers JavaScript bien avant qu'ils ne soient servis au client. Comme il n'y a pas de modèles à lire et qu'il n'y a pas d'évaluation risquée du HTML ou du JavaScript côté client, il y a moins de possibilités d'attaques par injection.


Les différences restantes sont déjà couvertes par les points de Benyamin, Nisar et Gaurang.

N'hésitez pas à me corriger

6 votes

Merci. Je comprends enfin après avoir lu votre réponse et j'en ai lu beaucoup.

1 votes

Tout simplement expliqué :)

27voto

Gaurang Patel Points 1652

Benyamin et Nisar ont mentionné quelques bons points ici. Je vais les compléter.

Bien que théoriquement, l'AOT semble être une option plus attrayante que le JIT pour la production, j'avais des doutes sur le fait que l'AOT en vaille vraiment la peine !

Eh bien, j'ai trouvé de belles statistiques par Jeff Cross et cela prouve que l'AOT réduit considérablement le temps de démarrage de l'application. Le cliché ci-dessous, tiré de l'article de Jeff Cross, vous en donnera une idée rapide,

enter image description here

23voto

vivekkurien Points 366

Compilation JiT (Just in Time)

Le nom lui-même décrit le fonctionnement, il compile le code juste au moment du chargement de la page dans le navigateur. Le navigateur va télécharger le compilateur, construire le code de l'application et le rendre.

Il sera bon pour l'environnement de développement.

Compilation AoT (Ahead of Time)

Il compile tout le code au moment de la construction de l'application. Le navigateur ne veut donc pas télécharger le compilateur et compiler le code. Avec cette méthode, le navigateur peut facilement rendre l'application en chargeant simplement le code déjà compilé.

Peut être utilisé dans l'environnement de production

Nous pouvons comparer la compilation de JiT et AoT comme ci-dessous

enter image description here

1 votes

Cela signifie-t-il que l'application JiT se charge plus rapidement la première fois, mais qu'ensuite l'application AoT se charge toujours plus rapidement ?

0 votes

Jamais. JiT se charge plus lentement que AoT

0 votes

AOT est plus lent que JIT car il ne compile pas au moment de l'exécution. Vous devez changer les titres de JIT et d'AOT.

3voto

mercy Points 125

J'ai trouvé une bonne explication ici

TLDR ;

Essentiellement, nous compilons le code deux fois avec les applications angular2, une fois lorsque nous convertissons TS en JS et ensuite lorsque le navigateur convertit JS en binaire.

Si nous ne pouvons pas contrôler ce dernier point, nous pouvons en revanche contrôler le moment où la compilation de TS en JS est effectuée.

Avec angular2, si vous optez pour JIT (ce qui est le cas par défaut), les deux compilations ont lieu après le chargement du code dans le navigateur (c'est-à-dire TS -> JS -> binaire). Non seulement la compilation TS -> JS à la volée dans le navigateur représente une surcharge supplémentaire, mais en plus, le compilateur angular2 fait presque la moitié de la taille du paquet angular2, donc si nous évitons cela, nous pouvons réduire la taille de la charge utile de manière significative.

AOT précompile le code TS en JS, réduisant le temps de compilation ainsi que la taille du code, en supprimant le besoin du compilateur angulaire qui représente 50% du code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X