Precarga de Módulos en Angular: Estrategias Personalizadas
Resumen
Al haber activado la técnica de Lazy Loading , puedes personalizar el envío de estos módulos al cliente con diferentes estrategias.
Cómo hacer precarga de módulos bajo demanda
Por defecto, la aplicación enviará al cliente solo el módulo que necesita. Si ingresas al módulo website, solo se cargará su respectivo archivo JS.
Si el usuario solicita otro módulo, este se cargará solo cuando sea necesario.
Esto puede causarte problemas, ya que si el módulo solicitado es algo pesado o la conexión es lenta, tardará varios segundos en estar listo y no será buena la experiencia de usuario.
Cómo hacer precarga de todos los módulos
Puedes decirle a tu aplicación que, por defecto, precargue todos los módulos con la siguiente configuración.
Importando PreloadAllModules desde @angular/router, lo pasas como parámetro al import en el decorador @NgModule(). De esta manera, se cargarán en el primer render TODOS los módulos que tu aplicación tenga, pudiendo ver por consola algo como lo siguiente.
Pasos para una estrategia personalizada de precarga
Precargar todos los módulos a la vez, puede ser contraproducente. Imagina que tu aplicación posea 50 o 100 módulos. Sería lo mismo que tener todo en un mismo archivo main.js.
Para solucionar esto, puedes personalizar la estrategia de descarga de módulos indicando qué módulos si se deben precargar y cuáles no.
1. Agrega metadata a cada ruta
Agrégale a cada regla en el routing de tu aplicación, metadata para indicarle a cada módulo si debe ser precargado, o no.
Con la propiedad data: { preload: true }, le indicas al servicio CustomPreloadingStrategy si el módulo debe ser precargado en el primer render de tu app.
2. Crea un servicio con estrategia personalizada
Crea un servicio al cual llamaremos CustomPreloadingStrategy con la siguiente lógica.
El servicio implementa PreloadingStrategy y sobreescribiendo el método preload(), hace uso de la metadata para desarrollar tu propia lógica de renderizado de módulos.
3. Importa tu estrategia
Finalmente, importa tu estrategia personalizada en el routing.
Dado que el modularizar la app se tienen varios chuncks y cada uno de estos corresponde a un archivo de JS, a su vez cada uno de estos archivos requiere de una petición al servidor y al descargarse cada archivo JS debe pasar por varias etapas para su ejecución. Esto puede tardar mucho en conexiones lentas. Una forma que proporciona Angular para solucionar esto es aprovechar los momentos de inactividad del navegador después de la carga inicial para descargar en segundo plano los archivos de los otros módulos mientras el usuario navega por el website. A este proceso se le conoce como precarga de módulos.
PreloadAllModules → Es ideal para aplicaciones que no sean muy grandes o no ocupen muchos módulos.
En el caso de tener muchos módulos es mejor usar una estrategia personalizada para evitar sobrecargar el hilo principal. De esta forma se establece que módulos se van a precargar.
Esta clase es extremadamente interesante, al reducir la cantidad de JS a descargar támbien reducimos el bundle de JS, lo que mejora el SEO de la página.
La pregunta sería:¿ hay alguna forma de generar un orden fijo para hacer el preloading?
Supongamos que se cual es la ruta fija que suelen seguir mis usuarios al visitar la página, ¿es posible que el preloading sea secuencial, primero una página luego la siguiente luego la siguiente, sin necesidad de que cargue el segundo grupo de golpe?
Se me ocurre algo tipo utilizar un callback
Wow gran pregunta al menos con la estrategia de Custom no es posible, pero algo que se parece mucho al que tú sugieres es depende al los comportamientos de navegación de tu usuario hacer el prefetching usando Machine Learning con GuesJS, te comparto esta charla que di en donde explico como funciona y me dices si es lo que estás buscado.
En componentes standalone la configuracion del preloadAllModules se hace en el app.config.ts
¿Hasta cuántos módulos se recomienda usar el PreLoadAllModules?
Hola, no hay un número definido, pero yo creo que depende más de la experiencia de los usuarios, si vez en el Network de Chrome que está teniendo sobre carga de pre loading es momento de pensar en otra estrategia. Si necesitas un número yo diría que si tienes más de 40 módulos ya se vuelve un problema, pero recuerda también depende de tu tipo de usuario, si tus usuarios tiene una buena conexión no considero que haya problema, etc.
ese app-routing.modules.ts que parte de la estructura esta? o sea app-routing.modules.ts del cms?
Existirá alguna forma de que el preload funciona tal como quedo en la clase (se precargue website y category pero no cms) pero cuando entre a CMS en automatico ahora se precarguen sus sub modulos (si los tuviera) pero algunos si y otros no?
Gracias, excelente curso.