SlideShare una empresa de Scribd logo
1 de 61
BUENAS
PRACTICAS
EN ANGULAR
Angular y .NET, arquitectura y buenas prácticas
Juan G Carmona
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
MÓDULO 2
Angular y .NET, arquitectura y buenas prácticas
Juan G Carmona
MÓDULO 2
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Angular y .NET, arquitectura y buenas prácticas
Juan G Carmona
MÓDULO 2
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Angular y .NET, arquitectura y buenas prácticas
Juan G Carmona
MÓDULO 2
 ESTRUCTURA FÍSICA
 ESTRUCTURA LÓGICA
 SINTAXIS
 PERFORMANCE
 SEGURIDAD
BUENAS PRACTICAS
EN ANGULAR
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
ESTRUCTURA
FÍSICA
Angular y .NET, arquitectura y buenas prácticas
Juan G Carmona
MÓDULO 2
BUENAS PRACTICAS
EN ANGULAR
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Aplicar SRP en archivos
 SRP  Single Responsibility Principle
 Cada archivo tiene un único propósito  Responsabilidad
 Componentes
 Plantillas
 Servicios
 Pipes
 (etc)
 Nos permite crear un código limpio, legible y mantenible
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Cuidar los nombres de archivos y
carpetas
 Los nombres deben seguir el mismo patrón, con la característica del archivo
en primer lugar, seguida del tipo, separados por un punto.
 Ej:
 dashboard.component.ts
 Auth.service.ts
 Si el nombre es compuesto utilizar ‘-’:
 Ej:
 article-list.component.ts
 cookie-consent.component.scss
 El nombre de una carpeta debe describir su contenido
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Usar path alias
 Simplifican las rutas
 Código más fácil de leer y mantener.
 tsconfig.ts
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Usar index.ts
 No es crítico, es recomendable
 Ayuda a mantener todos los archivos correlacionados en una única ubicación.
 Simplifica la importación porque no necesitamos recordar todas las rutas
 Imaginemos el módulo article, y dentro de él modelos, servicios, componentes…
 Imaginemos entonces este index.ts en src/modules/article
 Podríamos desde cualquier parte de nuestro código hacer algo similar a:
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Estructura de carpetas adecuada
 Es una decisión crítica
 Debe tomarse antes de comenzar el proyecto
 Flexible y preparada para los cambios
“Have a near-term view of implementation and a long-term vision. Start
small but keep in mind where the application is heading.”
-- https://angular.io/guide/styleguide --
¿Qué aspecto tiene
esa estructura de
carpetas adecuada?
Mantener el código lo más cerca posible
de donde se usa es una buena práctica.
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Angular y .NET, arquitectura y buenas prácticas
Juan G Carmona
MÓDULO 2
ESTRUCTURA
LÓGICA
BUENAS PRACTICAS
EN ANGULAR
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Aplicar SRP en componentes
 Los componentes grandes añaden complejidad
 Dividirlos en otros más pequeños componentes reutilizables.
 Simplifica su gestión, mantenimiento y depuración
 Pero…
 ¿Qué tipo de componentes hay?
 ¿Cómo se comunican?
 ¿Cómo puedo hacer que mis componentes sean reutilizables?
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Usar componentes listos y tontos
 LISTOS (SMART)
 Gestionan datos
 resolver | service | state
 Comunican hacia abajo
 Manejan/gestionan hacia arriba
 Niveles
 Páginas: DashboardPageComponent  dashboard-page.component.ts
 Views: ViewArticleComponent  view-article.component.ts
 TONTOS (DUMB)
 Reciben datos (@Input)
 Los presentan
 Emiten eventos (@Output)
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Usar Variables de Entorno
 Múltiples entornos
 Múltiples configuraciones
 Por defecto
 Development
 Production
 Podemos añadir más
 Añaden seguridad
 Durante el desarrollo
 DevOps  Reemplazo al pasar a producción
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Usar carga perezosa
 Aceleramos la carga inicial
 Retrasamos la carga de archivos concretos
 Strategias
 Lazy Loading
 Eager Lazy Loading
LAZY LOADING
ROCKS!
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Usar un gestor de Estado
 REDUX es un patrón  Single Source of Trust
 Multiples librerías (NgRx, NGXS)
PATRÓN REDUX
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Estrategia de módulos adecuada
 Es una decisión crítica
 Debe tomarse antes de comenzar el proyecto
 ¿Opciones?
 Todo en un módulo
 Un módulo por característica / vista (Lazy Laoding)
 Un módulo por componente (SCAM)
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
¿Cómo elegir
nuestra estrategia
de Módulos?
Angular y .NET, arquitectura y buenas prácticas
Juan G Carmona
MÓDULO 2
ESTRATEGIAS
PARA
MODULARIZAR
BUENAS PRACTICAS
EN ANGULAR
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Estrategia de módulos adecuada
 Es una decisión crítica
 Debe tomarse antes de comenzar el proyecto
 ¿Opciones?
 Todo en un módulo
 Un módulo por componente (SCAM)
 Un módulo por característica / vista
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Angular Modules Best Practices 2021 – by Christian Kohler
Todo en un módulo
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Single Module output
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
 Desventajas:
 Tamaño
 Tiempo de carga
 Seguridad
 Mantenimiento
 Testing
 ¿Cuándo podemos utilizar esta estrategia?
 Aplicaciones muy pequeñas y simples
(por ejemplo PoC’s o DEMOS)
Un módulo por componente (SCAM)
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Single Component Angular Module
 Lars Gyrup Brink Nielsen  SCAM
SCAM output
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
 Beneficios:
 Gestión de dependencias
 Tamaños
 Tiempo
 Patrón
 Desventajas:
 Demasiado boilerplate
Un módulo por característica (MPF)
 Es el patrón más común
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
MPF output
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
 Beneficios:
 Tamaño óptimo de paquetes
 Subdividible (jerarquía de módulos)
 Mejor mantenimiento
 NOTA: es el recomendado en la documentación oficial
¿Cuál elegir?
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Angular Modules Best Practices 2021 – by Christian Kohler
 Para una librería parece preferible usar SCAM
 Para una app
 Si es muy simple
(< 10 componentes)  Single Module
 Si no: MPF | SCAM
¿Cómo afecta esto a nuestra estructura
de carpetas?
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Angular y .NET, arquitectura y buenas prácticas
Juan G Carmona
MÓDULO 2
SINTAXIS
BUENAS PRACTICAS
EN ANGULAR
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Seguir la guía de estilo
 Max 400 líneas por archivo
 Max 75 líneas por método.
 Convención con nombres de ficheros y clases "const" vs “let”
 Organización dentro de la clase
 Colocar las propiedades arriba, seguídas de los métodfos
 Colocar los métodos privados después de los públicos y
