Curso de Rendimiento en Angular - Yessica54/carrera-front-end GitHub Wiki

¿Qué es un bundle size? Tree shaking y su importancia

  • Bundle size: cuanto pesa en bytes la aplicacion
  • Lazy loading: fragmentar la aplicacion para cargarlas de a partes
  • Tree Shaking: eliminar el codigo que no se utiliza. eliminar codigo que no se utilice tanto con nuestro codigo y las librerias que utilicemos.

Implementando Webpack Bundle Analyzer

Se debe instalar la siguiente dependencia npm i webpack-bundle-analyzer --save-dev luego se debe generar una version de produccion con el comando ng build --prod --stats-json se debe verificar que quede el archivo stast-es2015.json se halla generado en la carpeta dist. se ejecuta el comando npx webpack-bundle-analyzer dist/aplication/stast-es2015.json para realizar el análisis, la ejecución nos indicara un puerto en donde podemos ver el análisis

Moment vs date-fns

Con bundlephobia.com podemos comparar librerias y utilizar las más convenientes para el peso de nuestro app con lo consiguiente reduciendo el tiempo de carga de la misma.

Aplicando un Performance Budget desde el Angular CLI

Performance Budget es una herramienta para colocar minimos de costo para nuestras aplicaciones. angular.json permite configurar el peso maximo de nuestros paquetes De igual manera no hace falta normalmente configurarlo ya que angular lo hace por nosotros budgets. Se puede ir al link perf-budget-calculator para visualizar el calculo del los archivos y te indica el tiempo de carga.

Code splitting a nivel de rutas

**PreLoadAllModules **: es una estrategia de carga el cual consiste en cargar todos los módulos de nuestra aplicación cuando el browser haya terminado de cargar nuestra pantalla inicial

@NgModule({
  imports: [RouterModule.forRoot(routes, {
    preloadingStrategy: PreloadAllModules
  })],
  exports: [RouterModule]
})

la consecuencia ocurre si nuestra aplicación es grande al tener muchos módulos esta estrategia es ineficiente ya que estamos cargando demasiados datos 

Implementando una propia estrategia de precarga

Para implementar una propia forma de precarga para eso se puedo agregar una bandera de esta forma:

...
  {
        path: 'home',
        loadChildren: () => import('./home/home.module').then(m => m.HomeModule),
        data: { preload: true }
      },
...

Se crea un servicio en manejar la precarga

import { Injectable } from '@angular/core';
import { PreloadingStrategy, Route } from '@angular/router';
import { Observable, of } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class PreloadService implements PreloadingStrategy {

  preload(route: Route, load: () => Observable<any>): Observable<any> {
    if (route.data && route.data['preload']) {
      return load();
    } else {
      return of();
    }
  }
}```

Para luego agregar en `app-routing.module.js`

```JS
@NgModule({
  imports: [RouterModule.forRoot(routes, {
    preloadingStrategy: PreloadService
  })],
  exports: [RouterModule]
})
export class AppRoutingModule { }

Implementando QuicklinkStrategy

QuicklinkStrategy detecta los link que estan en el viewport y precarga esos modulos utiliza IntersectionObserver para llevar a cabo su tarea. para eso es necesario instalar el siguiente componente

npm install gnx-quicklink --save

Importarlo en app.module y shared.module

// app.module.ts y tambien en shared.module.ts
import { QuicklinkStrategy } from 'ngx-quicklink'

@NgModule({
    ...
    imports: [
        ...
        QuicklinkModule
    ]
})

Implementar la estrategia en el app-routing

// app-routing.module.ts 
import { QuicklinkStrategy } from 'ngx-quicklink'

...
@NgModule({
    imports: [RouterModule.forRoot(routes, {
        enableTRacing: false,
        preloadingStrategy: QuicklinkStrategy,
        paramsInheritanceStrategy: 'always'
    })],
    exports: [RouterModule]
})
export class AppRoutingModule { }

Usando Machine Learning para predecir rutas

Las cadenas de Markov permiten visualizar cada una de las probabilidades que se tienen en la navegación de la aplicación. Evalúa la probabilidad que tiene cada una de las vistas de la aplicación frente a un comportamiento previo de los usuarios, generando un modelo de predicción de precarga de módulos, con el fin de mejorar el rendimiento y la experiencia de usuario mientras navega por la aplicación web desarrollada. Se puede utilizar la libreria Guess que utiliza datos de google analitys

Google Analytics y Angular

Nos dan un script que debemos colocar en el archivo index.html Es importante fijarse en la documentación para estos datos ya que van cambiando en el tiempo. dado que angular es una aplicacion de un pagina es necesario agregar una configuración en el app.module.ts para que cuando se cambio de ruta envíe la información necesaria a google, la configuración es la siguiente:

...
import {Route, NavegationEnd} from '@angular/route'
import {filter} from 'rxjs/operators'

declare var gtap;

...

export class AppComponet{

   constructor(private route: Route){
      const navEvent$ = this.route.events
      .pipe(
         filter(event => event instanceof NavegationEnd)
       );

       navEvent$.subscribe((event: NavegationEnd)  => {
          gtag('config', 'UA-323231-1',{
             page_path: event.urlAftenRedirects
          })
       })
      
   }
}

Precarga con Services workers

Esto sirve para cachear los archivos estaticos con los Services workers, para agregar Services workers a tu proyecto de angular se correo el comando ng add @angular/pwa --project *project-name* los pasos a seguir los puedes encontrar en a la Documentación de Oficial de Angular

¿Qué es Server Side Render?

Esto nos ayuda en el SEO, en el performance ya que el renderizador se hace desde el back no al cliente haciendo lo mas rápido la carga

Implementando Angular Universal (Server Side Render) SSR

Para iniciar un SSR es necesario ejecutar el siguiente comando ng add @nguniversal/express-engine --clientProject [your project name] la implementación de se revisa la Documentación Oficial de Angular. De igual forma hay que tener cuidado cuando se utilizan las siguientes variables window, document, navigator, or location ya que las aplicaciones desde lado del servidor no pueden hacer refencia a variables del navegador

¿Qué es el Change Detection?

⚠️ **GitHub.com Fallback** ⚠️