(Kiedy mówię Angular, mam na myśli Angular 2+ i wyraźnie powiem angular-js, jeśli wspominam o kątowym 1).
Preludium: To zagmatwane
Angular, a prawdopodobnie dokładniej angular-cli połączyło ze sobą wiele popularnych narzędzi w Javascript, które są zaangażowane w proces kompilacji. Prowadzi to do pewnego zamieszania.
Aby pogłębić zamieszanie, termin ten compile
był często używany w angular-js w odniesieniu do procesu pobierania pseudo-html szablonu i przekształcania go w elementy DOM. To część tego, co robi kompilator, ale jedna z mniejszych części.
Przede wszystkim nie ma potrzeby używania TypeScript, angular-cli lub Webpack do uruchomienia Angulara. Odpowiedzieć na Twoje pytanie. Powinniśmy spojrzeć na proste pytanie: „Co to jest Angular?”
Angular: Co to robi?
Ta sekcja może być kontrowersyjna, zobaczymy. Zasadniczo usługa dostarczana przez Angular jest mechanizmem wstrzykiwania zależności, który działa w Javascript, HTML i CSS. Piszesz wszystkie małe fragmenty indywidualnie, aw każdym małym kawałku postępujesz zgodnie z zasadami Angulara dotyczącymi odwoływania się do innych elementów. Angular w jakiś sposób to wszystko łączy.
Aby być (nieco) bardziej szczegółowym:
- Szablony pozwalają na połączenie kodu HTML ze składnikiem JavaScript. Umożliwia to wprowadzanie danych przez użytkownika w samym DOM (np. Kliknięcie przycisku) w celu przesłania do komponentu Javascript, a także pozwala zmiennym w komponencie Javascript na kontrolowanie struktury i wartości w DOM.
- Klasy Javascript (w tym komponenty Javascript) muszą mieć dostęp do instancji innych klas Javascript, od których zależą (np. Klasyczne wstrzykiwanie zależności). BookListComponent wymaga wystąpienia BookListService, które może wymagać wystąpienia BookListPolicy lub czegoś podobnego. Każda z tych klas ma różne okresy istnienia (np. Usługi są zwykle singletonami, komponenty zwykle nie są singletonami), a Angular musi zarządzać wszystkimi tymi czasami istnienia, tworzeniem komponentów i okablowaniem zależności.
- Reguły CSS musiały być ładowane w taki sposób, aby miały zastosowanie tylko do podzbioru DOM (styl komponentu jest lokalny dla tego komponentu).
Jedną z ważnych rzeczy do zapamiętania jest to, że Angular nie jest odpowiedzialny za to, w jaki sposób pliki Javascript odwołują się do innych plików Javascript (np. import
Słowa kluczowego). Zadba o to Webpack.
Co robi kompilator?
Teraz, gdy wiesz, co robi Angular, możemy porozmawiać o tym, co robi kompilator. Uniknę zbytniego technicznego podejścia, głównie dlatego, że jestem ignorantem. Jednak w układzie wtrysku zależność zazwyczaj muszą wyrazić swoje zależnościami z pewnego rodzaju metadanych (np jak robi powiedzmy klasy I can be injected
, My lifetime is blah
lub You can think of me as a Component type of instance
). W Javie Spring pierwotnie robił to z plikami XML. Później Java przyjęła adnotacje i stały się one preferowanym sposobem wyrażania metadanych. C # używa atrybutów do wyrażania metadanych.
Javascript nie ma świetnego mechanizmu ujawniania wbudowanych metadanych. angular-js podjął próbę i nie było to złe, ale było wiele reguł, których nie można było łatwo sprawdzić i które były nieco zagmatwane. W przypadku Angular istnieją dwa obsługiwane sposoby określania metadanych. Możesz napisać czysty Javascript i określić metadane ręcznie, trochę podobnie do angular-js i po prostu przestrzegać zasad i pisać dodatkowy kod boiler-platey. Alternatywnie możesz przełączyć się na TypeScript, który, tak jak to się dzieje, ma dekoratory (te @
symbole), które są używane do wyrażania metadanych.
Więc tutaj możemy wreszcie dostać się do kompilatora. Zadaniem kompilatora jest pobranie tych metadanych i stworzenie systemu elementów roboczych, którym jest Twoja aplikacja. Skupiasz się na wszystkich elementach i wszystkich metadanych, a kompilator tworzy jedną dużą, połączoną aplikację.
Jak kompilator to robi?
Kompilator może działać na dwa sposoby: w czasie wykonywania i z wyprzedzeniem. Odtąd zakładam, że używasz TypeScript:
- Środowisko uruchomieniowe: po uruchomieniu kompilatora maszynopisu pobiera wszystkie informacje dekoratora i umieszcza je w kodzie JavaScript dołączonym do ozdobionych klas, metod i pól. W swoim
index.html
odwołaniu się do tego, main.js
który wywołuje bootstrap
metodę. Ta metoda jest przekazywana do modułu najwyższego poziomu.
Metoda bootstrap uruchamia kompilator środowiska uruchomieniowego i podaje mu odniesienie do tego modułu najwyższego poziomu. Następnie kompilator środowiska uruchomieniowego zaczyna przeszukiwać ten moduł, wszystkie usługi, komponenty itp., Do których odwołuje się ten moduł, oraz wszystkie powiązane metadane, a następnie tworzy aplikację.
- AOT: Zamiast wykonywać całą pracę w czasie wykonywania, Angular dostarczył mechanizm do wykonywania większości pracy w czasie kompilacji. Prawie zawsze odbywa się to za pomocą wtyczki webpack (musi to być jeden z najpopularniejszych, ale najmniej znanych pakietów npm). Uruchamia się po uruchomieniu kompilacji maszynopisu, więc zasadniczo widzi te same dane wejściowe, co kompilator środowiska uruchomieniowego. Kompilator AOT tworzy aplikację tak samo jak kompilator środowiska wykonawczego, ale następnie zapisuje ją z powrotem w JavaScript.
Zaletą jest nie tylko to, że można zaoszczędzić czas procesora wymagany do samej kompilacji, ale także pozwala zmniejszyć rozmiar aplikacji.
Konkretne odpowiedzi
Angular CLI Najpierw wywołuje wbudowany kompilator angular napisany w Typescript =>, a następnie wywołuje Typescript Transpiler =>, a następnie wywołuje pakiet Webpack w celu spakowania i przechowywania w katalogu dist /.
Nie. Angular CLI wywołuje Webpack (prawdziwą usługą Angular CLI jest konfigurowanie webpacka. Po uruchomieniu ng build
nie jest to nic innego jak proxy do uruchamiania Webpacka). Webpack najpierw wywołuje kompilator Typescript, a następnie kompilator kątowy (zakładając AOT), a wszystko to jednocześnie pakując kod.
Chociaż main.ts jest używany w powyższym oświadczeniu do wyjaśnienia procesu ładowania początkowego, czy aplikacja angular nie jest uruchamiana lub uruchamiana przy użyciu plików Javascript .js?
Nie jestem do końca pewien, o co tutaj pytasz. main.ts
zostaną przesłane do Javascript. Ten JavaScript będzie zawierał wywołanie, bootstrap
które jest punktem wejścia do Angular. Po bootstrap
zakończeniu będziesz mieć uruchomioną pełną aplikację Angular.
W tym poście napisano, że Angular ma dwa kompilatory:
Wyświetl kompilator
Kompilator modułów
Szczerze mówiąc, powiem tu tylko o ignorancji. Myślę, że na naszym poziomie możemy po prostu myśleć o tym wszystkim jako o jednym dużym kompilatorze.
Czy ktoś wie, jak dokładnie wszystkie części pasują do siebie?
Mam nadzieję, że powyższe zadowoliło.
Don't @ Me: Angular to coś więcej niż wstrzyknięcie zależności
Pewnie. Obsługuje routing, budowanie widoku, wykrywanie zmian i wiele innych rzeczy. Kompilator faktycznie generuje JavaScript do tworzenia widoków i wykrywania zmian. Skłamałem, mówiąc, że to tylko zastrzyk uzależnienia. Jednak zastrzyk zależności jest sednem i wystarczający, aby napędzać resztę odpowiedzi.
Czy powinniśmy nazywać to kompilatorem?
Prawdopodobnie wykonuje dużo analizowania i leksowania i na pewno generuje w rezultacie dużo kodu, więc z tego powodu można nazwać go kompilatorem.
Z drugiej strony, tak naprawdę nie tłumaczy twojego kodu tylko na inną reprezentację. Zamiast tego polega na pobieraniu kilku różnych fragmentów kodu i wplataniu ich w zużywalne elementy większego systemu. Następnie proces ładowania początkowego (po skompilowaniu, jeśli to konieczne) pobiera te elementy i podłącza je do rdzenia Angulara.
The compiler does actually generate
Javascript oświadczenia, aby zobaczyć budowanie i wykrywanie zmian .` To nie jest kłamstwo. Tym nie jest kompilator? A angular robi zastrzyk zależności.