本篇文章給大家了解一下angular10中的模組,介紹一下模組構成、ngModule 屬性、常用模組、angualr模組和js模組的區別以及模組懶加載,下面來一起看看。
NgModule 模組是Angular種一個重要的點,因為Angular的基本建構塊就是NgModule。 NgModule 會把相關的程式碼(元件,指令,服務)收集到一些功能集中,形成功能單元。可以說:模組為元件,指令,服務提供了編譯的上下文環境。 【相關教學推薦:《angular教學》】
在使用Angular CL 指令新建一個專案的時候,會給我們產生一個根模組,命名為AppModule,根模組有一個根元件AppComponent,引導這個根模組就可以啟動應用。 Angular 應用是模組化的,我們在開發中會根據其功能 作用 以及其特性,建立大大小小各種模組,從而構建其成為一個應用程序,任何模組都能包含任意數量的其它組件。
angular模組就是一個帶有@ngModule() 裝飾器的類,裝飾器@ngModule接受一個元資料物件。該物件的屬性用來描述該模組。
import { BrowserModule } from '@angular/platform-browser'; //从主模块中引入NgModule(模块装饰器或模块注解) import { NgModule } from '@angular/core'; //引入组件,因为模块为组件提供编译的上下文环境 import { AppComponent } from './app.component'; // 引入路由模块 import { AppRoutingModule } from './app-routing.module'; //装饰器以json的形式声明元数据 @NgModule({ //组合模块的组件和管道 declarations: [ AppComponent ], //模块依赖项 imports: [ BrowserModule,AppRoutingModule ], //子模块可以输入导出的模块 imports: [], //模块提供的服务 providers: [], //指定宿主组件,只在根模块中出现 bootstrap: [AppComponent] }) export class AppModule { }
點進去@NgModule() 裝飾器的類別我們可以看到他有以下屬性以及官方的對其屬性的解釋。
export declare interface NgModule { providers?: Provider[];// 本模块向全局服务中贡献的那些服务的创建器。 这些服务能被本应用中的任何部分使用。(你也可以在组件级别指定服务提供商,这通常是首选方式。) declarations?: Array<Type<any> | any[]>;// 那些属于本 NgModule 的组件、指令、管道 imports?: Array<Type<any> | ModuleWithProviders<{}> | any[]>;// 那些导出了本模块中的组件模板所需的类的其它模块 exports?: Array<Type<any> | any[]>;//那些能在其它模块的组件模板中使用的可声明对象的子集 entryComponents?: Array<Type<any> | any[]>; bootstrap?: Array<Type<any> | any[]>; schemas?: Array<SchemaMetadata | any[]>; }
#providers:將本模組所有在元件中註入的服務,在這裡提前定義好,否則在此模組中使用此服務會有錯誤提示。
declaration:declaration 英文意思為宣告。在這裡聲明一些模組中要使用到的一些元件,指令,管道等。
imports:導入一些模組,比如說我把所有的指令構成一個模組 我使用其中某些指令的時候,我可以選擇導入整個指令模組。也可以導入一些透過npm install 安裝的一些模組導入其中,才可以使用。
exports:匯出元件or指令管道等,以供引用此模組的模組可以使用此模組的元件or 指令管道等。
exporyComponents:entry component 表示 angular 的入口元件,可以引導元件是一個入口元件,Angular 會在引導過程中把它載入到 DOM 中。其它入口組件是在其它時機動態載入的。字面上的意義,但是啥時候用呢,比如,我要彈出一個元件,那麼這個元件是要動態載入到DOM中了吧,這個時候就需要將這個元件xxxComponent寫上了。
bootstrap:這個模組啟動的時候應該啟動的元件,上面程式碼可以看到AppModule是作為根模組的啟動元件。
schemas:不屬於Angular的元件或指令的元素或屬性都需要在這裡進行宣告。
#NgModule | 導入 | 使用 |
---|---|---|
BrowserModule | @angular/platform-browser | 想要在瀏覽器中執行應用程式時 |
CommonModule | @angular/common | 當你想要使用NgIf 和NgFor 時 |
FormsModule | @angular/forms | 當要建立範本驅動表單時(它包含NgModel ) |
ReactiveFormsModule | @angular/forms | 當要建立響應式表單時 |
RouterModule | @angular/router | 要使用路由功能,並且要使用到RouterLink ,.forRoot() 和.forChild() 時 |
HttpClientModule | @angular/common/http | #當你要和伺服器對話時 |
ng generate module <module-name> //创建一个模块 ng g m <module-name> // 缩写 ng g m order // 创建订单模块 ng g m order --routing // 创建带路由订单模块
js模块(ES6 中的模块)
模块功能主要由两个命令构成:export和import,export命令用于规定模块的对外接口,import命令用于输入其他模块提供的功能
一般来说,一个模块就是一个独立的文件,该文件内部的所有变量,外部无法获取,如果你希望外部能够读取模块内部的某个变量,就必须使用export关键字输出该变量
// profile.js export var firstName = 'Michael'; export var lastName = 'Jackson'; export var year = 1958; // 优先考虑下面写法 var firstName = 'Michael'; var lastName = 'Jackson'; var year = 1958; export {firstName,lastName, year}
export 命令除了可以导出变量,还可以导出函数和类(class)
function a () {...} function b () {...} export { a, b as b_ // 通过as关键字重命名对外接口 }
使用export命令定义了模块的对外接口后,其他js文件就可以通过import命令来加载这个模块了。
// main.js import {firstName, lastName, year} from './profile.js'; function setName(element) { element.textContent = firstName + ' ' + lastName; }
import命令接受一对大括号,里面指定要从其他模块导入的变量名。大括号里面的变量名,必须与被导入模块(profile.js)对外接口的名称相同
我们也可以对加载的模块进行重命名
import { lastName as surname } from './profile.js';
除了指定加载某个输出值,还可以使用整体加载,即用星号(*)指定一个对象,所有输出值都加载在这个对象上面
// circle.js export function area(radius) { return Math.PI * radius * radius; } export function circumference(radius) { return 2 * Math.PI * radius; } // 使用 import * as circle from './circle'; console.log('圆面积:' + circle.area(4)); console.log('圆周长:' + circle.circumference(14))
这里有一个地方需要注意,模块整体加载所在的那个对象(上例是circle),应该是可以静态分析的,所以不允许运行时改变,下面的写法都是不允许的
import * as circle from './circle'; // 下面两行都是不允许的 circle.foo = 'hello'; circle.area = function () {};
angualr模块
angualr模块在文章开头有作介绍(angualr模块概述和angualr模块构成)
NgModule 类 与 JavaScript 模块有下列关键性的不同:
相比之下我们可以看出,NgModule模块更灵活,扩展性强,更具优势。
如果我们将所有的模块都导入根模块,那么应用在初始化加载的时候就会非常慢。这时候我们应该考虑使用惰性加载。根据需求加载相应都模块,减少应用初始化包的大小以及减少加载的时间,提高用户体验性。
惰性加载的模块特点是该模块拥有路由模块。因此 接着上面我们创建了一个订单模块 我们给订单模块加上路由。并再创建一个user.module以及user.module模块下的list组件。
ng g m user --routing //创建user模块 ng g c user/list --skip-tests //在user模块里面创建组件list
<!--order.module 订单模块--> import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; //为一些结构性指令提供支持 import { OrderRoutingModule } from './order-routing.module'; //模块具有自己的路由 import { ListComponent } from './list/list.component'; //引入list组件 @NgModule({ declarations: [ListComponent], imports: [ CommonModule, OrderRoutingModule ] }) export class OrderModule { }
配置子路由
<!--order-routing.module 订单模块对应的路由模块--> import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; import { ListComponent } from './list/list.component'; const routes: Routes = [ //子路由的组件配置 { path: 'list', component: ListComponent }, ]; @NgModule({ imports: [RouterModule.forChild(routes)], exports: [RouterModule] }) export class OrderRoutingModule { }
user模块如此类推
配置总路由(重点,掌握)
<!--AppRoutingModule 根路由模块--> import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; const routes: Routes = [ //根路由的配置 { path: 'orders', loadChildren: './order/order.module#OrderModule' // 配置订单子模块 }, { path: 'users', loadChildren: './user/user.module#UserModule' // 配置用户子模块 } ]; @NgModule({ imports: [RouterModule.forRoot(routes)], exports: [RouterModule] }) export class AppRoutingModule { }
我们给app.component.html新增两个button
<!--The content below is only a placeholder and can be replaced.--> <div style="text-align:center"> <h2> Welcome to {{ title }}! </h2> </div> <button routerLink="/user/list">user</button> //路由跳转 <button routerLink="/order/list">order</button> <router-outlet></router-outlet>
惰性加载模块有什么好处呢?
在大型项目中往往有许多个模块,而且大很大。如果一个模块1m,如果我们在浏览器输入地址打开这个应用,瞬间要加载100m 是非常慢的,而且我们并非要是用到着这100个模块。
将系统业务拆分为各个模块,划分好界限。按需加载,我点击了user 就加载user 模块,页面出现user 列表,对user进行操作。当我需要使用时才加载,极大的减少了页面初始加载的时间以及减少了资源的消耗。
共享模块顾名思义,就是共享于所有的模块中。首先得定义好这个模块的具体功能特性,比如指令、管道和组件等分别封装成一个个模块,哪些业务模块需要使用到其里面的功能便导入其模块中便可。 这极大的规范了系统的统一性和降低了以后的维护成本。
如果你引入了第三方UI,就不要把UI引入共享模块中导出,这样你的共享模块越来越庞大。别人UI框架设计的初衷就是按需加载。你把UI组件放到共享模块,加载那些无关的的UI组件,会浪费掉大量的性能。
更多程式相關知識,請造訪:程式設計影片! !
以上是了解angular10模組相關概念,快速入門!的詳細內容。更多資訊請關注PHP中文網其他相關文章!