ordenados alfabéticamente
 Casing (camelCase vs PascalCase)
 (etc…) ;)
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
https://angular.io/guide/styleguide
Aprovechar las características de ES6
 Algunos de los aspectos más destacados:
 Clases
 Funciones flecha
 Template strings
 Herencia
 Ámbito de bloque en variables y constantes
 Spread operator and rest parameters (‘…’)
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
https://angular-training-guide.rangle.io/features/es6
Modo estricto
 Adaptarnos al modo estricto:
 strictNullChecks
 strictPropertyInitialization
 noImplicitAny
 (etcétera)
 https://angular.io/guide/strict-mode
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Comprobación estricta de nulos
 Sin strict null checks
 Con strict null check
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Inicialización de propiedades
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Inicialización de propiedades
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
 ¿Y que hacemos con los Inputs()?
 “Property has no initializer and is not definitely assigned”
Evitar usar el tipo ‘any’
 Reduce el numero de errores inesperados
 Facilita nuestro refactor
 noImplicitAny: si y el compilador de TypeScript no puede inferir el tipo:
 genera los archivos JavaScript
pero también informa de un error.
 Poner atención en nuestras declaraciones de tipos:
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Usar interfaces
 Debemos usar interfaces para crear los contratos para nuestras clases.
 Forzamos a que se implementen (o asignen) todos los atributos
 Si un objeto no incluye todas las propiedades el compilador nos dará un
error (y evitaremos sorpresas en tiempo de ejecución)
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Palabras clave adecuadas
 var definimos una variable con local scope (función), también nos
permite utilizar un comportamiento llamado hoisting, sin generar
ningún error.
 let definimos variable con block scope (funciones, condicionales,
iteraciones), las variables declaradas de esta manera nos genera
un error de referencia cuando intentamos utilizar hoisting.
 const definimos variables de sólo lectura (no confundir con
inmutables), esto quiere decir que, cuando asignamos una
variable, el nombre de esta va estar asignada a un puntero en
memoria, el cual no puede ser sobreescrito o reasignado.
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Hoisting is JavaScript's
default behavior of moving
declarations to the top.
Usar inmutabilidad
 Si queremos copiar un objeto a otro o a un array para modificarlo
tenemos que utilizar el operador ‘…’ (spread operator)
 De esta manera, estamos recreando el objeto y luego modificando
name.
 Clave para aplicar el patrón Redux (NgRx o NGXS) y optimizar la
detección de cambios en nuestros templates
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Documentar el código
 Ayudará a otros desarrolladores a entender la lógica
 Mejora la legibilidad de un proyecto
 Los métodos deben definirse mediante comentarios de varias líneas
que indiquen qué tarea realiza realmente el método.
 Deben indicarse los parámetros y el valor de retorno.
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Usar lint rules
 tslint (no-any, no-console, no-magic-numbers)  tslint.json
 Fuerza ciertas reglas que pueden ser personalizadas
 Consistencia
 Mi recomendación:
 Settings.json 
 Windows %APPDATA%CodeUsersettings.json
 macOS $HOME/Library/Application Support/Code/User/settings.json
 Linux $HOME/.config/Code/User/settings.json
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Angular y .NET, arquitectura y buenas prácticas
Juan G Carmona
MÓDULO 2
SEGURIDAD
BUENAS PRACTICAS
EN ANGULAR
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Prevenir vulnerabilidades de HTTP
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
 CSRF ó XSRF: cross-site request forgery
 XSSI: cross-site script inclusion
CSRF (Cross-site request forgery)
 Relevante si la autenticación se basa en cookies
 Hablamos de phising  enlaces o páginas web falsas con
acciones que benefician al atacante:
 Solución 1: csurf (Node.js) + HttpClientXssrModule  crea
un “firewall” con el servidor
 Solución 2: no basar nuestra autenticación (sólamente) en
cookies
 Solución 3: …
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
falsificación de peticiones entre sitios
XSS ó XSSI (Cross-site Script Inclusion)
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
 ¿De verdad queremos permitir que los usuarios inyecten “HTML”?
inclusión de secuencias de comandos entre sitios
https://jxxx.wordpress.com/
Nunca concatenar entradas de usuario
 No concatenar inputs de usuario con nuestros templates
 Sólo tiene sentido si el template es declarado desde el .ts
 Usar siempre interpolación ({{ user.input }})
 Minimizar el uso de InnerHTML (o prohibirlo)
 Si lo usamnos  sanitizar
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Evita usar APIs arriesgadas de Angular
 ElementRef
 la API más arriesgada de Angular
 Proporciona acceso inmediato a los atacantes al DOM de nuestras páginas, lo
que hace que las aplicaciones sean aún más vulnerables a XSS.
 Además evitar:
 Node.appendChild()
 Usar el objeto ‘document’ para interactuar con nuestro DOM
 Usar jQuery!!!
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Usar route guards
 canActivate
 canLoad
 Sólo se puede utilizar junto con Lazy Loading
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Mantener nuestras librerías actualizadas
 Las actualizaciones no sólo traen innovaciones y mejoras
 Optimizaciones
 Resolución de Bugs
 Ojo con las librerías que usamos,
 aunque nosotros sigamos todas las buenas prácticas
 “quizá” otros autores no lo han hecho…
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Angular y .NET, arquitectura y buenas prácticas
Juan G Carmona
MÓDULO 2
PERFORMANCE
BUENAS PRACTICAS
EN ANGULAR
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Optimiza la detección de cambios
 ¿Qué?
 Cada componente angular tiene asociado un detector de cambios
 Para cada expresión en el template compara el valor actual de cada propiedad con el
valor previo y si son distintos se pone un flag a true  Se refresca
 ¿Qué podemos hacer?
 enum ChangeDetectionStrategy { OnPush: 0 Default: 1 }
 Default  verifica siempre
 OnPush  verifica una vez
 “When using OnPush detectors, then the framework will check an OnPush
component when any of its input properties changes, when it fires an event, or
when an Observable fires an event”
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Prevenir memory leaks
 ¿Qué?
 Memory leak es memoria que ya no se utiliza pero que no se libera
 ¿Cómo?
 Si desde una instancia de una clase (por ej: un componente) nos suscribimos a
