Как работает Angular Ivy и какие преимущества он даёт?

Angular Ivy — это движок рендеринга и компиляции, представленный в Angular начиная с версии 9. Он полностью заменяет предыдущий движок View Engine, при этом оставаясь обратно совместимым. Ivy представляет собой архитектурное переосмысление внутренней работы Angular, которое приносит улучшения в производительности, размерах сборки, отладке, сборке библиотек и гибкости фреймворка.

1. Основные принципы работы Ivy

1.1 Локальная (независимая) компиляция компонентов

Ivy компилирует каждый компонент отдельно, без необходимости компилировать весь модуль или проект. Это позволяет:

  • повторно использовать уже скомпилированные артефакты;

  • ускорить пересборку при изменении одного файла;

  • упростить публикацию библиотек (Partial Compilation).

1.2 Инструкции рендеринга на низком уровне

Вместо генерации сложного JavaScript-кода, как в View Engine, Ivy использует низкоуровневые инструкции (ɵɵelementStart, ɵɵtext, ɵɵelementEnd), которые соответствуют манипуляциям с DOM напрямую.

1.3 Tree-shaking и оптимизация

Ivy компилирует компоненты в компактные функции, удаляя неиспользуемые части Angular. Это делает сборку легче и позволяет лучше работать tree-shaking'у (удалению мёртвого кода).

1.4 Переработанная модель зависимостей

Ivy поддерживает Dependency Injection на уровне фабрик компонентов без необходимости связывать всё в одном NgModule. Это способствует развитию Standalone Components.

2. Что происходит при компиляции Ivy

  • Angular преобразует шаблон компонента в JavaScript-функции-инструкции рендера.

  • Эти функции включаются в результат сборки как часть самого компонента.

  • Например, шаблон {{title}} превращается в:

ɵɵtextInterpolate(ctx.title);
  • Эти инструкции связывают данные компонента с DOM и обновляют DOM при изменении данных.

3. Преимущества Ivy

3.1 Меньше размер бандлов

  • Благодаря Tree-shaking удаляются неиспользуемые Angular-фичи.

  • Компоненты включают только нужный код.

  • Особенно заметно при использовании Standalone компонентов и модулей.

3.2 Более быстрая компиляция и пересборка

  • Компилируются только изменённые файлы (локально).

  • Используется incremental compilation.

  • ng build и ng serve работают быстрее.

3.3 Улучшенная отладка

  • Скомпилированные шаблоны читаемы и похожи на исходные.

  • Переменные компонента легко доступны в DevTools.

  • ng.probe() и другие Angular debugging API остаются работоспособными.

3.4 Улучшения для библиотек

  • Возможна публикация в частично скомпилированном виде (Partial Compilation).

  • Либы не нужно компилировать для каждой версии Angular отдельно.

  • Angular Package Format (APF) стал проще.

3.5 Поддержка Standalone Components

  • Ivy позволяет использовать компоненты без необходимости включения в NgModule.

  • Улучшает модульность и упрощает архитектуру.

  • Позволяет динамически загружать компоненты, не регистрируя их в модуле.

@Component({
standalone: true,
template: \`<p>Hello</p>\`,
})
export class HelloComponent {}

3.6 Улучшенная совместимость с dynamic import()

  • Ivy поддерживает import() для динамической загрузки компонентов и модулей.

  • Это делает ленивую загрузку более гибкой и универсальной.

const { MyComponent } = await import('./my.component');

3.7 Быстрее SSR и меньшая нагрузка на сервер

  • Компактные инструкции рендеринга ускоряют генерацию HTML.

  • Более эффективный рендер в Angular Universal.

4. Сравнение с View Engine

Характеристика View Engine Ivy
Размер бандла Больше Меньше за счёт tree-shaking
--- --- ---
Скорость компиляции Медленнее Быстрее за счёт локальной компиляции
--- --- ---
Отладка Трудно читаемые шаблоны Понятные и читаемые шаблоны
--- --- ---
Совместимость либ Требует перекомпиляции Partial compilation
--- --- ---
Рендеринг Через шаблонные фабрики Через низкоуровневые render-функции
--- --- ---
Поддержка Standalone Нет Да
--- --- ---
SSR Работает Более эффективно работает
--- --- ---

5. Как включается Ivy

  • Начиная с Angular 9 — Ivy включён по умолчанию.

  • В tsconfig.app.json:

"angularCompilerOptions": {
"enableIvy": true
}
  • Для библиотек можно использовать "compilationMode": "partial".

6. Влияние на ng update

Ivy предоставляет более гибкую архитектуру:

  • Обновления Angular становятся менее разрушительными.

  • Можно использовать компоненты и директивы вне модулей.

  • Позволяет разрабатывать Angular-приложения с большей модульностью.

7. Как проверить, что проект использует Ivy

  • Проверить tsconfig.app.json, enableIvy: true.

  • Убедиться, что Angular версия ≥ 9.

  • В сборке отсутствует ngfactory-файлы (если они есть — используется View Engine).

8. Ограничения и обратная совместимость

  • Ivy обратно совместим с View Engine.

  • Можно использовать библиотеки, скомпилированные под старый движок.

  • Angular CLI автоматически обрабатывает это при сборке.

9. Angular Compatibility Compiler (ngcc)

Для совместимости с View Engine-библиотеками Ivy использует ngcc — инструмент, переписывающий код из View Engine в Ivy-совместимую форму. Это временная мера, пока все библиотеки не перейдут на Ivy.

10. Влияние на runtime производительность

Хотя основная цель Ivy — уменьшение бандлов и улучшение DX (Developer Experience), он также:

  • ускоряет первое отображение;

  • снижает нагрузку на память;

  • делает рендеринг компонентов более эффективным, особенно при обновлениях данных.

11. Расширяемость Angular

Ivy открывает возможности для будущих улучшений, таких как:

  • Микрофронтенды (Microfrontends);

  • Angular with ESM / Vite / ESBuild;

  • Runtime compilation плагинов;

  • Meta-programming (например, декларативное создание компонентов через JSON).

Таким образом, Ivy — это не просто оптимизация, а фундаментальное изменение в архитектуре Angular, ориентированное на производительность, модульность и удобство разработки.