(Khi tôi nói Angular, tôi có nghĩa là Angular 2+ và sẽ nói rõ ràng là angle-js nếu tôi đang đề cập đến góc 1).
Khúc dạo đầu: Thật là khó hiểu
Angular, và có lẽ chính xác hơn là angle-cli đã hợp nhất một số công cụ thịnh hành trong Javascript tham gia vào quá trình xây dựng. Nó dẫn đến một chút nhầm lẫn.
Để gây nhầm lẫn thêm, thuật ngữ compile
này thường được sử dụng trong angle-js để chỉ quá trình lấy html giả của mẫu và biến nó thành các phần tử DOM. Đó là một phần của những gì trình biên dịch làm nhưng là một trong những phần nhỏ hơn.
Trước hết, không cần sử dụng TypeScript, angle-cli hoặc Webpack để chạy Angular. Để trả lời câu hỏi của bạn. Chúng ta nên xem xét một câu hỏi đơn giản: "Angular là gì?"
Angular: Nó làm gì?
Phần này có thể gây tranh cãi, chúng ta sẽ xem. Về cốt lõi, dịch vụ mà Angular cung cấp là một cơ chế chèn phụ thuộc hoạt động trên Javascript, HTML và CSS. Bạn viết tất cả các mẩu nhỏ và từng mẩu riêng lẻ và trong mỗi mẩu nhỏ, bạn tuân theo các quy tắc của Angular để tham khảo các mẩu khác. Angular sau đó dệt nên hoàn toàn bằng cách nào đó.
Cụ thể hơn (một chút):
- Các mẫu cho phép HTML được kết nối với thành phần Javascript. Điều này cho phép đầu vào của người dùng trên chính DOM (ví dụ: nhấp vào nút) để đưa vào thành phần Javascript và cũng cho phép các biến trong thành phần Javascript kiểm soát cấu trúc và giá trị trong DOM.
- Các lớp Javascript (bao gồm các thành phần Javascript) cần có khả năng truy cập các phiên bản của các lớp Javascript khác mà chúng phụ thuộc vào (ví dụ: chèn phụ thuộc cổ điển). BookListComponent cần một phiên bản BookListService có thể cần một phiên bản BookListPolicy hoặc một cái gì đó tương tự. Mỗi lớp này có vòng đời khác nhau (ví dụ: các dịch vụ thường là các lớp đơn, các thành phần thường không phải là lớp con) và Angular phải quản lý tất cả các vòng đời đó, việc tạo ra các thành phần và đi dây của các phần phụ thuộc.
- Các quy tắc CSS cần được tải theo cách mà chúng chỉ áp dụng cho một tập hợp con của DOM (kiểu của một thành phần là cục bộ cho thành phần đó).
Một điều quan trọng cần lưu ý là Angular không chịu trách nhiệm về cách các tệp Javascript tham chiếu đến các tệp Javascript khác (ví dụ: import
từ khóa). Điều đó do Webpack đảm nhận.
Trình biên dịch làm gì?
Bây giờ bạn đã biết Angular là gì, chúng ta có thể nói về những gì trình biên dịch làm. Tôi sẽ tránh quá kỹ thuật chủ yếu vì tôi không biết gì. Tuy nhiên, trong một hệ thống dependency injection bạn thường phải thể hiện sự phụ thuộc của bạn với một số loại siêu dữ liệu (ví dụ như thế nào có tiếng nói lớp I can be injected
, My lifetime is blah
hoặc You can think of me as a Component type of instance
). Trong Java, Spring ban đầu đã làm điều này với các tệp XML. Java sau đó đã áp dụng các chú thích và chúng đã trở thành cách ưa thích để thể hiện siêu dữ liệu. C # sử dụng các thuộc tính để thể hiện siêu dữ liệu.
Javascript không có một cơ chế tuyệt vời để hiển thị nội trang siêu dữ liệu này. angle-js đã cố gắng và nó không tệ nhưng có rất nhiều quy tắc không thể dễ dàng kiểm tra và hơi khó hiểu. Với Angular, có hai cách được hỗ trợ để chỉ định siêu dữ liệu. Bạn có thể viết Javascript thuần túy và chỉ định siêu dữ liệu theo cách thủ công, hơi giống với angle-js và chỉ cần tuân theo các quy tắc và viết thêm mã boiler-platey. Ngoài ra, bạn có thể chuyển sang TypeScript, khi nó xảy ra, có các trình trang trí (những @
ký hiệu đó) được sử dụng để thể hiện siêu dữ liệu.
Vì vậy, đây là nơi cuối cùng chúng ta có thể đến trình biên dịch. Công việc của trình biên dịch là lấy siêu dữ liệu đó và tạo ra hệ thống các phần làm việc chính là ứng dụng của bạn. Bạn tập trung vào tất cả các phần và tất cả siêu dữ liệu và trình biên dịch sẽ xây dựng một ứng dụng lớn được kết nối với nhau.
Trình biên dịch làm điều đó như thế nào?
Có hai cách trình biên dịch có thể hoạt động, thời gian chạy và tính năng vượt thời gian. Từ đây trở đi, tôi sẽ giả sử bạn đang sử dụng TypeScript:
- Thời gian chạy: Khi trình biên dịch typecript chạy, nó sẽ lấy tất cả thông tin của decorator và chuyển nó vào mã Javascript được đính kèm với các lớp, phương thức và trường được trang trí. Trong bạn,
index.html
bạn tham khảo của bạn main.js
mà gọi bootstrap
phương thức. Phương pháp đó được thông qua mô-đun cấp cao nhất của bạn.
Phương thức bootstrap kích hoạt trình biên dịch thời gian chạy và cung cấp cho nó một tham chiếu đến mô-đun cấp cao nhất đó. Sau đó, trình biên dịch thời gian chạy bắt đầu thu thập dữ liệu mô-đun đó, tất cả các dịch vụ, thành phần, v.v. được mô-đun đó tham chiếu và tất cả siêu dữ liệu được liên kết và xây dựng ứng dụng của bạn.
- LƯU Ý: Thay vì thực hiện tất cả công việc trong thời gian chạy, Angular đã cung cấp một cơ chế để thực hiện hầu hết công việc tại thời điểm xây dựng. Điều này hầu như luôn được thực hiện bằng cách sử dụng plugin webpack (đây phải là một trong những gói npm phổ biến nhất nhưng ít được biết đến nhất). Nó chạy sau khi quá trình biên dịch typecript chạy nên về cơ bản nó thấy đầu vào giống với trình biên dịch thời gian chạy. Trình biên dịch AOT xây dựng ứng dụng của bạn giống như trình biên dịch thời gian chạy nhưng sau đó lưu lại thành Javascript.
Ưu điểm ở đây không chỉ là bạn có thể tiết kiệm thời gian CPU cần thiết cho quá trình biên dịch mà còn cho phép bạn giảm dung lượng ứng dụng của mình.
Câu trả lời cụ thể
Angular CLI Đầu tiên gọi trình biên dịch được xây dựng trong góc độ được viết bằng Typecript => sau đó gọi Trình chuyển đổi kiểu chữ => sau đó gọi Webpack để đóng gói và lưu trữ trong thư mục dist /.
Không. Angular CLI gọi Webpack (Dịch vụ thực của Angular CLI đang định cấu hình webpack. Khi bạn chạy ng build
nó không nhiều hơn một proxy để khởi động Webpack). Đầu tiên, Webpack gọi trình biên dịch Typecript, sau đó là trình biên dịch góc (giả sử là AOT), tất cả trong khi gói mã của bạn cùng một lúc.
Mặc dù main.ts được sử dụng trong Tuyên bố ở trên để giải thích quy trình bootstrap, Ứng dụng angle không được khởi động hoặc bắt đầu sử dụng tệp .js Javascript?
Tôi không hoàn toàn chắc chắn những gì bạn đang hỏi ở đây. main.ts
sẽ được chuyển xuống Javascript. Javascript đó sẽ chứa một lời gọi bootstrap
là điểm vào Angular. Khi bootstrap
hoàn tất, bạn sẽ có ứng dụng Angular đầy đủ của mình đang chạy.
Bài đăng này cho biết Angular có hai trình biên dịch:
Xem trình biên dịch
Trình biên dịch mô-đun
Thành thật mà nói, tôi sẽ chỉ tuyên bố sự thiếu hiểu biết ở đây. Tôi nghĩ ở cấp độ của chúng ta, chúng ta có thể coi tất cả như một trình biên dịch lớn.
Có ai biết làm thế nào tất cả các bộ phận phù hợp với nhau về chiều sâu?
Tôi hy vọng ở trên thỏa mãn điều này.
Đừng @ Tôi: Angular làm nhiều hơn là tiêm phụ thuộc
Chắc chắn rồi. Nó thực hiện định tuyến, xây dựng chế độ xem, phát hiện thay đổi và tất cả các loại khác. Trình biên dịch thực sự tạo ra Javascript để xây dựng chế độ xem và phát hiện thay đổi. Tôi đã nói dối khi nói rằng đó chỉ là tiêm thuốc phụ thuộc. Tuy nhiên, phần phụ thuộc là cốt lõi và đủ để thúc đẩy phần còn lại của câu trả lời.
Chúng ta có nên gọi nó là một trình biên dịch không?
Nó có thể thực hiện rất nhiều phân tích cú pháp và ghép từ và chắc chắn tạo ra rất nhiều mã do đó bạn có thể gọi nó là một trình biên dịch vì lý do đó.
Mặt khác, nó không thực sự dịch mã của bạn thành một biểu diễn khác. Thay vào đó, nó là lấy một loạt các đoạn mã khác nhau và dệt chúng thành các mảnh có thể tiêu thụ được của một hệ thống lớn hơn. Quá trình bootstrap sau đó (sau khi biên dịch, nếu cần) sẽ lấy những phần đó và cắm chúng vào lõi Angular.
The compiler does actually generate
Javascript` để xây dựng chế độ xem và phát hiện thay đổi. `Đó không phải là một lời nói dối. Đó là những gì trình biên dịch không? Và góc cạnh không tiêm phụ thuộc.