un Observable expuesto por un servicio o una clase diferente, creamos un
memory leak si no nos de suscribimos al destruir esa instancia.
 ¿Solución?
 ASYNC PIPE:
 TAKE UNTIL:
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Evita suscripciones anidadas
 Técnicamente funciona:
 Es preferible concatenar
 Usando withLatestForm:
 Usando combineLatest
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
https://www.learnrxjs.io/
TrackBy + ngFor
 ¿Qué?
 Si hacemos 
 Se transforma en:
 Cada ngDoCheck que lanza la directiva ngForOf –> Angular busca cambios
 Por defecto:
 ¿Solución?
 Crear un trackBy personalizado. Por ejemplo:
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Virtual Scrolling
 La carga de cientos de elementos puede resultar lenta en cualquier navegador;
 Simula todos los elementos que se van a renderizar (tamaño total y scroll)
 Solo renderiza los elementos que están a la vista
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Minimiza la lógica en tus templates
 Técnicamente es correcto
 Aplica SRP
 Extrae esa lógica a componentes más pequeños
 Mejores pruebas unitarias
 Mejora el mantenimiento
 Cambios
 Reduce errores
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Cachear llamadas a APIs
 …
 Se puede implementar una cache (con un diccionario)
 Se puede utilizar local-storage o sesión-storage
 Podemos beneficiarnos de NgRx Data (que ya cachea nuestras requests…)
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Mejores métricas de rendimineto
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
 Time to Interactive (TTI)
 Tiempo hasta que la página es usable (y responde a acciones de usuario)
 First Contentful Paint (FCP)
 Tiempo hasta que el navegador muestra algo de contenido
 Visually Complete (VC)
 tiempo hasta que todo el contenido de la mitad superior de la página haya terminado
de renderizarse.
 Speed Index
 Tiempo desde TTFB hasta recibida la última carga (css, js, imágenes…)
 Time to First Byte (TTFB)
 Tiempo hasta la primera respuesta del servidor
 Total Content Size (TCS)
¿Cómo obtenemos métricas?
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
 Chrome Dev Tools
 Performance tab
 Ligihthouse
De forma general (a cualquier Web App)
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
Name Priority Comments
Minification High All file should be minified (HTML, CSS, JS)
Lazy loading High Images, scripts and CSS need to be lazy loaded to improve the
response time of the current page
DNS resolution High DNS of third-party services that may be needed are resolved in
advance during idle time using dns-prefetch.
Pre-connection Medium DNS lookup, TCP handshake and TLS negotiation with services that
will be needed soon is done in advance during idle time using
preconnect.
pre load & pre fetch Medium Pre loading & prefetching improves in TTI & FCP
webp format for serving
images
High
CSS bundle optimisation High use purge css to optimise css bundle
JS bundle optimisation High
Compression High
Caching static assets & using
CDN with larger expiry
High cache-control: max-age=2592000
Inlining Critical styles to
serve initial content fast
Medium Helps in FCP
Add inline styles for
application fonts & Serve
fonts from cdn
High
Service Workers Low Widely used with PWAs
Angular y .NET, arquitectura y buenas prácticas
Juan G Carmona
Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
MÓDULO 2
Angular y .NET,
arquitectura y
buenas prácticas

Más contenido relacionado

La actualidad más candente

Essential SAFe and Launching your first Agile Release Train
Essential SAFe and Launching your first Agile Release TrainEssential SAFe and Launching your first Agile Release Train
Essential SAFe and Launching your first Agile Release TrainCprime
 
The Cloud Operating Model MVP: From Zero to Production Ready in 12 Weeks - Bu...
The Cloud Operating Model MVP: From Zero to Production Ready in 12 Weeks - Bu...The Cloud Operating Model MVP: From Zero to Production Ready in 12 Weeks - Bu...
The Cloud Operating Model MVP: From Zero to Production Ready in 12 Weeks - Bu...Amazon Web Services
 
AWS Cloud Center Excellence Quick Start Prescriptive Guidance
AWS Cloud Center Excellence Quick Start Prescriptive GuidanceAWS Cloud Center Excellence Quick Start Prescriptive Guidance
AWS Cloud Center Excellence Quick Start Prescriptive GuidanceTom Laszewski
 
