Biên dịch Just-in-Time (JiT) vs Ahead-of-Time (AoT) trong Angular


111

Tôi đã tham khảo tài liệu này và xem qua khái niệm biên dịch. Người ta có thể sử dụng biên dịch JIT hoặc AOT. Tuy nhiên, tôi thấy nó rất ngắn gọn và cần biết chi tiết những điểm sau,

  • Sự khác biệt giữa hai kỹ thuật đó
  • Khuyến nghị về thời điểm sử dụng những gì

Câu trả lời:


148

JIT - Biên dịch TypeScript đúng lúc để thực thi nó.

  • Tổng hợp trên trình duyệt.
  • Mỗi tệp được biên dịch riêng biệt.
  • Không cần tạo sau khi thay đổi mã của bạn và trước khi tải lại trang trình duyệt.
  • Phù hợp với sự phát triển của địa phương.

AOT - Biên dịch TypeScript trong giai đoạn xây dựng.

  • Do máy tự biên dịch, thông qua dòng lệnh (Faster).
  • Tất cả mã được biên dịch cùng nhau, nội tuyến HTML / CSS trong các tập lệnh.
  • Không cần triển khai trình biên dịch (Một nửa kích thước Angular).
  • An toàn hơn, nguồn gốc không tiết lộ.
  • Thích hợp cho các công trình sản xuất.

2
Ngoài ra, tôi gặp phải hiệu suất rất kém khi sử dụng tính năng biên dịch Just-in-Time, đặc biệt là trên các thiết bị Android cũ hơn. Ngoài ra, khoảng cách hiển thị khi tải trang đầu tiên lớn hơn nhiều (Trên các thiết bị Android cũ hơn lên đến 10 giây tùy thuộc vào quy mô dự án của bạn).
Felix Hagspiel

29
Typecript không được biên dịch đúng lúc, trình duyệt không thể làm điều đó. Trong cả hai trường hợp, tập lệnh được biên dịch trong quá trình xây dựng.
Robouste

2
@Robouste: Đây chính xác là điều khiến tôi bối rối .. Những gì thực sự được biên dịch trước thời hạn và đúng lúc .. (nếu TJS được biên dịch ngay lập tức). Khi tôi yêu cầu một trang trong trình thám hiểm, javascript sẽ được tải xuống và thực thi trong trình duyệt, Có bất kỳ typedJ nào cần đến trình duyệt không ??? không, không hề ... Vì vậy, những gì đang được biên soạn trước thời hạn và đúng lúc .. ?? Nó thực sự là trình biên dịch góc cạnh có nghĩa là. liên kết này sẽ trả lời tất cả các câu hỏi: " angle.io/guide/aot-compiler "
Assil

2
Tôi không phải là chuyên gia nhưng khi sử dụng JIT, các nguồn Angular được gửi đến trình duyệt và nó sẽ biên dịch ứng dụng. Nó cho phép bạn có nội dung động cần được biên dịch trong thời gian chạy. Với AOT, mọi thứ đều được biên dịch trước để máy chủ đang gửi một trang web javascript chung. Bạn đạt được tốc độ thực thi và thời gian tải thấp hơn.
Robouste

câu trả lời tuyệt vời, Nhận xét cũng hữu ích cho tôi.
Rakshit Shah

61

Mặc dù có một số câu trả lời nhưng tôi cũng muốn bổ sung một số phát hiện của mình, bởi vì tôi thực sự bối rối với những gì thực sự đang được biên dịch như trong tất cả các trường hợp, TS-> JSchuyển đổi xảy ra. Tôi đang lấy một số para từ blog của Jeff làm tài liệu tham khảo.

JIT

Các TSmã được viết bởi các nhà phát triển được biên soạn để JSmã. Giờ đây, jsmã đã biên dịch này được trình duyệt biên dịch lại để htmlcó thể hiển thị động theo hành động của người dùng và theo đó mã cho angular (đối với các thành phần, phát hiện thay đổi, Chèn phụ thuộc) cũng được tạo trong thời gian chạy.

(Trình biên dịch trình duyệt là thứ nhận các chỉ thị và thành phần của ứng dụng, cùng với HTML và CSS tương ứng của chúng, đồng thời tạo ra các nhà máy sản xuất thành phần để nhanh chóng loại bỏ các phiên bản với tất cả logic tạo chế độ xem của chúng.)

