Создайте скомпилированную библиотеку Ahead-of-Time (AOT) для использования приложениями Angular.

У меня есть библиотека Angular 5, которую я предоставляю в виде пакета другим приложениям для использования из их node_modules.

В настоящее время приложение JIT компилируется с использованием rollup и gulp и экспортируется как пакет. Таким образом, приложения для разработчиков используют мой пакет в JIT-компилированной форме.

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

Я использую ng-bootstrap и множество других библиотек с открытым исходным кодом для создания компонентов в моем модуле и добавления к ним пользовательских стилей или функций. Должны ли все библиотеки, которые я использую в своем модуле, быть в своих формах AOT, или я могу использовать их JIT-аналоги?

Кроме того, я думаю, что было бы неплохо иметь отдельные пакеты для моей библиотеки — packageName и packageName-aot, чтобы у пользователей была возможность выбрать ту библиотеку, которую они хотят использовать.

Помимо всего рефакторинга кода (изменение частных переменных, используемых в шаблоне, на общедоступные, удаление стрелочных функций, лямбда-выражений и т. д.), есть ли что-то еще, что мне нужно иметь в виду, прежде чем выставлять свои библиотечные модули в форме AOT?

Я не могу использовать Angular CLI из-за определенных ограничений, поэтому мне придется зависеть от @ngtools/webpack, чтобы получить компиляцию AOT, если таковая имеется.

В настоящее время мой tsconfig.json имеет следующие параметры:

"angularCompilerOptions": {
    "skipTemplateCodegen": true,
    "strictMedtadataEmit": true,
    "fullTemplateTypeCheck": true
}

Я много искал в Интернете, но документы Angular AOT довольно расплывчаты и не очень ясно, что я пытался здесь сделать. Любое направление было бы очень полезно.
Спасибо!


person nashcheez    schedule 18.05.2018    source источник
comment
Я думаю, вы потратите меньше времени на то, чтобы ваш проект работал с angular-cli, чем на создание собственной сборки.   -  person elclanrs    schedule 19.05.2018
comment
@elclanrs Я бы сделал это, если бы мог! :)   -  person nashcheez    schedule 19.05.2018


Ответы (1)


Библиотека, которую вы пишете, и библиотеки, от которых зависит ваша библиотека, должны быть совместимы с AOT. Вот и все.

Вы не пишете и не предоставляете библиотеку, скомпилированную AOT (компилированную форму AOT, как вы выразились); потребляющие приложения будут выполнять компиляцию AOT во время сборки.

Все, что вам должно сделать, — это убедиться, что когда потребляющее приложение выполняет сборку AOT (ng build --prod при использовании Angular CLI), ваша библиотека работает нормально. Под работает хорошо я имею в виду, что ваша библиотека может компилироваться в AOT с потребляющим приложением без ошибок.

Библиотечные инструменты, такие как generator-angular2-library или ng-packagr (инструмент @angular/cli 6.0.0 используется для поддержки создания библиотек), просто создайте пакеты для JavaScript, не более того.

Выполнение сборки AOT зависит от инструмента сборки потребляющего приложения. Это то, что позволяет использовать библиотеку любым приложением (или инфраструктурой/библиотекой приложения), которое в ней нуждается. Старайтесь не задумываться о том, что нужно для создания/развертывания библиотеки. Тяжелая работа с AOT зависит от приложения, которое его использует.

person R. Richards    schedule 19.05.2018
comment
Спасибо за ответ. Это немного проясняет ситуацию. То есть это означает, что я не смогу сделать свою библиотеку AOT способной, даже если одна из моих зависимостей не поддерживает? - person nashcheez; 19.05.2018
comment
Это правда. Если одна из нужных вам библиотек не поддерживает AOT, то и ваша библиотека тоже не будет. Большинство поддерживаемых библиотек способны к компиляции AOT, поэтому, если вы не используете более старую или устаревшую библиотеку, в конце концов вы сможете использовать AOT. - person R. Richards; 19.05.2018
comment
@R.Richards Знаете ли вы какой-либо способ создания библиотеки AOT в сценарии, когда она создается как UMD и используется в другом приложении с использованием загрузчика модулей SystemJs? Он отлично работает, когда основное приложение работает с JIT, но поскольку компилятор удаляется в сборках prod, я хотел бы также скомпилировать библиотеку AOT, чтобы иметь возможность использовать ее в производстве и не отказываться от AOT в основном приложении. . - person IvanSt; 25.08.2018