(Коли я кажу Angular, я маю на увазі Angular 2+ і явно скажу angular-js, якщо я згадую angular 1).
Прелюдія: Це бентежить
Кутові та, мабуть, точніше angular-cli об’єднали низку популярних інструментів у Javascript, які беруть участь у процесі збірки. Це призводить до невеликої плутанини.
Для подальшої плутанини цей термін compile
часто використовувався в angular-js для позначення процесу взяття псевдо-html шаблону та перетворення його в елементи DOM. Це частина того, що робить компілятор, але одна з менших частин.
Перш за все, для запуску Angular немає необхідності використовувати TypeScript, angular-cli або Webpack. Щоб відповісти на ваше запитання. Ми повинні розглянути просте запитання: "Що таке 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
метод. Цей метод передається модулю верхнього рівня.
Метод bootstrap запускає компілятор середовища виконання і дає йому посилання на цей модуль верхнього рівня. Потім компілятор середовища виконання починає сканувати цей модуль, усі служби, компоненти тощо, на які посилається цей модуль, і всі пов’язані з ним метадані, та створює вашу програму.
- AOT: Замість того, щоб виконувати всю роботу під час виконання, Angular забезпечив механізм виконання більшості робіт під час збірки. Це майже завжди робиться за допомогою плагіна webpack (це повинен бути один з найпопулярніших, але найменш відомих пакетів npm). Він запускається після запуску компіляції TypeScript, тому він бачить по суті той самий вхід, що і компілятор середовища виконання. Компілятор AOT створює вашу програму так само, як і компілятор середовища виконання, але потім зберігає її назад у Javascript.
Перевага тут полягає не тільки в тому, що ви можете заощадити час процесора, необхідний для самої компіляції, але це також дозволяє зменшити розмір вашої програми.
Конкретні відповіді
Angular CLI Спочатку викликає вбудований компілятор angular, написаний у Typescript =>, потім викликає Typescript Transpiler =>, а потім викликає Webpack для зв’язування та зберігання в каталозі dist /.
Ні. Angular CLI викликає Webpack (справжньою службою Angular CLI є налаштування webpack. При запуску ng build
це не набагато більше, ніж проксі для запуску Webpack). Спочатку Webpack викликає компілятор Typescript, а потім кутовий компілятор (припускаючи AOT), одночасно поєднуючи ваш код.
Незважаючи на те, що main.ts використовується у вищезазначеному викладі для пояснення процесу завантаження, чи не завантажується кутова програма або не запускається за допомогою файлів .js Javascript?
Я не зовсім впевнений, що ви тут питаєте. main.ts
буде перенесено в Javascript. Цей Javascript міститиме виклик, bootstrap
який є точкою входу до Angular. Після bootstrap
закінчення у вас буде запущена повна програма Angular.
У цій публікації сказано, що Angular має два компілятори:
Переглянути компілятор
Компілятор модулів
Чесно кажучи, я просто збираюся стверджувати тут незнання. Я думаю, що на нашому рівні ми можемо просто сприймати все це як один великий компілятор.
Хтось знає, як усі частини поєднуються по глибині?
Сподіваюсь, вищезазначене це задовольнило.
Don't @ Me: Angular робить більше, ніж введення залежностей
Звичайно. Він робить маршрутизацію, побудову перегляду, виявлення змін та всілякі інші речі. Компілятор насправді генерує Javascript для побудови подання та виявлення змін. Я збрехав, коли сказав, що це просто ін'єкція залежності. Однак введення залежності є основним і достатньою, щоб забезпечити решту відповідей.
Чи слід називати його компілятором?
Ймовірно, це робить багато аналізу та лексики і, безумовно, генерує багато коду в результаті, тому ви можете назвати його компілятором з цієї причини.
З іншого боку, це насправді не переклад вашого коду просто в інше представлення. Натомість він бере купу різних фрагментів коду і переплітає їх у витратні частини більшої системи. Потім процес завантаження (після компіляції, якщо це необхідно) бере ці фрагменти та підключає їх до Angular core.
The compiler does actually generate
Javascript у вашій заяві для побудови вигляду та виявлення змін. `Це не брехня. Це те, що робить компілятор, чи не так? І кутова робить введення залежності.