Компіляція Just-in-Time (JiT) vs Ahead-of-Time (AoT) у Angular


111

Я посилався на цю документацію і натрапив на концепцію компіляції. Можна використовувати або компіляцію JIT або AOT. Однак я вважаю це дуже коротким і мені потрібно знати деталі наступні моменти,

  • Відмінності між цими двома методиками
  • Рекомендація про те, коли використовувати що

Відповіді:


148

JIT - Складіть TypeScript вчасно для його виконання.

  • Складено в браузері.
  • Кожен файл складається окремо.
  • Не потрібно будувати після зміни коду та перед перезавантаженням сторінки браузера.
  • Підходить для місцевого розвитку.

AOT - компілюйте TypeScript під час фази збірки.

  • Скомпілюється самою машиною, за допомогою командного рядка (Швидше).
  • Весь код, складений разом, вбудовуючи HTML / CSS у сценарії.
  • Не потрібно розгортати компілятор (половина кутового розміру).
  • Більш безпечне оригінальне джерело не розголошується.
  • Підходить для виробничих будівель.

2
Також я відчував дуже низьку ефективність під час використання компіляції Just-in-Time, особливо на старих пристроях Android. Крім того, розрив візуалізації на завантаженні на першій сторінці набагато більший (на старих пристроях Android до 10 секунд залежно від розміру вашого проекту).
Фелікс Хагспіель

29
Машинопис не скомпільований вчасно, браузер не може це зробити. В обох випадках машинопис складається під час збирання.
Robouste

2
@Robouste: Це саме те, що мене бентежить .. Що насправді компілюється достроково і точно вчасно .. (якщо TJS складається відразу). Коли я запитую сторінку в провіднику, javascript буде завантажений і виконаний у браузері. Чи потрібно вводити будь-який із набраних JJ до браузера ??? ні, зовсім не ... Отже, що складається достроково і просто вчасно .. ?? Насправді мається на увазі кутовий компілятор. ця посилання буде відповідати на всі питання: « angular.io/guide/aot-compiler »
Assil

2
Я не фахівець, але при використанні JIT, кутові джерела надсилаються до браузера, і він скомпілює програму. Це дозволяє мати динамічний матеріал, який потрібно компілювати під час виконання. З AOT все попередньо компілюється, тому сервер надсилає загальний веб-сайт JavaScript. Ви отримуєте швидкість виконання та менший час завантаження.
Robouste

чудова відповідь, коментарі також корисні для мене.
Ракшит Шах

61

Хоча є відповіді, але я також хотів би додати деякі свої висновки, тому що я був справді плутаний з тим, що насправді складається, як і у всіх випадках, TS-> JSвідбувається конверсія. Я беру деякий пункт із блогу Джеффа як довідник.

JIT

TSКод , написаний розробником компілюється в JSкод. Тепер цей скомпільований jsкод знову компілюється браузером, щоб його htmlможна було динамічно відображати відповідно до дії користувача, і відповідно коди angular (для компонентів, виявлення змін, введення залежності) також створюються під час виконання.

(Компілятор браузера - це те, що приймає директиви та компоненти програми разом з відповідними HTML та CSS та створює фабрики компонентів для швидкого відмітки екземплярів усією їх логікою створення перегляду.)

Коли додаток Angular 2 завантажується в браузері, компілятор JIT виконує багато роботи для аналізу компонентів у програмі під час виконання та генерування коду в пам'яті. Коли сторінка оновлюється, вся виконана робота викидається, а компілятор JIT виконує цю роботу знову.

AOT

TSКод , написаний розробником компілюється в JSкод, це js вже скомпільовані для кутових і . Тепер цей скомпільований js код знову збирається браузером, щоб htmlможна було винести. Але суть тут полягає в тому, що компілятором angularвже подбали про особливості, AOTа отже, браузеру не потрібно переживати над створенням компонентів, виявленням змін, введенням залежності. Отже, у нас є:

Швидше відображення

За допомогою AOT браузер завантажує попередньо складену версію програми. Браузер завантажує виконуваний код, щоб він міг оновлювати додаток негайно, не чекаючи спочатку складати додаток.

Менше асинхронних запитів

Компілятор окреслює зовнішні шаблони HTML та таблиці стилів CSS у програмі JavaScript, виключаючи окремі запити ajax для цих вихідних файлів.

Менший розмір завантаження з кутовою рамкою

Немає потреби завантажувати компілятор Angular, якщо додаток уже складено. Компілятор становить приблизно половину кутового самого по собі, тому його опускання різко зменшує навантаження на додаток.

Виявити помилки шаблону раніше

