Angular-Loiane-Training

Este repositorio contem exemplos documentados e descricoes dos conteudos estudados ao longo do curso de Angular da Loiane

View project on GitHub

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