Quá trình tải chỉ mục. trang html, mô-đun cấp ứng dụng và thành phần cấp ứng dụng được gọi là khởi động hoặc tải ứng dụng. Trong hướng dẫn này, bạn sẽ tìm hiểu về nội bộ của quy trình bootstrapping
Angular thực hiện các bước sau để khởi động ứng dụng
- Chỉ số tải. html
- Tải góc, thư viện khác và mã ứng dụng
- thực hiện chính. tập tin ts
- Tải mô-đun cấp ứng dụng
- Tải thành phần cấp ứng dụng
- Mẫu quy trình
Chỉ số tải. html
Điểm bắt đầu của bất kỳ ứng dụng web Angular nào là chỉ mục. trang html. Trang này đề cập đến tất cả các tệp JavaScript cần thiết cho ứng dụng. Nếu bạn kiểm tra chỉ số. html sau khi xây dựng một dự án Angular, bạn sẽ thấy rằng nó có tham chiếu đến các tệp JavaScript, như được hiển thị bên dưới
1
2
3
4
5 GettingStarted
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Bạn sẽ nhận thấy rằng có hai phiên bản của mỗi tệp
- es2015
- es5
main.js
có mã ứng dụng trong đó.
thực hiện chính. mã js
Mã bên trong tệp ____29_______ là điểm nhập cho ứng dụng. Tệp này nhập mô-đun ____31_______ từ thư viện @angular/platform-browser-dynamic
. ______31_______ là mô-đun chịu trách nhiệm tải ứng dụng Angular trong trình duyệt máy tính để bàn. Tương tự như mô-đun này, mô-đun ____34_______ tải ứng dụng trên thiết bị di động. Angular đủ linh hoạt để chạy trong trình duyệt, máy chủ, công nhân web hoặc thiết bị di động.
Khi
0 được gọi, nó sẽ biên dịch 1bootstrapModule[moduleType: Type, options: CompilerOptions]: Promise {
2
3 return compileNgModuleFactory[this.injector, options, moduleType]
4 .then[[moduleFactory: NgModuleFactory] => {
5
6 // ...
7 }];
8}
1 . 1bootstrapModule[moduleType: Type, options: CompilerOptions]: Promise {
2
3 return compileNgModuleFactory[this.injector, options, moduleType]
4 .then[[moduleFactory: NgModuleFactory] => {
5
6 // ...
7 }];
8}
Mã cho hàm ____1_______2 như sau.
1bootstrapModule[moduleType: Type, options: CompilerOptions]: Promise {
2
3 return compileNgModuleFactory[this.injector, options, moduleType]
4 .then[[moduleFactory: NgModuleFactory] => {
5
6 // ...
7 }];
8}
Bạn sẽ nhận thấy rằng
2 đang gọi 1bootstrapModule[moduleType: Type, options: CompilerOptions]: Promise {
2
3 return compileNgModuleFactory[this.injector, options, moduleType]
4 .then[[moduleFactory: NgModuleFactory] => {
5
6 // ...
7 }];
8}
4 . 1bootstrapModule[moduleType: Type, options: CompilerOptions]: Promise {
2
3 return compileNgModuleFactory[this.injector, options, moduleType]
4 .then[[moduleFactory: NgModuleFactory] => {
5
6 // ...
7 }];
8}
1function compileNgModuleFactory[
2 injector: Injector,
3 options: CompilerOptions,
4 moduleType: Type
5 ]: Promise {
6
7 const compilerFactory: CompilerFactory = injector.get[CompilerFactory];
8 const compiler = compilerFactory.createCompiler[[options]];
9 return compiler.compileModuleAsync[moduleType];
10}
Đầu tiên, nó truy xuất một thể hiện của
5 từ bộ tiêm. ______1_______5 là một lớp trừu tượng chịu trách nhiệm tạo một thể hiện của trình biên dịch. Nếu ứng dụng Angular đang chạy ở chế độ nhà phát triển, thì một phiên bản của 1bootstrapModule[moduleType: Type, options: CompilerOptions]: Promise {
2
3 return compileNgModuleFactory[this.injector, options, moduleType]
4 .then[[moduleFactory: NgModuleFactory] => {
5
6 // ...
7 }];
8}
7 được tạo có mã sau. 1bootstrapModule[moduleType: Type, options: CompilerOptions]: Promise {
2
3 return compileNgModuleFactory[this.injector, options, moduleType]
4 .then[[moduleFactory: NgModuleFactory] => {
5
6 // ...
7 }];
8}
1export class JitCompiler {
2
3 private compileModuleAsync[moduleType: Type]: Promise {
4
5 return this._loadModules[moduleType]
6 .then[[] => {
7 this._compileComponents[moduleType];
8 return this._compileModule[moduleType];
9 }];
10 }
11}
Bạn sẽ nhận thấy rằng nó đang tải tất cả siêu dữ liệu mô-đun, chỉ thị và đường dẫn. Sau đó, nó biên dịch tất cả các thành phần. Trong quá trình biên dịch các thành phần, nó sẽ tìm kiếm tất cả siêu dữ liệu thành phần đã đăng ký trong ứng dụng và yêu cầu trình biên dịch biên dịch tất cả các mẫu thành phần ở một nơi. Điều cuối cùng nó làm là thực sự biên dịch mô-đun cấp ứng dụng. Ở giai đoạn này, Angular giải quyết tất cả các siêu dữ liệu cần thiết cho mô-đun và trả về nhà máy sản xuất mô-đun
Trước khi khởi động ứng dụng Angular, platformBrowserDynamic
cần tạo thư mục gốc
9. Root 1bootstrapModule[moduleType: Type, options: CompilerOptions]: Promise {
2
3 return compileNgModuleFactory[this.injector, options, moduleType]
4 .then[[moduleFactory: NgModuleFactory] => {
5
6 // ...
7 }];
8}
9 phải được khởi tạo ngay cả trước khi 1bootstrapModule[moduleType: Type, options: CompilerOptions]: Promise {
2
3 return compileNgModuleFactory[this.injector, options, moduleType]
4 .then[[moduleFactory: NgModuleFactory] => {
5
6 // ...
7 }];
8}
1 tạo, vì tất cả . 1bootstrapModule[moduleType: Type, options: CompilerOptions]: Promise {
2
3 return compileNgModuleFactory[this.injector, options, moduleType]
4 .then[[moduleFactory: NgModuleFactory] => {
5
6 // ...
7 }];
8}
Khi quá trình tạo gốc ____1_______9 hoàn tất, platformBrowserDynamic
instantiates the app-level module through the root module factory created as a result of the module compilation step.
Mọi ứng dụng Angular đều có ít nhất một mô-đun. Mô-đun được tải đầu tiên khi ứng dụng được tải được gọi là mô-đun cấp ứng dụng hoặc mô-đun gốc. ______31_______ khởi động mô-đun cấp ứng dụng bằng cách gọi hàm
2 và đưa ra . e ______1_______1 . 1bootstrapModule[moduleType: Type, options: CompilerOptions]: Promise {
2
3 return compileNgModuleFactory[this.injector, options, moduleType]
4 .then[[moduleFactory: NgModuleFactory] => {
5
6 // ...
7 }];
8}
Tải mô-đun cấp ứng dụng
Mô-đun cấp ứng dụng hoặc mô-đun gốc có một thành phần cấp ứng dụng hoặc thành phần gốc. Thành phần cấp ứng dụng hoặc thành phần gốc này được tải khi các mô-đun cấp ứng dụng được tải bởi Angular. Ngoài thành phần cấp ứng dụng, mô-đun này còn có tham chiếu đến tất cả các mô-đun bên ngoài được nhập bằng cách sử dụng mảng ______7_______7 . Mô-đun này cũng có tham chiếu đến tất cả các dịch vụ cần được tải dưới dạng đơn lẻ và sẽ khả dụng trên ứng dụng.
Thuộc tính
8 hoặc khóa của 1function compileNgModuleFactory[
2 injector: Injector,
3 options: CompilerOptions,
4 moduleType: Type
5 ]: Promise {
6
7 const compilerFactory: CompilerFactory = injector.get[CompilerFactory];
8 const compiler = compilerFactory.createCompiler[[options]];
9 return compiler.compileModuleAsync[moduleType];
10}
9 trang trí . Angular đọc siêu dữ liệu bootstrap và tải thành phần cấp ứng dụng, được gọi là 1function compileNgModuleFactory[
2 injector: Injector,
3 options: CompilerOptions,
4 moduleType: Type
5 ]: Promise {
6
7 const compilerFactory: CompilerFactory = injector.get[CompilerFactory];
8 const compiler = compilerFactory.createCompiler[[options]];
9 return compiler.compileModuleAsync[moduleType];
10}
0 . 1export class JitCompiler {
2
3 private compileModuleAsync[moduleType: Type]: Promise {
4
5 return this._loadModules[moduleType]
6 .then[[] => {
7 this._compileComponents[moduleType];
8 return this._compileModule[moduleType];
9 }];
10 }
11}
Tải thành phần cấp ứng dụng
Lớp TypeScript của thành phần cấp ứng dụng, được gọi là
0 , được trang trí bằng 1export class JitCompiler {
2
3 private compileModuleAsync[moduleType: Type]: Promise {
4
5 return this._loadModules[moduleType]
6 .then[[] => {
7 this._compileComponents[moduleType];
8 return this._compileModule[moduleType];
9 }];
10 }
11}
2 . Trình trang trí lớp class decorator. The ______11_______2 cung cấp siêu dữ liệu về lớp cho Angular. Nó có ba thuộc tính sau. 1export class JitCompiler {
2
3 private compileModuleAsync[moduleType: Type]: Promise {
4
5 return this._loadModules[moduleType]
6 .then[[] => {
7 this._compileComponents[moduleType];
8 return this._compileModule[moduleType];
9 }];
10 }
11}
- bộ chọn
- mẫuURL
- phong cáchUrl
Nếu bạn đang đưa một dịch vụ vào thành phần này, thì bạn cũng sẽ có một thuộc tính thứ tư, tham chiếu đến dịch vụ sẽ được đưa vào hàm tạo của lớp này. Thuộc tính thứ tư được gọi là ____11_______4 . Nó là một mảng các lớp dịch vụ sẽ được đưa vào thành phần này.
Mẫu quy trình
Thuộc tính
5 trỏ đến tệp mẫu HTML, tệp này sẽ được hiển thị cho trình duyệt khi thành phần này được xử lý. Thuộc tính ____11_______6 chỉ định bộ chọn CSS, nơi mẫu sẽ được chèn vào HTML. 1export class JitCompiler {
2
3 private compileModuleAsync[moduleType: Type]: Promise {
4
5 return this._loadModules[moduleType]
6 .then[[] => {
7 this._compileComponents[moduleType];
8 return this._compileModule[moduleType];
9 }];
10 }
11}
Sau khi platformBrowserDynamic
hoàn tất mọi bước chuẩn bị, nó sẵn sàng khởi tạo thành phần cấp ứng dụng hoặc thành phần gốc. ______31_______ sau đó chỉ cần lặp qua mảng thành phần bootstrap và yêu cầu
9 thực sự . 1export class JitCompiler {
2
3 private compileModuleAsync[moduleType: Type]: Promise {
4
5 return this._loadModules[moduleType]
6 .then[[] => {
7 this._compileComponents[moduleType];
8 return this._compileModule[moduleType];
9 }];
10 }
11}
Phần kết luận
Xin chúc mừng. Bạn đã tìm hiểu về nội bộ quy trình bootstrap của Angular. Để biết thêm thông tin, vui lòng tham khảo bootstrapping trong Angular