Khi một ứng dụng Angular 2 được khởi động trong trình duyệt, trình biên dịch JIT thực hiện rất nhiều công việc để phân tích các thành phần trong ứng dụng trong thời gian chạy và tạo mã trong bộ nhớ. Khi trang được làm mới, tất cả công việc đã hoàn thành sẽ bị loại bỏ và trình biên dịch JIT thực hiện lại công việc.

AOT

Các TSmã được viết bởi các nhà phát triển được biên soạn để JSmã, này js đã được biên soạn cho góc cũng . Bây giờ, mã đã biên dịch js này được trình duyệt biên dịch lại để htmlcó thể hiển thị. Tuy nhiên, điểm nổi bật ở đây là các tính năng của angularđã được AOTtrình biên dịch xử lý và do đó trình duyệt không phải lo lắng nhiều về việc tạo thành phần, phát hiện thay đổi, Dependency Injection. Vì vậy chúng tôi có :

Kết xuất nhanh hơn

Với AOT, trình duyệt tải xuống phiên bản được biên dịch trước của ứng dụng. Trình duyệt tải mã thực thi để có thể hiển thị ứng dụng ngay lập tức mà không cần đợi biên dịch ứng dụng trước.

Ít yêu cầu không đồng bộ hơn

Trình biên dịch nội tuyến các mẫu HTML bên ngoài và các biểu định kiểu CSS trong JavaScript ứng dụng, loại bỏ các yêu cầu ajax riêng biệt cho các tệp nguồn đó.

Kích thước tải xuống khung Angular nhỏ hơn

Không cần tải xuống trình biên dịch Angular nếu ứng dụng đã được biên dịch. Trình biên dịch gần bằng một nửa Angular, vì vậy việc bỏ qua nó sẽ giảm đáng kể tải ứng dụng.

Phát hiện lỗi mẫu sớm hơn

Trình biên dịch AOT phát hiện và báo cáo lỗi liên kết mẫu trong bước xây dựng trước khi người dùng có thể nhìn thấy chúng.

An ninh tốt hơn

AOT biên dịch các mẫu và thành phần HTML thành các tệp JavaScript rất lâu trước khi chúng được cung cấp cho máy khách. Không có mẫu để đọc và không có đánh giá HTML hoặc JavaScript phía máy khách rủi ro, có ít cơ hội hơn cho các cuộc tấn công tiêm.


Sự khác biệt còn lại đã được bao gồm trong các gạch đầu dòng của Benyamin, Nisar & Gaurang.

Vui lòng sửa cho tôi


5
Cảm ơn. Cuối cùng tôi đã hiểu sau khi đọc câu trả lời của bạn và tôi đã đọc rất nhiều trong số chúng.
Mario Subotic

24

Benyamin và Nisar đã đề cập đến một số điểm tốt ở đây. Tôi sẽ thêm vào nó.

Về mặt lý thuyết, AOT có vẻ là một lựa chọn hấp dẫn hơn JIT cho mục đích sản xuất nhưng tôi đã nghi ngờ liệu AOT có thực sự xứng đáng hay không!

Chà, tôi đã tìm thấy số liệu thống kê tuyệt vời của Jeff Cross và điều đó chứng minh rằng AOT làm giảm đáng kể thời gian khởi động của ứng dụng. Ảnh chụp dưới đây từ bài đăng của Jeff Cross sẽ cung cấp cho bạn ý tưởng nhanh về nó,

nhập mô tả hình ảnh ở đây


19

JiT (Just in Time) Biên dịch

Bản thân cái tên mô tả hoạt động, Nó biên dịch mã chỉ trong thời gian tải trang trong trình duyệt. Trình duyệt sẽ tải xuống trình biên dịch và xây dựng mã ứng dụng và kết xuất nó.

Nó sẽ tốt cho môi trường phát triển.

Tổng hợp AoT (Trước thời gian)

Nó biên dịch tất cả mã tại thời điểm xây dựng ứng dụng. Vì vậy, trình duyệt không muốn tải xuống trình biên dịch và biên dịch mã. Trong phương pháp này, trình duyệt có thể dễ dàng hiển thị ứng dụng bằng cách tải mã đã được biên dịch.