Компілятор AOT виявляє та повідомляє про помилки прив'язки шаблону під час кроку збирання, перш ніж користувачі зможуть їх побачити.

Краща безпека

AOT збирає HTML-шаблони та компоненти у файли JavaScript задовго до їх обслуговування клієнту. Без шаблонів для читання і без ризикованої оцінки клієнтів на HTML або JavaScript, існує менше можливостей для ін'єкційних атак.


Залишилися відмінності вже висвітлюються у пунктах кулі Benyamin, Nisar & Gaurang.

Ви можете мене виправити


5
Дякую. Нарешті я розумію, прочитавши вашу відповідь, і я прочитав їх багато.
Маріо Суботич

24

Бенямін та Нісар згадували тут кілька хороших моментів. Я додам до нього.

Хоча теоретично, AOT виглядає привабливішим варіантом, ніж JIT для виробничих цілей, але я сумнівався, чи дійсно AOT того вартий!

Ну, я знайшов хорошу статистику Джеффа Кроса, і це доводить, що AOT значно скорочує час завантаження програми. Нижче опубліковано повідомлення від Джеффа Кроса, яке дасть вам швидке уявлення про це,

введіть тут опис зображення


19

Складання JiT (щойно)

Сама назва описує працюючий, Він збирає код саме в момент завантаження сторінки в браузер. Браузер завантажить компілятор і створить код програми та виведе його.

Це буде добре для середовища розвитку.

Компіляція AoT (попереду часу)

Він компілює весь код на момент складання програми. Тому браузер не хоче завантажувати компілятор і компілювати код. У цьому способі браузер може легко надати програму, просто завантаживши вже складений код.

Може використовуватися у виробничих умовах

Ми можемо порівняти компіляцію JiT і AoT, як показано нижче

введіть тут опис зображення


1
Чи означає це, що програма JiT завантажується швидше з першого разу, але після цього програма AoT завжди завантажуватиметься швидше?
JKL

Ніколи. JiT завантажується повільніше, ніж
AoT

AOT повільніше, ніж JIT, тому що він не виконує під час виконання. ви повинні змінити назви jit і aot
Mr.AF

17

JIT (щомісячна компіляція)

Just-in-Time (JIT) - це тип компіляції, який збирає вашу програму в браузері під час виконання.

ng build
ng serve

введіть тут опис зображення

AOT (попередня компіляція)

Попередньо (AOT) - це тип компіляції, який компілює ваш додаток під час створення.

ng build --aot
ng serve --aot

введіть тут опис зображення


2
яка різниця між цими 2 фігурами? чи не потрібно це вступ?
Mr.AF

Так що в основному Попереду часу більше схоже на Попереду Час виконання.
Аліреза Кахаї

@ Mr.AF щойно помітив, що і зараз зображення однакові.
Tiago Martins Peres

14

Наприкінці дня AOT (попереду) та JIT (Just-in-Time) роблять те саме. Вони обидва компілюють ваш кутовий код, щоб він міг працювати у рідному середовищі (він же браузер). Ключова відмінність - коли відбувається компіляція. За допомогою AOT ваш код складається перед завантаженням програми в браузері. За допомогою JIT ваш код збирається під час виконання в браузері.

Ось порівняння: введіть тут опис зображення

Переваги AOT:

  • Швидше запуск, оскільки розбір і компіляція не відбувається в браузері.
  • Шаблони перевіряються під час розробки (а це означає, що всі помилки, які ми бачимо на консолі javascript у запущених додатках, інакше будуть кинуті в процесі збирання).
  • Менший розмір файлу як невикористаних функцій може бути знятий, а сам компілятор не поставляється.

4

Насправді є лише один кутовий компілятор. Різниця між AOT та JIT - це питання часу та інструментарію. З AOT компілятор запускається один раз у час збирання, використовуючи один набір бібліотек; З JIT він працює щоразу для кожного користувача під час виконання, використовуючи інший набір бібліотек.


2

Компілятор JIT ми використовуємо під час розробки кутового проекту. У цій компіляції (перетворення TS в JS) відбувається під час виконання програми. Якщо AOT використовується під час складання коду програми для розгортання програми у виробництві, тоді ми будуємо наш код програми за допомогою команди ng build --prod, яка створює папку під назвою webpack, webpack містить пакет усіх файлів (HTML , CSS та машинопис) у стисненому форматі JavaScript.

Розмір папки webpack, створеної для виробництва, набагато менший, ніж папка, створена для середовища розробки (за допомогою команди ... ng build), оскільки вона не містить компілятора всередині папки webpack, це покращує продуктивність програми .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.