Lazy Loanding
Lazy loading e uma forma de aumentar a performance de uma aplicacao por meio do carregamento sob demanda. Outra vantagem e a segurance, pois, apenas o codigo da tela de login fica disponivel ate que o usuario insira credenciais validas.
Carregamento sem Lazy Loading
carragamento sem lazy loading.
Note que os arquivos que contem os codigos fonte em javascript
foram carregados por completo trazendo todo o codigo da aplicacao.
Carregamento com Lazy Loading
carragamento com lazy loading.
note que os arquivos principais sao carregados normalmente, entretando nao contem o codigo javascript
dos components declarados como Lazy Loading, os codigos de cada component sao carregados sob demanda.
Implementacao do Lazy Loading
As rotas que utilizaram o Lazy Loading devem ser declaradas no app.routing.module.ts
, da seguinte forma.
//...imports omitidos
const APP_ROUTES: Routes = [
{ path: 'cursos', loadChildren: 'app/_06-rotas/rotas/cursos/cursos.routing.module#CursosModule' }
]
@NgModule({
//...atributos de meta-data omitidos
})
export class AppRoutingModule {}
Para declarar uma rota que ira utilizar o Lazy Loading e necessario passar sua rota como valor para o atributo path
e o caminho a partir da pasta app
, para modulo de funcionalidades para o atributo loadChildren
separado por #
e em seguida o nome da classe, neste caso CursosModule
.
IMPORTANTE: ao utilizar declarar um modulo para ser carregado por Lazy Loading o mesmo nao pode ser importado em nenhum outro lugar da aplicacao (ou seja, imports em outros modulos devem ser removidos, inclusive no modulo raiz, app.module.ts
)
Todas as rotas declaradas no arquivo no modulo que sera carregado por Lazy Loading seram sub-rotas da rota principal.
//...imports omitidos
const CURSOS_ROUTES: Routes = [
{ path: '', component: CursosRotasComponent },
{ path: ':id', component: CursoDetalheComponent },
{ path: 'nao-encontrado', component: CursoNaoEncontradoComponent }
]
//...decorator @NgModule omitido
//...declaracao da class CursosModule omitida
Refatoracao das rotas imperativas
neste exemplo, as rotas completas sao as seguintes
- CursosRotasComponent: /cursos
- CursoDetalheComponent: /cursos/:id
- CursoNaoEncontradoComponent: /cursos/nao-encontrado
logo se houverem rotas imperativas com caminhos diferentes, sera necessaria a refatoracao.
Em nosso exemplo temos as seguintes refatoracoes
- cursos.component.html
<!-- ...codigo HTML omitido -->
[routerLink]="['/curso', curso.id]" <!-- atributo routerLink recebendo valor de rota antigo> -->
[routerLink]="['/cursos', curso.id]" <!-- atributo routerLink recebendo valor de rota novo> -->
<!-- ...codigo HMTL omitido -->
- curso.detalhe.component.ts
//...imports omitidos
// decorator @Component omitido
//...codigo omitido
ngOnInit(): void {
//...codigo omitido
// NAVEGACAO IMPERATIVA COM VALOR ANTIGO
// if(this.curso == null) this._router.navigate(['/nao-encontrado'])
// NAVEGACAO IMPERATIVA COM VALOR NOVO
if(this.curso == null) this._router.navigate(['/cursos/nao-encontrado'])
}
//...codigo omitido
}
Lazy Loading com Rotas Filhas
implementar Lazy Loading em components que possuem rotas filhas e relativamente mais simples, pois, ja possuem rotas padronizadas, conforme o exemplo.
//...imports omitidos
const ALUNOS_ROUTES: Routes = [
{
path: '',
component: AlunosComponent,
children: [
{ path: 'novo', component: AlunosFormComponent},
{ path: ':id', component: AlunoDetalheComponent },
{ path: ':id/editar', component: AlunosFormComponent }
]
},
]
//...decorator NgModule omitido
//...declaracao da classe AlunosModule omitida
as rotas para cada component completas estao de acordo com a lista abaixo
- AlunosComponent: /alunos
- AlunosFormComponent: /alunos/novo
- AlunosDetalheComponent: /alunos/:id
- AlunosFormComponent: /alunos/:id/editar
logo, podemos apenas declarar o modulo de alunos como Lazy Loading no modulo de rotas principal.
//...imports omitidos
const APP_ROUTES: Routes = [
{
path: 'cursos',
loadChildren: () =>
import('./_06-rotas/rotas/cursos/cursos.module').
then(mod => mod.CursosModule)
},
{
path: 'alunos',
loadChildren: () =>
import('./_06-rotas/rotas/alunos/alunos.module').
then(mod => mod.AlunosModule)
}
]
//...decorator NgModule omitido
//...declaracao da class AppRoutingModule omitida