Angular — Что такое AOT и JIT-компиляция и как это работает?

Angular — популярный веб-фреймворк с открытым исходным кодом, используемый для создания современных, динамичных и масштабируемых веб-приложений. При разработке приложения Angular доступны два основных режима компиляции: компиляция с опережением времени (AOT) и компиляция Just-in-Time (JIT). В этой статье мы подробно рассмотрим различия между этими двумя режимами и то, как они работают.

Компиляция «точно в срок» (JIT)

Компиляция JIT — это режим компиляции по умолчанию в Angular, и это процесс, с помощью которого компилятор Angular компилирует шаблоны и компоненты приложения во время выполнения. Это означает, что каждый раз, когда приложение загружается в браузер, компилятор Angular запускается и компилирует шаблоны и компоненты. JIT-компиляция подходит для сред разработки, поскольку позволяет разработчикам вносить изменения в свое приложение и сразу же видеть изменения без необходимости перекомпилировать все приложение.

Когда приложение загружается, JIT-компилятор анализирует шаблоны приложения и динамически создает необходимые компоненты и директивы. Он компилирует шаблоны в код JavaScript, который может выполняться браузером. Компилятор JIT отвечает за синтаксический анализ кода HTML и TypeScript приложения, создание кода JavaScript и его оптимизацию для повышения производительности. Этот процесс может замедлить время запуска приложения и увеличить его общий размер.

Опережающая компиляция (AOT)

Компиляция AOT — это режим компиляции, в котором компилятор Angular компилирует шаблоны и компоненты приложения в процессе сборки, прежде чем приложение будет развернуто в производственной среде. Это означает, что скомпилированный код готов для выполнения браузером без необходимости компилировать шаблоны и компоненты во время выполнения.

Компиляция AOT предлагает несколько преимуществ по сравнению с компиляцией JIT, в том числе:

  1. Более быстрое время запуска: поскольку шаблоны и компоненты приложения уже скомпилированы, приложение запускается быстрее.
  2. Меньший размер пакета: компиляция AOT удаляет компилятор Angular и другой ненужный код из производственного пакета, что приводит к уменьшению размера пакета.
  3. Улучшенная безопасность: компиляция AOT устраняет риск инъекций путем удаления динамической генерации кода.

Чтобы использовать компиляцию AOT в приложении Angular, вам нужно выполнить следующую команду:

ng build --aot

Эта команда компилирует приложение в режиме компиляции AOT и создает производственный пакет, готовый к развертыванию в рабочей среде.

Как работает компиляция AOT

Компиляция AOT включает два шага: анализ шаблона и генерация кода.

Разбор шаблона

В режиме компиляции AOT компилятор Angular анализирует шаблоны и создает файл TypeScript, определяющий структуру шаблона. Этот файл содержит информацию о компонентах, директивах и каналах, используемых в шаблоне. Компилятор также создает файл метаданных, содержащий информацию о модуле, компонентах, директивах и каналах, используемых в приложении.

Генерация кода

На втором этапе компилятор Angular генерирует код, который может быть выполнен браузером. Компилятор считывает файл метаданных и генерирует код, необходимый для создания компонентов, директив и каналов, определенных в шаблоне. Сгенерированный код оптимизирован для повышения производительности и намного меньше кода, сгенерированного JIT-компилятором.

Пример компиляции AOT

Давайте рассмотрим простой пример, чтобы понять, как работает компиляция AOT.

Предположим, у нас есть следующий компонент Angular:

import { Component } from '@angular/core';

@Component({
  selector: 'app-hello',
  template: `
    <h1>Hello {{ name }}!</h1>
  `,
})
export class HelloComponent {
  name = 'Angular';
}

В режиме JIT-компиляции компилятор Angular будет запускаться во время выполнения и компилировать шаблон HelloComponent каждый раз при визуализации компонента. Однако в режиме компиляции AOT компилятор Angular компилирует шаблон в процессе сборки и генерирует следующий код:

import { Component } from '@angular/core';