Có thể được sử dụng trong môi trường sản xuất

Chúng ta có thể so sánh việc biên dịch JiT và AoT như bên dưới

nhập mô tả hình ảnh ở đây


1
Điều này có nghĩa là ứng dụng JiT sẽ tải nhanh hơn lần đầu tiên nhưng sau đó ứng dụng AoT sẽ luôn tải nhanh hơn?
JKL

Không bao giờ. JiT tải chậm hơn AoT
vivekkurien 13/1118

AOT chậm hơn JIT vì nó không tuân theo thời gian chạy. bạn phải thay đổi tiêu đề
jit

câu trả lời tuyệt vời !! : +1 cảm ơn!
Mateen

17

JIT (Tổng hợp kịp thời)

Just-in-Time (JIT) là một loại biên dịch biên dịch ứng dụng của bạn trong trình duyệt khi chạy.

ng build
ng serve

nhập mô tả hình ảnh ở đây

AOT (Biên dịch trước thời gian)

Trước thời gian (AOT) là một loại biên dịch sẽ biên dịch ứng dụng của bạn tại thời điểm xây dựng.

ng build --aot
ng serve --aot

nhập mô tả hình ảnh ở đây


2
sự khác biệt giữa 2 số liệu này là gì? nó không cần giới thiệu?
Mr.AF

Vì vậy, về cơ bản Ahead-of-Time giống với Ahead of-Runtime hơn.
Alireza Kahaei

@ Mr.AF mới nhận thấy rằng bây giờ cũng vậy, hình ảnh giống nhau.
Tiago Martins Peres 李大仁

14

Vào cuối ngày, AOT (Trước thời gian) và JIT (Đúng lúc) làm những việc tương tự. Cả hai đều biên dịch mã Angular của bạn để nó có thể chạy trong môi trường gốc (hay còn gọi là trình duyệt). Sự khác biệt chính là khi quá trình biên dịch xảy ra. Với AOT, mã của bạn được biên dịch trước khi Ứng dụng được tải xuống trong Trình duyệt. Với JIT, mã của bạn được biên dịch trong thời gian chạy trên trình duyệt.

Đây là so sánh: nhập mô tả hình ảnh ở đây

Lợi ích của AOT:

  • Khởi động nhanh hơn khi phân tích cú pháp và biên dịch không xảy ra trong Trình duyệt.
  • Các mẫu được kiểm tra trong quá trình phát triển (có nghĩa là tất cả các lỗi mà chúng tôi thấy trong bảng điều khiển javascript trong các ứng dụng đang chạy sau đó sẽ được đưa vào quá trình xây dựng của chúng tôi).
  • Kích thước tệp nhỏ hơn vì các Tính năng không sử dụng có thể bị loại bỏ và bản thân Trình biên dịch không được vận chuyển.

4

Thực tế chỉ có một trình biên dịch Angular. Sự khác biệt giữa AOT và JIT là vấn đề thời gian và công cụ. Với AOT, trình biên dịch chạy một lần cùng lúc bằng cách sử dụng một bộ thư viện; với JIT, nó chạy mọi lúc cho mọi người dùng trong thời gian chạy bằng cách sử dụng một bộ thư viện khác nhau.


2

Trình biên dịch JIT chúng tôi sử dụng trong quá trình phát triển dự án góc. Trong quá trình biên dịch này (chuyển đổi TS sang JS) xảy ra trong thời gian chạy của ứng dụng. Khi AOT được sử dụng trong quá trình xây dựng mã ứng dụng để triển khai ứng dụng trong sản xuất, thời điểm đó chúng tôi tạo mã ứng dụng của mình bằng cách sử dụng lệnh ng build --prod để tạo một thư mục có tên là webpack, webpack chứa gói tất cả các tệp (HTML , CSS và typecript) ở định dạng javascript nén.

Kích thước của thư mục webpack được tạo cho sản xuất nhỏ hơn nhiều so với thư mục được tạo cho môi trường phát triển (sử dụng lệnh ... ng build), bởi vì Nó không chứa trình biên dịch bên trong thư mục webpack, Nó cải thiện hiệu suất của ứng dụng .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.