Disegnare il proprio business: Business model canvas di Daniele Radici (24 11...
Disegnare il proprio business: Business model canvas di Daniele Radici (24 11...Disegnare il proprio business: Business model canvas di Daniele Radici (24 11...
Disegnare il proprio business: Business model canvas di Daniele Radici (24 11...FaberLab
 
Best Practices in Planning a Large-Scale Migration to AWS - AWS Online Tech T...
Best Practices in Planning a Large-Scale Migration to AWS - AWS Online Tech T...Best Practices in Planning a Large-Scale Migration to AWS - AWS Online Tech T...
Best Practices in Planning a Large-Scale Migration to AWS - AWS Online Tech T...Amazon Web Services
 
Agile Analytics: A GQM Approach to Enterprise Metrics
Agile Analytics: A GQM Approach to Enterprise MetricsAgile Analytics: A GQM Approach to Enterprise Metrics
Agile Analytics: A GQM Approach to Enterprise MetricsLeadingAgile
 
AWS Private Equity Transformation Advisory
AWS Private Equity Transformation AdvisoryAWS Private Equity Transformation Advisory
AWS Private Equity Transformation AdvisoryTom Laszewski
 

La actualidad más candente (8)

Essential SAFe and Launching your first Agile Release Train
Essential SAFe and Launching your first Agile Release TrainEssential SAFe and Launching your first Agile Release Train
Essential SAFe and Launching your first Agile Release Train
 
The Cloud Operating Model MVP: From Zero to Production Ready in 12 Weeks - Bu...
The Cloud Operating Model MVP: From Zero to Production Ready in 12 Weeks - Bu...The Cloud Operating Model MVP: From Zero to Production Ready in 12 Weeks - Bu...
The Cloud Operating Model MVP: From Zero to Production Ready in 12 Weeks - Bu...
 
AWS Cloud Center Excellence Quick Start Prescriptive Guidance
AWS Cloud Center Excellence Quick Start Prescriptive GuidanceAWS Cloud Center Excellence Quick Start Prescriptive Guidance
AWS Cloud Center Excellence Quick Start Prescriptive Guidance
 
Disegnare il proprio business: Business model canvas di Daniele Radici (24 11...
Disegnare il proprio business: Business model canvas di Daniele Radici (24 11...Disegnare il proprio business: Business model canvas di Daniele Radici (24 11...
Disegnare il proprio business: Business model canvas di Daniele Radici (24 11...
 
Best Practices in Planning a Large-Scale Migration to AWS - AWS Online Tech T...
Best Practices in Planning a Large-Scale Migration to AWS - AWS Online Tech T...Best Practices in Planning a Large-Scale Migration to AWS - AWS Online Tech T...
Best Practices in Planning a Large-Scale Migration to AWS - AWS Online Tech T...
 
Agile @ Engie
Agile @ EngieAgile @ Engie
Agile @ Engie
 
Agile Analytics: A GQM Approach to Enterprise Metrics
Agile Analytics: A GQM Approach to Enterprise MetricsAgile Analytics: A GQM Approach to Enterprise Metrics
Agile Analytics: A GQM Approach to Enterprise Metrics
 
AWS Private Equity Transformation Advisory
AWS Private Equity Transformation AdvisoryAWS Private Equity Transformation Advisory
AWS Private Equity Transformation Advisory
 

Similar a Angular, Buenas Prácticas de Desarrollo de Software

Como planificar la arquitectura de nuestras aplicaciones
Como planificar la arquitectura de nuestras aplicacionesComo planificar la arquitectura de nuestras aplicaciones
Como planificar la arquitectura de nuestras aplicacionesJuan G Carmona
 
Arquitectura aplicaciones .net
Arquitectura aplicaciones .netArquitectura aplicaciones .net
Arquitectura aplicaciones .netEdwin Benavente O.
 
UDA-Selección de tecnologías
UDA-Selección de tecnologíasUDA-Selección de tecnologías
UDA-Selección de tecnologíasAnder Martinez
 
Caminando hacia la agilidad con Visual Studio 2010
Caminando hacia la agilidad con Visual Studio 2010Caminando hacia la agilidad con Visual Studio 2010
Caminando hacia la agilidad con Visual Studio 2010Rodrigo Corral
 
Unidad 4
Unidad 4Unidad 4
Unidad 4mi casa
 
Arquitectura de Aplicaciones Web ASP.NET/MVP
Arquitectura de Aplicaciones Web ASP.NET/MVPArquitectura de Aplicaciones Web ASP.NET/MVP
Arquitectura de Aplicaciones Web ASP.NET/MVPIng. Jose Franco
 
RoadShow-Azure-PartnersMicrosoft-Nov-2010-Caso de éxito de Softeng Portal Bul...
RoadShow-Azure-PartnersMicrosoft-Nov-2010-Caso de éxito de Softeng Portal Bul...RoadShow-Azure-PartnersMicrosoft-Nov-2010-Caso de éxito de Softeng Portal Bul...
RoadShow-Azure-PartnersMicrosoft-Nov-2010-Caso de éxito de Softeng Portal Bul...SOFTENG
 
Arquitecturas Adaptativas de Componentes Web
Arquitecturas Adaptativas de Componentes WebArquitecturas Adaptativas de Componentes Web
Arquitecturas Adaptativas de Componentes WebJavier Vélez Reyes
 
Modelos del ciclo de vida del software
Modelos del ciclo de vida del softwareModelos del ciclo de vida del software
Modelos del ciclo de vida del softwareAbner Torres
 
Unidad 2.2 Escribiendo El Programa
Unidad 2.2 Escribiendo El ProgramaUnidad 2.2 Escribiendo El Programa
Unidad 2.2 Escribiendo El ProgramaSergio Sanchez
 
Evento IDC Cloud Computing 2011-Como mover una gran aplicación a Windows Azur...
Evento IDC Cloud Computing 2011-Como mover una gran aplicación a Windows Azur...Evento IDC Cloud Computing 2011-Como mover una gran aplicación a Windows Azur...
Evento IDC Cloud Computing 2011-Como mover una gran aplicación a Windows Azur...SOFTENG
 
Modelo top down
Modelo top downModelo top down
Modelo top downniazuluaga
 
MVVM vs MVU en NET MAUI.pptx
MVVM vs MVU en NET MAUI.pptxMVVM vs MVU en NET MAUI.pptx
MVVM vs MVU en NET MAUI.pptxicebeam7
 
Introducción a la Nube Nativa - v1.0es (2021/03)
Introducción a la Nube Nativa - v1.0es (2021/03)Introducción a la Nube Nativa - v1.0es (2021/03)
Introducción a la Nube Nativa - v1.0es (2021/03)Young Suk Ahn Park
 
BootCamp Online en DevOps (and SecDevOps) de GeeksHubs Academy
BootCamp Online en DevOps (and SecDevOps) de GeeksHubs AcademyBootCamp Online en DevOps (and SecDevOps) de GeeksHubs Academy
BootCamp Online en DevOps (and SecDevOps) de GeeksHubs AcademyTelefónica
 

Similar a Angular, Buenas Prácticas de Desarrollo de Software (20)

Como planificar la arquitectura de nuestras aplicaciones
Como planificar la arquitectura de nuestras aplicacionesComo planificar la arquitectura de nuestras aplicaciones
Como planificar la arquitectura de nuestras aplicaciones
 
Arquitectura aplicaciones .net
Arquitectura aplicaciones .netArquitectura aplicaciones .net
Arquitectura aplicaciones .net
 
UDA-Selección de tecnologías
UDA-Selección de tecnologíasUDA-Selección de tecnologías
UDA-Selección de tecnologías
 
20060612 Dev Ba
20060612 Dev Ba20060612 Dev Ba
20060612 Dev Ba
 
GraphQL Reactivo
GraphQL ReactivoGraphQL Reactivo
GraphQL Reactivo
 
Caminando hacia la agilidad con Visual Studio 2010
Caminando hacia la agilidad con Visual Studio 2010Caminando hacia la agilidad con Visual Studio 2010
Caminando hacia la agilidad con Visual Studio 2010
 
Unidad 4
Unidad 4Unidad 4
Unidad 4
 
Arquitectura de Aplicaciones Web ASP.NET/MVP
Arquitectura de Aplicaciones Web ASP.NET/MVPArquitectura de Aplicaciones Web ASP.NET/MVP
Arquitectura de Aplicaciones Web ASP.NET/MVP
 
RoadShow-Azure-PartnersMicrosoft-Nov-2010-Caso de éxito de Softeng Portal Bul...
RoadShow-Azure-PartnersMicrosoft-Nov-2010-Caso de éxito de Softeng Portal Bul...RoadShow-Azure-PartnersMicrosoft-Nov-2010-Caso de éxito de Softeng Portal Bul...
RoadShow-Azure-PartnersMicrosoft-Nov-2010-Caso de éxito de Softeng Portal Bul...
 
Propuesta devops pasesv1
Propuesta devops pasesv1Propuesta devops pasesv1
Propuesta devops pasesv1
 
Arquitecturas Adaptativas de Componentes Web
Arquitecturas Adaptativas de Componentes WebArquitecturas Adaptativas de Componentes Web
Arquitecturas Adaptativas de Componentes Web
 
Modelos del ciclo de vida del software
Modelos del ciclo de vida del softwareModelos del ciclo de vida del software
Modelos del ciclo de vida del software
 
Unidad 2.2 Escribiendo El Programa
Unidad 2.2 Escribiendo El ProgramaUnidad 2.2 Escribiendo El Programa
Unidad 2.2 Escribiendo El Programa
 
Evento IDC Cloud Computing 2011-Como mover una gran aplicación a Windows Azur...
Evento IDC Cloud Computing 2011-Como mover una gran aplicación a Windows Azur...Evento IDC Cloud Computing 2011-Como mover una gran aplicación a Windows Azur...
Evento IDC Cloud Computing 2011-Como mover una gran aplicación a Windows Azur...
 
Webinar Migración de Forms & Reports a Oracle Cloud
Webinar Migración de Forms & Reports a Oracle CloudWebinar Migración de Forms & Reports a Oracle Cloud
Webinar Migración de Forms & Reports a Oracle Cloud
 
Modelo top down
Modelo top downModelo top down
Modelo top down
 
1. Metodologia PPDIOO.pptx
1. Metodologia PPDIOO.pptx1. Metodologia PPDIOO.pptx
1. Metodologia PPDIOO.pptx
 
MVVM vs MVU en NET MAUI.pptx
MVVM vs MVU en NET MAUI.pptxMVVM vs MVU en NET MAUI.pptx
MVVM vs MVU en NET MAUI.pptx
 
Introducción a la Nube Nativa - v1.0es (2021/03)
Introducción a la Nube Nativa - v1.0es (2021/03)Introducción a la Nube Nativa - v1.0es (2021/03)
Introducción a la Nube Nativa - v1.0es (2021/03)
 
BootCamp Online en DevOps (and SecDevOps) de GeeksHubs Academy
BootCamp Online en DevOps (and SecDevOps) de GeeksHubs AcademyBootCamp Online en DevOps (and SecDevOps) de GeeksHubs Academy
BootCamp Online en DevOps (and SecDevOps) de GeeksHubs Academy
 

Angular, Buenas Prácticas de Desarrollo de Software

  • 1. BUENAS PRACTICAS EN ANGULAR Angular y .NET, arquitectura y buenas prácticas Juan G Carmona Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0 MÓDULO 2
  • 2. Angular y .NET, arquitectura y buenas prácticas Juan G Carmona MÓDULO 2 Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 3. Angular y .NET, arquitectura y buenas prácticas Juan G Carmona MÓDULO 2 Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 4. Angular y .NET, arquitectura y buenas prácticas Juan G Carmona MÓDULO 2  ESTRUCTURA FÍSICA  ESTRUCTURA LÓGICA  SINTAXIS  PERFORMANCE  SEGURIDAD BUENAS PRACTICAS EN ANGULAR Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 5. ESTRUCTURA FÍSICA Angular y .NET, arquitectura y buenas prácticas Juan G Carmona MÓDULO 2 BUENAS PRACTICAS EN ANGULAR Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 6. Aplicar SRP en archivos  SRP  Single Responsibility Principle  Cada archivo tiene un único propósito  Responsabilidad  Componentes  Plantillas  Servicios  Pipes  (etc)  Nos permite crear un código limpio, legible y mantenible Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 7. Cuidar los nombres de archivos y carpetas  Los nombres deben seguir el mismo patrón, con la característica del archivo en primer lugar, seguida del tipo, separados por un punto.  Ej:  dashboard.component.ts  Auth.service.ts  Si el nombre es compuesto utilizar ‘-’:  Ej:  article-list.component.ts  cookie-consent.component.scss  El nombre de una carpeta debe describir su contenido Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 8. Usar path alias  Simplifican las rutas  Código más fácil de leer y mantener.  tsconfig.ts Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 9. Usar index.ts  No es crítico, es recomendable  Ayuda a mantener todos los archivos correlacionados en una única ubicación.  Simplifica la importación porque no necesitamos recordar todas las rutas  Imaginemos el módulo article, y dentro de él modelos, servicios, componentes…  Imaginemos entonces este index.ts en src/modules/article  Podríamos desde cualquier parte de nuestro código hacer algo similar a: Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 10. Estructura de carpetas adecuada  Es una decisión crítica  Debe tomarse antes de comenzar el proyecto  Flexible y preparada para los cambios “Have a near-term view of implementation and a long-term vision. Start small but keep in mind where the application is heading.” -- https://angular.io/guide/styleguide -- ¿Qué aspecto tiene esa estructura de carpetas adecuada? Mantener el código lo más cerca posible de donde se usa es una buena práctica. Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 11. Angular y .NET, arquitectura y buenas prácticas Juan G Carmona MÓDULO 2 ESTRUCTURA LÓGICA BUENAS PRACTICAS EN ANGULAR Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 12. Aplicar SRP en componentes  Los componentes grandes añaden complejidad  Dividirlos en otros más pequeños componentes reutilizables.  Simplifica su gestión, mantenimiento y depuración  Pero…  ¿Qué tipo de componentes hay?  ¿Cómo se comunican?  ¿Cómo puedo hacer que mis componentes sean reutilizables? Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 13. Usar componentes listos y tontos  LISTOS (SMART)  Gestionan datos  resolver | service | state  Comunican hacia abajo  Manejan/gestionan hacia arriba  Niveles  Páginas: DashboardPageComponent  dashboard-page.component.ts  Views: ViewArticleComponent  view-article.component.ts  TONTOS (DUMB)  Reciben datos (@Input)  Los presentan  Emiten eventos (@Output) Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 14. Usar Variables de Entorno  Múltiples entornos  Múltiples configuraciones  Por defecto  Development  Production  Podemos añadir más  Añaden seguridad  Durante el desarrollo  DevOps  Reemplazo al pasar a producción Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 15. Usar carga perezosa  Aceleramos la carga inicial  Retrasamos la carga de archivos concretos  Strategias  Lazy Loading  Eager Lazy Loading LAZY LOADING ROCKS! Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 16. Usar un gestor de Estado  REDUX es un patrón  Single Source of Trust  Multiples librerías (NgRx, NGXS) PATRÓN REDUX Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 17. Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 18. Estrategia de módulos adecuada  Es una decisión crítica  Debe tomarse antes de comenzar el proyecto  ¿Opciones?  Todo en un módulo  Un módulo por característica / vista (Lazy Laoding)  Un módulo por componente (SCAM) Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0 ¿Cómo elegir nuestra estrategia de Módulos?
  • 19. Angular y .NET, arquitectura y buenas prácticas Juan G Carmona MÓDULO 2 ESTRATEGIAS PARA MODULARIZAR BUENAS PRACTICAS EN ANGULAR Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 20. Estrategia de módulos adecuada  Es una decisión crítica  Debe tomarse antes de comenzar el proyecto  ¿Opciones?  Todo en un módulo  Un módulo por componente (SCAM)  Un módulo por característica / vista Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0 Angular Modules Best Practices 2021 – by Christian Kohler
  • 21. Todo en un módulo Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 22. Single Module output Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0  Desventajas:  Tamaño  Tiempo de carga  Seguridad  Mantenimiento  Testing  ¿Cuándo podemos utilizar esta estrategia?  Aplicaciones muy pequeñas y simples (por ejemplo PoC’s o DEMOS)
  • 23. Un módulo por componente (SCAM) Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0 Single Component Angular Module  Lars Gyrup Brink Nielsen  SCAM
  • 24. SCAM output Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0  Beneficios:  Gestión de dependencias  Tamaños  Tiempo  Patrón  Desventajas:  Demasiado boilerplate
  • 25. Un módulo por característica (MPF)  Es el patrón más común Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 26. MPF output Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0  Beneficios:  Tamaño óptimo de paquetes  Subdividible (jerarquía de módulos)  Mejor mantenimiento  NOTA: es el recomendado en la documentación oficial
  • 27. ¿Cuál elegir? Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0 Angular Modules Best Practices 2021 – by Christian Kohler  Para una librería parece preferible usar SCAM  Para una app  Si es muy simple (< 10 componentes)  Single Module  Si no: MPF | SCAM
  • 28. ¿Cómo afecta esto a nuestra estructura de carpetas? Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 29. Angular y .NET, arquitectura y buenas prácticas Juan G Carmona MÓDULO 2 SINTAXIS BUENAS PRACTICAS EN ANGULAR Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 30. Seguir la guía de estilo  Max 400 líneas por archivo  Max 75 líneas por método.  Convención con nombres de ficheros y clases "const" vs “let”  Organización dentro de la clase  Colocar las propiedades arriba, seguídas de los métodfos  Colocar los métodos privados después de los públicos y ordenados alfabéticamente  Casing (camelCase vs PascalCase)  (etc…) ;) Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0 https://angular.io/guide/styleguide
  • 31. Aprovechar las características de ES6  Algunos de los aspectos más destacados:  Clases  Funciones flecha  Template strings  Herencia  Ámbito de bloque en variables y constantes  Spread operator and rest parameters (‘…’) Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0 https://angular-training-guide.rangle.io/features/es6
  • 32. Modo estricto  Adaptarnos al modo estricto:  strictNullChecks  strictPropertyInitialization  noImplicitAny  (etcétera)  https://angular.io/guide/strict-mode Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 33. Comprobación estricta de nulos  Sin strict null checks  Con strict null check Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 34. Inicialización de propiedades Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 35. Inicialización de propiedades Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0  ¿Y que hacemos con los Inputs()?  “Property has no initializer and is not definitely assigned”
  • 36. Evitar usar el tipo ‘any’  Reduce el numero de errores inesperados  Facilita nuestro refactor  noImplicitAny: si y el compilador de TypeScript no puede inferir el tipo:  genera los archivos JavaScript pero también informa de un error.  Poner atención en nuestras declaraciones de tipos: Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 37. Usar interfaces  Debemos usar interfaces para crear los contratos para nuestras clases.  Forzamos a que se implementen (o asignen) todos los atributos  Si un objeto no incluye todas las propiedades el compilador nos dará un error (y evitaremos sorpresas en tiempo de ejecución) Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 38. Palabras clave adecuadas  var definimos una variable con local scope (función), también nos permite utilizar un comportamiento llamado hoisting, sin generar ningún error.  let definimos variable con block scope (funciones, condicionales, iteraciones), las variables declaradas de esta manera nos genera un error de referencia cuando intentamos utilizar hoisting.  const definimos variables de sólo lectura (no confundir con inmutables), esto quiere decir que, cuando asignamos una variable, el nombre de esta va estar asignada a un puntero en memoria, el cual no puede ser sobreescrito o reasignado. Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0 Hoisting is JavaScript's default behavior of moving declarations to the top.
  • 39. Usar inmutabilidad  Si queremos copiar un objeto a otro o a un array para modificarlo tenemos que utilizar el operador ‘…’ (spread operator)  De esta manera, estamos recreando el objeto y luego modificando name.  Clave para aplicar el patrón Redux (NgRx o NGXS) y optimizar la detección de cambios en nuestros templates Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 40. Documentar el código  Ayudará a otros desarrolladores a entender la lógica  Mejora la legibilidad de un proyecto  Los métodos deben definirse mediante comentarios de varias líneas que indiquen qué tarea realiza realmente el método.  Deben indicarse los parámetros y el valor de retorno. Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 41. Usar lint rules  tslint (no-any, no-console, no-magic-numbers)  tslint.json  Fuerza ciertas reglas que pueden ser personalizadas  Consistencia  Mi recomendación:  Settings.json   Windows %APPDATA%CodeUsersettings.json  macOS $HOME/Library/Application Support/Code/User/settings.json  Linux $HOME/.config/Code/User/settings.json Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 42. Angular y .NET, arquitectura y buenas prácticas Juan G Carmona MÓDULO 2 SEGURIDAD BUENAS PRACTICAS EN ANGULAR Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 43. Prevenir vulnerabilidades de HTTP Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0  CSRF ó XSRF: cross-site request forgery  XSSI: cross-site script inclusion
  • 44. CSRF (Cross-site request forgery)  Relevante si la autenticación se basa en cookies  Hablamos de phising  enlaces o páginas web falsas con acciones que benefician al atacante:  Solución 1: csurf (Node.js) + HttpClientXssrModule  crea un “firewall” con el servidor  Solución 2: no basar nuestra autenticación (sólamente) en cookies  Solución 3: … Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0 falsificación de peticiones entre sitios
  • 45. XSS ó XSSI (Cross-site Script Inclusion) Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0  ¿De verdad queremos permitir que los usuarios inyecten “HTML”? inclusión de secuencias de comandos entre sitios https://jxxx.wordpress.com/
  • 46. Nunca concatenar entradas de usuario  No concatenar inputs de usuario con nuestros templates  Sólo tiene sentido si el template es declarado desde el .ts  Usar siempre interpolación ({{ user.input }})  Minimizar el uso de InnerHTML (o prohibirlo)  Si lo usamnos  sanitizar Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 47. Evita usar APIs arriesgadas de Angular  ElementRef  la API más arriesgada de Angular  Proporciona acceso inmediato a los atacantes al DOM de nuestras páginas, lo que hace que las aplicaciones sean aún más vulnerables a XSS.  Además evitar:  Node.appendChild()  Usar el objeto ‘document’ para interactuar con nuestro DOM  Usar jQuery!!! Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 48. Usar route guards  canActivate  canLoad  Sólo se puede utilizar junto con Lazy Loading Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 49. Mantener nuestras librerías actualizadas  Las actualizaciones no sólo traen innovaciones y mejoras  Optimizaciones  Resolución de Bugs  Ojo con las librerías que usamos,  aunque nosotros sigamos todas las buenas prácticas  “quizá” otros autores no lo han hecho… Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 50. Angular y .NET, arquitectura y buenas prácticas Juan G Carmona MÓDULO 2 PERFORMANCE BUENAS PRACTICAS EN ANGULAR Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 51. Optimiza la detección de cambios  ¿Qué?  Cada componente angular tiene asociado un detector de cambios  Para cada expresión en el template compara el valor actual de cada propiedad con el valor previo y si son distintos se pone un flag a true  Se refresca  ¿Qué podemos hacer?  enum ChangeDetectionStrategy { OnPush: 0 Default: 1 }  Default  verifica siempre  OnPush  verifica una vez  “When using OnPush detectors, then the framework will check an OnPush component when any of its input properties changes, when it fires an event, or when an Observable fires an event” Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 52. Prevenir memory leaks  ¿Qué?  Memory leak es memoria que ya no se utiliza pero que no se libera  ¿Cómo?  Si desde una instancia de una clase (por ej: un componente) nos suscribimos a un Observable expuesto por un servicio o una clase diferente, creamos un memory leak si no nos de suscribimos al destruir esa instancia.  ¿Solución?  ASYNC PIPE:  TAKE UNTIL: Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 53. Evita suscripciones anidadas  Técnicamente funciona:  Es preferible concatenar  Usando withLatestForm:  Usando combineLatest Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0 https://www.learnrxjs.io/
  • 54. TrackBy + ngFor  ¿Qué?  Si hacemos   Se transforma en:  Cada ngDoCheck que lanza la directiva ngForOf –> Angular busca cambios  Por defecto:  ¿Solución?  Crear un trackBy personalizado. Por ejemplo: Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 55. Virtual Scrolling  La carga de cientos de elementos puede resultar lenta en cualquier navegador;  Simula todos los elementos que se van a renderizar (tamaño total y scroll)  Solo renderiza los elementos que están a la vista Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 56. Minimiza la lógica en tus templates  Técnicamente es correcto  Aplica SRP  Extrae esa lógica a componentes más pequeños  Mejores pruebas unitarias  Mejora el mantenimiento  Cambios  Reduce errores Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 57. Cachear llamadas a APIs  …  Se puede implementar una cache (con un diccionario)  Se puede utilizar local-storage o sesión-storage  Podemos beneficiarnos de NgRx Data (que ya cachea nuestras requests…) Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0
  • 58. Mejores métricas de rendimineto Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0  Time to Interactive (TTI)  Tiempo hasta que la página es usable (y responde a acciones de usuario)  First Contentful Paint (FCP)  Tiempo hasta que el navegador muestra algo de contenido  Visually Complete (VC)  tiempo hasta que todo el contenido de la mitad superior de la página haya terminado de renderizarse.  Speed Index  Tiempo desde TTFB hasta recibida la última carga (css, js, imágenes…)  Time to First Byte (TTFB)  Tiempo hasta la primera respuesta del servidor  Total Content Size (TCS)
  • 59. ¿Cómo obtenemos métricas? Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0  Chrome Dev Tools  Performance tab  Ligihthouse
  • 60. De forma general (a cualquier Web App) Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0 Name Priority Comments Minification High All file should be minified (HTML, CSS, JS) Lazy loading High Images, scripts and CSS need to be lazy loaded to improve the response time of the current page DNS resolution High DNS of third-party services that may be needed are resolved in advance during idle time using dns-prefetch. Pre-connection Medium DNS lookup, TCP handshake and TLS negotiation with services that will be needed soon is done in advance during idle time using preconnect. pre load & pre fetch Medium Pre loading & prefetching improves in TTI & FCP webp format for serving images High CSS bundle optimisation High use purge css to optimise css bundle JS bundle optimisation High Compression High Caching static assets & using CDN with larger expiry High cache-control: max-age=2592000 Inlining Critical styles to serve initial content fast Medium Helps in FCP Add inline styles for application fonts & Serve fonts from cdn High Service Workers Low Widely used with PWAs
  • 61. Angular y .NET, arquitectura y buenas prácticas Juan G Carmona Angular y .NET, arquitectura y buenas prácticas © 2021 by Juan G Carmona is licensed under CC BY-NC 4.0 MÓDULO 2 Angular y .NET, arquitectura y buenas prácticas

Notas del editor

  1. Tener una visión a corto plazo de la implementación Pero con visión a largo plazo. Empezar con algo pequeño pero teniendo en cuenta hacia dónde se dirige la aplicación.
  2. Nomenclatura? Utilizar Sufijos Page o View para los Smart Ej: EventPage  Puede recuperar un evento Con un resolver o llamando a un servicio Y contener un component EventDetails
  3. Nomenclatura? Utilizar Sufijos Page o View para los Smart Ej: EventPage  Puede recuperar un evento Con un resolver o llamando a un servicio Y contener un component EventDetails
  4. Nomenclatura? Utilizar Sufijos Page o View para los Smart Ej: EventPage  Puede recuperar un evento Con un resolver o llamando a un servicio Y contener un component EventDetails
  5. Hay algunos aspectos que debemos considerar al decidirnos por uno u otro enfoque. El tamaño de la app y de los módulos puede verse afectado por la forma en que se dividen los módulos. Tiempo de carga de su aplicación en un navegador. La escalabilidad La simplicidad ¿Qué tan fácil es probar un solo componente? Si el componente es parte de un módulo grande, es posible que tengamos que simular muchos servicios.
  6. Hay algunos aspectos que debemos considerar al decidirnos por uno u otro enfoque. El tamaño de la app y de los módulos puede verse afectado por la forma en que se dividen los módulos. Tiempo de carga de su aplicación en un navegador. La escalabilidad La simplicidad ¿Qué tan fácil es probar un solo componente? Si el componente es parte de un módulo grande, es posible que tengamos que simular muchos servicios.
  7. Este enfoque es muy simple pero tiene algunas desventajas: Todos los componentes se cargan al inicio, lo que se traduce en un tiempo de carga inicial más largo. El archivo app.module se hincha y la refactorización significa tocar este archivo todo el tiempo Resolver dependencias es una pesadilla. Por ejemplo, es muy difícil averiguar qué podemos eliminar después de eliminar un componente. Tal vez un componente solo se usó en el componente eliminado y no pudo eliminarlo también. Este enfoque puede funcionar para aplicaciones muy pequeñas, pero no lo recomendaría para proyectos más grandes.
  8. Hay algunos aspectos que debemos considerar al decidirnos por uno u otro enfoque. El tamaño de la app y de los módulos puede verse afectado por la forma en que se dividen los módulos. Tiempo de carga de su aplicación en un navegador. La escalabilidad La simplicidad ¿Qué tan fácil es probar un solo componente? Si el componente es parte de un módulo grande, es posible que tengamos que simular muchos servicios.
  9. E smucho más fácil entender qué dependencias tiene un componente. Cada módulo de componente solo importa los módulos que utiliza directamente. Eso significa que si eliminamos un componente, también eliminamos todas sus dependencias automáticamente. Bonito. Y por último, pero no menos importante, la regla es muy simple: cada componente tiene su módulo. Eso es todo, no hay discusiones sobre cómo dividir los módulos. Tenemos muchas más definiciones de módulo y tenemos que importar todas las dependencias explícitamente.
  10. Está en un lugar intermedio entre los otros dos patrones
  11. Obtenemos el tamaño de paquete óptimo cuando cargamos todas las vistas de forma diferida. Dado que el módulo compartido se usa en varios módulos de carga diferida, se carga en un módulo común separado. Obtenemos paquetes de tamaño pequeño con poca repetición y todavía tenemos una estructura clara. Si la aplicación es más grande, también puede dividir los módulos nuevamente en módulos de funciones más pequeños o agrupar vistas en paquetes de funciones más grandes. Esto puede ayudarlo a organizar su código o generar confusión sobre cuándo crear esos submódulos.
  12. Hay algunos aspectos que debemos considerar al decidirnos por uno u otro enfoque. El tamaño de la app y de los módulos puede verse afectado por la forma en que se dividen los módulos. Tiempo de carga de su aplicación en un navegador. La escalabilidad La simplicidad ¿Qué tan fácil es probar un solo componente? Si el componente es parte de un módulo grande, es posible que tengamos que simular muchos servicios.
  13. Hay algunos aspectos que debemos considerar al decidirnos por uno u otro enfoque. El tamaño de la app y de los módulos puede verse afectado por la forma en que se dividen los módulos. Tiempo de carga de su aplicación en un navegador. La escalabilidad La simplicidad ¿Qué tan fácil es probar un solo componente? Si el componente es parte de un módulo grande, es posible que tengamos que simular muchos servicios.
  14. JavaScript se creó en 1995, pero el lenguaje todavía prospera hoy. Hay subconjuntos, superconjuntos, versiones actuales y la versión ES6 (Junio de 2015) que trajo muchas características nuevas. The rest parameter syntax allows a function to accept an indefinite number of arguments as an array,
  15. https://blog.angular.io/with-best-practices-from-the-start-d64881a16de8 Habilitado por defecto desde la version 12.
  16. JavaScript no realiza ningún tipo de verificación en las asignaciones de variables. Pero esto parece bastante extraño para los desarrolladores de Java o C# que estamos acostumbrados a las variables opcionales y los tipos nullables. Al usar strict null check tenemos que especificar si nuestros tipos admiten nulos o undefined. La comprobación estricta de nulos ayuda a eliminar errores por descuido y fortalece nuestro código al hacer que la aparición de valores nulos sea mucho más explícita
  17. No hay una respuesta correcta Se puede cambiar el flag pero en proyectos grandes merece la pena planteárselo… INSTEAD:  Declare Safe Data Types
  18. When you declare a variable if the value is not reassigned “Const” can be used to declare the value. The “let” keyword declares an input variable referenced within the template. Using these keywords makes the declaration of a variable more clear. With this, the code crispness and clarity are improvised with clean code..
  19. In javascript, the two main reference types are objects and arrays. If we wish to copy them into another object or array and modify them, we should use the es6 spread operator(…) to do so we need to use immutability. const student = { id: 1, name: "John Doe"; email: "john@google.com"; } const results = { ...student, percentage : 90 } In this way, we’re recreating the user object, and then simply overriding the status property. You can quickly clone user objects and overwrite their status and properties .
  20. Documenting code is a good practice. It will assist a new developer in understanding the logic and readability of a project. Documenting each variable and method is a good Angular practice. Methods must be defined using multi-line comments that indicate what task the method actually does. /** * This is the get function * @param age This is the age parameter * @returns returns a string version of age */ function getAge(age: number): string { return age.toString(); }
  21. https://www.syncfusion.com/blogs/post/top-5-best-practices-angular-app-security.aspx https://www.tatvasoft.com/blog/angular-optimization-and-best-practices/ https://snyk.io/blog/angular-security-best-practices/ https://vitalflux.com/angular-top-10-security-best-practices-vis-vis-security-risks/ https://dzone.com/articles/5-best-tips-for-angular-application-security
  22. En un ataque CSRF, el atacante utiliza métodos como el phishing que harán que la víctima realice solicitudes al servidor. El servidor no puede distinguir la solicitud porque las cookies de sesión se envían automáticamente con la solicitud y, por lo tanto, autentica la acción.
  23. Cada vez que se añaden, mueven o eliminen elementos en la colección se buscan cambios Recibe el elemento actual y debería devolver algún valor. Luego, el valor devuelto por la función se compara con el valor que esta función devolvió la última vez. Si el valor cambia, se informa de un cambio y esto fuerza un refresco. Entonces, si la función predeterminada devuelve referencias a objetos habrá refrescos constantemente. Cada vez que cambie algo en nuestro array de elementos, para cada elemento habrá un refresco completo del contenido del ngFor.
  24. First Contentful Paint is a visual metric that measures the time until the browser first renders any content (not to be confused with First Paint, which measures the time until the browser first renders anything). This metric is critical because it tells a site visitor that something is happening and that they’re not just going to be staring at a blank screen. El índice de velocidad es una métrica calculada que representa la rapidez con la que la página muestra el contenido de la mitad superior de la página. Esta métrica visual va de la mano con Visually Complete para brindarle una imagen tanto del punto final de la representación del contenido como del viaje para llegar a ese punto final.
  25. First Contentful Paint is a visual metric that measures the time until the browser first renders any content (not to be confused with First Paint, which measures the time until the browser first renders anything). This metric is critical because it tells a site visitor that something is happening and that they’re not just going to be staring at a blank screen. El índice de velocidad es una métrica calculada que representa la rapidez con la que la página muestra el contenido de la mitad superior de la página. Esta métrica visual va de la mano con Visually Complete para brindarle una imagen tanto del punto final de la representación del contenido como del viaje para llegar a ese punto final.
  26. NgRx  Anexo 1 Siguiente  En paralelo -> (Teoría) API rest con .NET 6 y Clean Arquitecture Interfaz REST Dominio Infraestructura persistencia (con EF) Applicación (CQRS) MediatR Puede que tests unitarios -> Puesta en práctica Azure DevOps Discovery Crear una Wiki (con enlaces a los vídeos y las diferentes secciones) Crear una pipeline de compilación de Angular Crear una pipeline de compilación de .Net Gestión de repositorios y ramas en el proyecto Angular Project scaffolding API Project scaffolding.