function HelloComponent_ng_template_0(_l: any, _ctx: any) {
  if (_l === 0) {  // creation mode
    const _t = _ctx._l();
    _l(_t);
    const _e = _t.nativeElement;
    _l(_e, 0, 0);
    _l(_e.childNodes[0], 1);
    _l(_e, 0, 0);
  }
  if (_l === 1) {  // update mode
    const _e = _ctx._el();
    _l(_e.childNodes[0], 1, _l(_ctx.name));
  }
}

@Component({
  selector: 'app-hello',
  template: `
    <h1>Hello {{ name }}!</h1>
  `,
})
export class HelloComponent {
  name = 'Angular';

  _l() { return this._el().parentView; }
  _el() { return this._view.elementRefs[0]; }
  _view: any;
}

Как видите, код, скомпилированный с помощью AOT, намного меньше и эффективнее, чем код, скомпилированный JIT. Код, скомпилированный с помощью AOT, содержит функцию с именем HelloComponent_ng_template_0, представляющую скомпилированный шаблон. Функция принимает два параметра: _l и _ctx. _l представляет режим создания или обновления, а _ctx представляет контекст шаблона.

В функции HelloComponent_ng_template_0 режим создания инициализирует шаблон компонента, а режим обновления обновляет шаблон компонента всякий раз, когда происходит изменение. Функция также содержит ссылку на свойство name, которое используется для динамического отображения имени компонента в шаблоне.

Заключение

В заключение, оба режима компиляции AOT и JIT имеют свои преимущества и недостатки. JIT-компиляция подходит для сред разработки, поскольку позволяет разработчикам вносить изменения в свои приложения и сразу же видеть изменения без необходимости перекомпилировать все приложение. Компиляция AOT, с другой стороны, подходит для производственных сред, поскольку обеспечивает более быстрое время запуска, меньшие размеры пакетов и лучшую безопасность.

При выборе между компиляцией AOT и JIT учитывайте требования вашего приложения и среду, в которой оно будет развернуто. Если вы разрабатываете небольшое приложение или прототип, JIT-компиляции может быть достаточно. Однако, если вы создаете крупномасштабное производственное приложение, лучшим выбором будет компиляция AOT.

Стоит отметить, что для компиляции AOT требуется больше настроек и настроек, чем для JIT-компиляции. Вам необходимо настроить процесс сборки для использования компиляции AOT и убедиться, что все зависимости установлены правильно. Однако, как только вы настроите компиляцию AOT, вы получите более быстрое время сборки и более оптимизированное приложение.

В целом, понимание различий между режимами компиляции AOT и JIT в Angular имеет решающее значение для создания эффективных, масштабируемых и безопасных веб-приложений.

Спасибо, что прочитали!

Я надеюсь, что вы нашли эту статью полезной. Если у вас есть какие-либо вопросы или предложения, пожалуйста, оставляйте комментарии. Ваши отзывы помогают мне стать лучше.

Не забудь подписаться⭐️

Страница Facebook: https://www.facebook.com/designTechWorld1

Страница в Instagram: https://www.instagram.com/techd.esign/

Канал YouTube: https://www.youtube.com/@tech..Design/

Твиттер: https://twitter.com/sumit_singh2311

Используемое оборудование:

Ноутбук: https://amzn.to/3yKkzaC

Смотрите:https://amzn.to/41cialm

Вы можете предпочесть React Book: https://amzn.to/3Tw29nx

Некоторые дополнительные книги, связанные с языками программирования:

https://amzn.to/3z3tW5s

https://amzn.to/40n4m6O

https://amzn.to/3Jzstse

https://amzn.to/3nbl8aE

  • Важный отказ от ответственности — «Amazon и логотип Amazon являются товарными знаками Amazon.com, Inc. или ее дочерних компаний».

Дополнительные материалы на PlainEnglish.io.

Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord .

Заинтересованы в масштабировании запуска вашего программного обеспечения? Ознакомьтесь с разделом Схема.