Modulos - Angular
Nos temas anteriores, usamos componentes autônomos que existiam de forma independente. Podíamos importar e usar funcionalidades externas nesses componentes (por exemplo, o módulo FormsModule
Um módulo serve para agrupar vários componentes que têm uma tarefa em comum em uma única unidade. Uma aplicação Angular pode ser composta por diversos módulos. Nesse caso, um módulo é o principal, ou seja, o módulo raiz (root module). O primeiro módulo a ser carregado é o módulo principal, que, por convenção, é geralmente chamado de AppModule
Vamos aplicar essa abordagem. Suponha que temos um projeto com a seguinte estrutura:
helloapp/ |-- angular.json |-- package.json |-- tsconfig.json |-- node_modules/ |-- src/ |-- index.html |-- main.ts ---> Carrega o AppModule |-- app/ |-- app.module.ts ---> Carrega o AppComponent |-- app.component.ts
Comparado à estrutura padrão do projeto, que foi usada nos temas anteriores, aqui aparece um arquivo chamado app.module.ts
import { NgModule } from "@angular/core";
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { AppComponent } from './app.component';
@NgModule({
imports: [ BrowserModule, FormsModule ],
declarations: [ AppComponent ],
bootstrap: [ AppComponent ]
})
export class AppModule { }
Para o funcionamento do módulo, é necessário incluir algumas bibliotecas. Por isso, no início do arquivo, ocorre a importação delas. O nome de cada biblioteca Angular começa com o prefixo @angular
As bibliotecas são instaladas por meio do gerenciador de pacotes npm e importadas usando a diretiva import. Por exemplo, importamos a funcionalidade do decorador NgModule
@angular/core
import { NgModule } from "@angular/core";
Ou seja, precisamos importar todos os módulos e classes que este módulo utiliza. Em particular, para o AppModule, são necessários:
: funcionalidade do decoradorNgModule
, sem o qual não podemos criar um módulo.NgModule
: módulo necessário para trabalhar com o navegador.BrowserModule
: módulo necessário para trabalhar com formulários HTML e, em particular, com elementos input. (Como a classe do componente trabalha com esses elementos, somos obrigados a importar também este módulo).FormsModule
: funcionalidade do componente raiz da aplicação.AppComponent
O módulo em si é representado pela classe AppModule
export class AppModule { }
No entanto, no Angular, um módulo não é apenas uma classe. Cada módulo deve ser definido com o decorador @NgModule
NgModule
: classes de visualização (view classes) que pertencem ao módulo. O Angular possui três tipos de classes de visualização: componentes (components), diretivas (directives) e pipes.declarations
: conjunto de classes de visualização que devem ser usadas nos templates dos componentes de outros módulos.exports
: outros módulos, cujas classes são necessárias para os templates dos componentes do módulo atual.imports
: classes que criam os serviços utilizados pelo módulo.providers
: o componente raiz, que é chamado por padrão ao carregar a aplicação.bootstrap
No exemplo acima, a única classe de visualização é o componente AppComponent
declarations
bootstrap
BrowserModule
FormsModule
imports
O valor bootstrap: [ AppComponent ]
AppComponent
Mas, se necessário, poderíamos utilizar outras propriedades:
@NgModule({
imports: [ BrowserModule, FormsModule ],
declarations: [ AppComponent ],
bootstrap: [ AppComponent ],
exports: [ ],
providers: [ ]
})
No arquivo app.component.ts
AppComponent
import { Component } from "@angular/core";
@Component({
selector: "my-app",
template: `<label>Digite seu nome:</label>
<input [(ngModel)]="name" placeholder="nome">
<h1>Bem-vindo {{name}}!</h1>`
})
export class AppComponent {
name= '';
}
Note que este componente não é autônomo. Embora ele utilize a funcionalidade do módulo FormsModule
Carregando o Módulo
Ao iniciar a aplicação, o primeiro código a ser executado é o que está definido no arquivo main.ts
AppModule
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app/app.module';
const platform = platformBrowserDynamic();
platform.bootstrapModule(AppModule);
A primeira linha importa a funcionalidade do módulo platformBrowserDynamic
@angular/platform-browser-dynamic
platformBrowserDynamic
bootstrapModule
Na prática, o platformBrowserDynamic
AppModule
AppModule
Ao iniciar a aplicação, o módulo principal AppModule
AppComponent

Conclusão
O uso de módulos é uma abordagem alternativa para organizar o código em projetos Angular. No entanto, a equipe de desenvolvimento do Angular recomenda o uso de componentes autônomos, que são mais fáceis de manter e reutilizar. Além disso, a abordagem de módulos é mais complexa e menos flexível.
Portanto, nos próximos artigos, continuaremos utilizando componentes autônomos como a abordagem recomendada.