Curso Profesional de Angular - Yessica54/carrera-front-end GitHub Wiki

Curso Profesional de Angular

Tabla de Contenido

¿Qué es Ivy?

Es un motor de angular 8 que permite crear aplicaciones mas pequeñas ya que al compilar este elimina el codigo que no estas usuando para activarlo se debe ir a tsconfig.json y agregar la siguiente instrucción

"angularCompilerOptions": {
    "enableIvy": true,
  }

Differential loading

Differential Loading es un proceso mediante el cual el navegador elige entre Javascript moderno o heredado en función de sus propias capacidades, es decir se crean dos paquetes a compilar uno para los navegadores modernos que permiten ES2015 > y un paquete para navegadores legacy o antiguos que solo admiten la versión de ES5 de Javascript.

El navegador cargará automáticamente el paquete que le corresponda, gracias al soporte de los módulos de ES6 en los navegadores más nuevos, por lo que tendrán que cargar menos código y cargar una cantidad mucho menor de polyfills.

CLI builders

Son aquellos que nos habilitan extender las funcionalidades del cliente de comandos de Angular (sobretodo correr tareas y correrlas a nuestro modo). 3 categorías de comandos:

Tareas de creación y modificación de código. ng new, ng generate, ng add, ng update. Tareas simples. ng help, ng version, ng doc Tareas complejas. ng serve, ng build, ng test, ng lint. los comandos de tareas complejas se abren para extender y hacerlo a nuestro manera. Ej. @angular/fire y @azure/ng-deploy

Patrón LIFT (Locate, Identify, Flat and Try DRY) y Naming

El patrón LIFT lleva la escalabilidad desde las buenas prácticas que Angular propone para mantener un proyecto organizado y estandarizado.

  • Locate: Expresa que debe haber una facilidad de encontrar los componentes, directivas, pipes, servicios, etc en la estructura del proyecto.
  • Identify: Se trata de reconocer rápidamente el rol que cumple cada uno de los archivos, es decir, colocarle ‘ apellido’ al archivo.
  • Flat: Mantener la estructura de nuestro proyecto de forma plana, con máximo 3 niveles de profundidad en la estructura de carpetas del proyecto.
  • Try DRY: Alienta la reutilización de código con el fin de tener un proyecto mantenible.

Smart and Dumb components

  • Dumb components Debe encargarse de la parte visual e interactiva, los dump components tienene de apellido .component
  • Smarti component: trae datos para mandarlos a al dump component, los smart compnents .container

Short imports con Typescript

Esto es para que los imports sean mas cortos y estéticos en nuestro código, así mismo en caso de refactorizar la estructura de el codigo no hay que ir a cambiar todos los imports para esto se debe ir al tsconfig.json y agregar una propiedad llamada paths ejemplo:

"paths": {
    "@core/*": ["src/app/core/*"],
  }

Para luego realizar las importaciones de la siguiente forma:

import {Product} "@core/models/product.model"

Evitando doble subscribe

Para evitar anidamientos de subscribe se usa la switchMap de Rxjs dentro de pipe (modifica un subcribe) esto lo hace es cambiar un subcribe por otro ejemplo:

this.route.params
.pipe(
   switchMap((params: Params)=>{
      return this.productServices.getProduct(params.id);
   })
)
.subscribe((product) =>{
   this.product = product;
})

Adicionalmente para reducir mas el código podemos convertir la variable this.product en un Observable dejando el código de la siguiente manera:

product$ : Observable<Product>

....

this.product$ = this.route.params
.pipe(
   switchMap((params: Params)=>{
      return this.productServices.getProduct(params.id);
   })
);

Y como ahora esta variable es un observable se tiene subcriber desde el template de la siguiente forma:

<div *ngIf=(product$ | async) as product>
 {{product.name}}
<(div>

Tipado en peticiones

Muchas peticiones están envueltas en meta-data o otros objectos, sin embargo desde nuestra peticiones queremos ignorar estas meta-data para ello podemos hacer lo siguiente:

getRamdomUsers() : Observable<User[]>{
 return this.http.get('url')
 .pipe(
     map((response: any) => response.result as User[])
  )
}

Manejo de errores

Manejo de errores con sentry

Este es un sistema en donde podemos registrar logs del sistema

Pruebas a providers y servicios HTTP

En pruebas se utiliza el pratron de las 3 A por sus siglas en ingles las cuales son Arranque, Actuar, resolver ejemplo de estas pruebas son:

// arranque 
const exptData = [{
    id: 1,
    title: "nombre",
    price: 200,
    description: "description",
    image: "url"
},{
    id: 2,
    title: "nombre2",
    price: 200,
    description: "description2",
    image: "url"
}]

//actuador

let dataError, dataResponse;

service.getAll().subcribre((response) => {
    dataResponse = response;
}, error => {
    dataError = error;
})

const req = httpTestController.expectOne('url')

req.flush(exptData);

//Hipotesis

expect(dataResponse.length).toEqual(2);

Reporte con Coverage

Esto ayuda a revisar que parte de codigo o flujos faltan por probar para correr ejecutar el siguiente comando

ng test --watch=false --codeCoverage=true
⚠️ **GitHub.com Fallback** ⚠️