GDG Vigo
Twitter: @hugoerdev
LinkedIn: hugoer85
Freelance frontend developer
Directivas usadas en cualquier parte de la aplicación
Cualquier error de javascript (No de HTTP) se mostrará en una notificación en pantalla
Sistema utilizando observables que permite emitir cualquier evento desde cualquier componente y suscribirse desde otro.
Totalmente reemplazable por Redux, pero si no se utiliza dicho patrón, se puede hacer uso de este gestor de eventos.
Encargado de gestionar todo lo relacionado con las llamadas HTTP.
Servicios generales a toda la aplicación
Principamente servicios singleton
Definición del módulo compartido entre todos los módulos de la aplicación
Módulo encargado de gestionar el enrutado hacia otros módulos
No debe conocer más componentes que el componente del shell en el que se irán cargando las páginas gracias al router
Módulo principal de la aplicación
Sólo debe cargar el AppComponent, CoreModule y AppRoutingModule.
styles.scss (principal de la aplicación angular)
Importamos el fichero _themins.scss
Usamos la función mat-core() del fichero _theming.scss
Definimos la paleta de colores
Creamos el tema
Con esto tenemos en el fichero styles.CSS ya el tema compilado
Para incorporar los componentes de Material podemos seguir dos estrategias en base a nuestras necesidades:
Ejemplo de cómo he insertado los módulos de los componentes material en la carpeta "components"
Para generar el service worker para que nuestra aplicación sea una PWA debemos ejecutar el comando:
ng add @angular/pwa
Esto añadirá los paquetes npm necesarios, realizará cambios mínimos en la aplicación (angular.json, app.module.ts) y generará el fichero ngsw-config.json
Aquí se indica el nombre, colores y todo lo necesario para que los teléfonos (por ejemplo) puedan generar el icono (escritorio y menú), color de fondo al cargar la PWA y en chrome, qué color tendrá la barra del menú
Hay que añadir el icono de la aplicación en diferentes tamaños, para que el dispositivo presente el icono con el aspecto correcto en cada momento.
Este fichero es donde podemos configurar qué y cómo queremos gestionar la caché (recursos y llamadas ajax)
assetGroups
dataGroups
dataGroups
Angular nos permite trabajar con dos estrategias en lo referente a las llamadas ajax
assetGroups
Diferentes estrategias para trabajar con serviceworkers
Diferentes estrategias para trabajar con serviceworkers
Diferentes estrategias para trabajar con serviceworkers
En este post está toda la información sobre las estrategias en el service worker:
Usar Angular CLI para lo máximo posible.
El equipo de Angular esté trabajando muchísimo en los tiempos de compilación, minificación y configuraciones.
Desarrollar los componentes bajo el patrón Contenedor - Presentador
El componente contenedor es el encargado de realizar las llamadas ajax y tratamiento de datos para pasárselo al componente presentador, que lo único que tiene que hacer es visualizar los datos
Hacer los componentes lo más pequeños y atómicos posible
Estrategia de detección del cambio
Por defecto, Angular propaga los cambios producidos en un componente a todos sus componentes hijos.
Eso decrementa muchísimo la performance de la aplicación.
Estrategia OnPush
Angular solo propagará los cambios de los @Input(), método markForCheck (ChangeDetectorRef), el uso de Pipes y cambios en objetos inmutables para realizar cambios y actualizar la vista.
Estrategia de detección del cambio
Para asegurarnos que siempre se usa dicha estrategia por defecto (usando Angular CLI), podemos usar angular schematics para indicárselo
Evitar "Memory leaks"
La librería RxJS nos provee de Observables a los que nos suscribimos para facilitar el tratamiento de la asincronía y eventos.
Siempre hay que ejecutar el método unsubscribe() de todos los observables a los que nos hemos suscrito.
Este proceso no se hace automáticamente aunque el componente se haya destruido, lo que provoca una fuga de memoria importante.
Mecanismos para darse de baja del Observale
Mecanismos para darse de baja del Observale
Si estamos seguros que solo queremos ejecutar el callback del subscribe "n" veces, podemos utilizar el pipe "take" de RxJS e indicar el número de veces que queremos que se ejecute
Mecanismos para darse de baja del Observale
Podemos suscribirnos, sólo hasta que se emita otro evento, el cual lo emitimos en el evento ngOnDestroy del componente.
Cargar los módulos del router bajo demanda (LazyLoad)
Angular generará un fichero por cada módulo lazy, lo que provoca un aumento en la carga inicial de la aplicación al tener ficheros más pequeños
Esta funcionalidad nos ayuda a desacoplar el código propio de cada página / funcionalidad del código "core" de la aplicación
En el fichero app.routing-module.ts se define la carga de los módulos (Sin conocer qué contienen dichos módulos)
Link rel="preload"
Si cargamos ficheros estáticos en nuestro index.html, incluir dicha propiedad nos permitirá indicarle al navegador que debe solicitar el recurso para tenerlo lo antes posible.
Carga de fuentes cargadas desde el CSS
Si tenemos fuentes (iconos por ejemplo) que se cargan mediante @font-face, puede retrasar la carga de la página.
Si no es un icono, siempre se puede indicar una tipografía a modo de fallback
Carga de fuentes cargadas desde el CSS
Para no retrasar la carga de la web hasta tener dicho recurso, podemos usar el atributo "font-display: swap"
La web continuará la carga hasta tener el fichero, lo que no debería tardar mucho si es una PWA y la fuente está incluida dentro del assetsGroup
Mejorar "First contentful Paint"
Esto provoca que la app muestre al usuario algo lo antes posible.
Utilizar ese mecanismo para incluir un spinner.
Incluyendo el CSS mínimo en una etiqueta <style></style>
Medir tamaño de los ficheros generados en la compilación
Angular CLI nos permite configurar límites para producir errores y advertencias
Utilizar Webpack Bundle Analyzer para conocer en exactitud el contenido de cada fichero / módulo
Utilizar la compilación AOT (Ahead-of-Time)
"Angular Language Service" es una extensión de VS Code que nos ayuda a prevenir errores de compilación AOT
Auditar la aplicación usando la pestaña "audits" de las developer tools de chrome (Lighthouse)
Realiza una serie de diagnósticos y provee de suficiente información como para conocer el motivo de que una aplicación no sea suficientemente rápida
Habilitar GZIP en el servidor para los recursos estáticos (imágenes, fotos, fuentes)
Incluir cabecera cache-control con el valor "max-age=tiempodeseado"
Utilizar HTTP2
Twitter (Angular)
Twitter (web)