(Когда я говорю Angular, я имею в виду Angular 2+ и явно говорю angular-js, если я упоминаю angular 1).
Прелюдия: сбивает с толку
Angular и, вероятно, более точно angular-cli объединили в Javascript ряд инструментов, которые участвуют в процессе сборки. Это действительно приводит к некоторой путанице.
Чтобы усугубить путаницу, этот термин compile
часто использовался в angular-js для обозначения процесса взятия псевдо-html шаблона и превращения его в элементы DOM. Это часть того, что делает компилятор, но одна из меньших частей.
Прежде всего, нет необходимости использовать TypeScript, angular-cli или Webpack для запуска Angular. Чтобы ответить на ваш вопрос. Мы должны ответить на простой вопрос: «Что такое Angular?»
Angular: что он делает?
Этот раздел может быть спорным, мы увидим. По своей сути сервис, предоставляемый Angular, представляет собой механизм внедрения зависимостей, который работает с Javascript, HTML и CSS. Вы пишете все маленькие кусочки индивидуально, и в каждом маленьком кусочке вы следуете правилам Angular для ссылок на другие части. Angular как-то переплетает это все вместе.
Чтобы быть (немного) более конкретным:
- Шаблоны позволяют встраивать HTML в компонент Javascript. Это позволяет пользователю вводить данные в самой DOM (например, щелкать кнопку) для передачи в компонент Javascript, а также позволяет переменным в компоненте Javascript управлять структурой и значениями в DOM.
- Классы Javascript (включая компоненты Javascript) должны иметь возможность доступа к экземплярам других классов Javascript, от которых они зависят (например, классическая инъекция зависимостей). BookListComponent нуждается в экземпляре BookListService, которому может потребоваться экземпляр BookListPolicy или что-то в этом роде. Каждый из этих классов имеет разное время жизни (например, службы обычно являются одиночными, компоненты обычно не одиночными), и Angular должен управлять всеми этими сроками жизни, созданием компонентов и связью зависимостей.
- Правила CSS нужно было загружать таким образом, чтобы они применялись только к подмножеству DOM (стиль компонента является локальным для этого компонента).
Возможно, важно отметить, что Angular не несет ответственности за то, как файлы Javascript ссылаются на другие файлы Javascript (например, import
ключевое слово). Об этом позаботится Webpack.
Что делает компилятор?
Теперь, когда вы знаете, что делает Angular, мы можем поговорить о том, что делает компилятор. Я не буду вдаваться в технические подробности, главным образом потому, что я невежественен. Однако, в системе впрыска зависимостей вы обычно должны выражать свои зависимости с какой - то метаданных (например , как делает класс скажем I can be injected
, My lifetime is blah
или You can think of me as a Component type of instance
). В Java Spring изначально делал это с файлами XML. Позднее в Java были приняты аннотации, и они стали предпочтительным способом выражения метаданных. C # использует атрибуты для выражения метаданных.
Javascript не имеет отличного механизма для раскрытия этих встроенных метаданных. angular-js предпринял попытку, и это было неплохо, но было много правил, которые нелегко проверить, и которые немного сбивали с толку. В Angular есть два поддерживаемых способа указания метаданных. Вы можете написать чистый Javascript и указать метаданные вручную, что-то вроде angular-js, и просто продолжать следовать правилам и писать лишний шаблонный код. В качестве альтернативы вы можете переключиться на TypeScript, который, как оказалось, имеет декораторы (эти @
символы), которые используются для выражения метаданных.
Итак, вот где мы наконец можем добраться до компилятора. Задача компилятора - взять эти метаданные и создать систему рабочих частей, которая является вашим приложением. Вы сосредотачиваетесь на всех частях и всех метаданных, а компилятор создает одно большое взаимосвязанное приложение.
Как компилятор это делает?
Компилятор может работать двумя способами: во время выполнения и с опережением времени. С этого момента я предполагаю, что вы используете TypeScript:
- Время выполнения: когда компилятор машинописного текста запускается, он берет всю информацию декоратора и вставляет ее в код Javascript, прикрепленный к декорированным классам, методам и полям. В вашем
index.html
вы ссылаетесь на ваш, main.js
который вызывает bootstrap
метод. Этот метод передается вашему модулю верхнего уровня.
Метод начальной загрузки запускает компилятор среды выполнения и дает ему ссылку на этот модуль верхнего уровня. Затем компилятор среды выполнения начинает сканирование этого модуля, всех служб, компонентов и т. Д., На которые ссылается этот модуль, и всех связанных метаданных, и создает ваше приложение.
- АОТ: Вместо того, чтобы выполнять всю работу во время выполнения, Angular предоставил механизм для выполнения большей части работы во время сборки. Это почти всегда делается с помощью плагина webpack (это должен быть один из самых популярных, но наименее известных пакетов npm). Он запускается после выполнения компиляции машинописного текста, поэтому видит практически тот же ввод, что и компилятор среды выполнения. Компилятор AOT создает ваше приложение так же, как компилятор среды выполнения, но затем сохраняет его обратно в Javascript.
Преимущество здесь не только в том, что вы можете сэкономить процессорное время, необходимое для самой компиляции, но и в том, что это позволяет уменьшить размер вашего приложения.
Конкретные ответы
Angular CLI Сначала вызывает angular встроенный компилятор, написанный на Typescript =>, затем вызывает Typescript Transpiler =>, затем вызывает Webpack для объединения и сохранения в каталоге dist /.
Нет. Angular CLI вызывает Webpack (настоящая служба Angular CLI настраивает webpack. Когда вы запускаете, ng build
это не более чем прокси для запуска Webpack). Webpack сначала вызывает компилятор Typescript, а затем компилятор angular (при условии AOT), при этом одновременно объединяя ваш код.
Хотя main.ts используется в заявлении выше для объяснения процесса начальной загрузки, разве приложение angular не загружается или запускается с использованием файлов Javascript .js?
Я не совсем уверен, о чем вы здесь спрашиваете. main.ts
будет скопирован в Javascript. Этот Javascript будет содержать вызов, bootstrap
который является точкой входа в Angular. Когда bootstrap
это будет сделано, у вас будет запущено полное приложение Angular.
В этом посте говорится, что в Angular есть два компилятора:
Просмотреть компилятор
Компилятор модуля
Если честно, я просто собираюсь заявить здесь о незнании. Я думаю, что на нашем уровне мы можем думать обо всем как об одном большом компиляторе.
Кто-нибудь знает, как по глубине сочетаются все части?
Я надеюсь, что вышесказанное удовлетворило это.
Don't @ Me: Angular делает больше, чем внедрение зависимостей
Конечно. Он выполняет маршрутизацию, просмотр здания, обнаружение изменений и многое другое. Компилятор действительно генерирует Javascript для построения представления и обнаружения изменений. Я соврал, когда сказал, что это просто инъекция зависимости. Однако внедрение зависимостей лежит в основе и достаточно, чтобы дать остальной ответ.
Стоит ли называть это компилятором?
Вероятно, он выполняет много синтаксического анализа и лексирования и в результате определенно генерирует много кода, поэтому вы могли бы назвать его компилятором по этой причине.
С другой стороны, на самом деле он не переводит ваш код просто в другое представление. Вместо этого он берет кучу разных фрагментов кода и объединяет их в расходные части более крупной системы. Затем процесс начальной загрузки (после компиляции, если необходимо) берет эти части и вставляет их в ядро Angular.
The compiler does actually generate
Javascript` для построения представления и обнаружения изменений. `Это не ложь. Этого компилятор не делает? А angular выполняет инъекцию зависимостей.