Después de un mes de diciembre tan ajetreado que convirtió mi calendario en una partida de Tetris, aquí estoy, ¡abrazando el arte de la pereza! Pero no temáis, queridos desarrolladores, porque en el mundo de los desarrolladores, "perezoso" no es sólo un estilo de vida de teleadicto: es una estrategia inteligente.

Hoy te mostraré cómo ser "perezoso" puede turboalimentar el rendimiento de tu aplicación. Sumerjámonos en el paradójico universo en el que la pereza equivale a la eficiencia :D

Lazy-loading module

Es una técnica que permite cargar módulos sólo cuando son necesarios, en lugar de cargarlos todos al inicio de tu aplicación.

Esto puede mejorar el rendimiento y la eficiencia de su aplicación, ya que reduce el tiempo de carga inicial, el uso de memoria y el consumo de ancho de banda.

Lazy-loading también puede ayudarte a evitar dependencias y errores innecesarios, ya que sólo cargas los módulos que son relevantes para tu contexto actual.

Me gustaría mostrarte cómo funciona el lazy loading a nivel de ruta y a nivel de servicio.

Carga perezosa a nivel de enrutamiento

  • Configuración de un proyecto NestJS básico
  • Comience creando un nuevo proyecto NestJS o utilizando uno existente.

Recuerda que si tu quieres aprender NestJS puedes adquirir el CURSO o te dejo el siguiente video

nest new my-nest-project

Creación de un módulo de carga lenta


Genera un nuevo módulo, LazyModule, que cargaremos perezosamente.

nest generate module lazy

Defina el módulo en lazy.module.ts.

Configuración de Lazy-Loading en AppModule


En su app.module.ts, configure la carga perezosa para LazyModule utilizando el RouterModule.

import { Module } from '@nestjs/common';
import { RouterModule } from '@nestjs/core';

@Module({
  imports: [
    RouterModule.register([
      {
        path: 'lazy',
        loadChildren: () => import('./lazy/lazy.module').then(m => m.LazyModule),
      },
    ]),
    // other imports
  ],
  // controllers, providers
})
export class AppModule {}

Comprobación de la carga perezosa


Accede a la ruta (por ejemplo, http://localhost:3000/lazy) y comprueba que LazyModule sólo carga bajo petición.

Lazy-Loading dinámico en un servicio


Uso de LazyModuleLoader


En un escenario diferente, puede que necesites cargar un módulo dinámicamente dentro de un servicio. He aquí cómo implementarlo:

Implementación de PrimaryModule y Service


En tu primary.module.ts inyecta LazyModuleLoader en un servicio, PrimaryService.

// primary.service.ts
import { Injectable } from '@nestjs/common';
import { LazyModuleLoader } from '@nestjs/core';

@Injectable()
export class PrimaryService {
  constructor(private lazyModuleLoader: LazyModuleLoader) {}

  async loadLazyModule(): Promise<void> {
    const { LazyModule } = await this.lazyModuleLoader.load(() => import('./lazy/lazy.module'));
    // Use LazyModule
  }
}

Activación de la carga lenta


El método loadLazyModule puede ser invocado basándose en condiciones o acciones específicas dentro de su aplicación.

Escenario del mundo real: Implementación de Feature Flags


Considere un escenario donde ciertas características de su aplicación están detrás de banderas de características.

Puedes utilizar LazyModuleLoader para cargar módulos que contengan estas características sólo cuando la bandera de característica esté activada.

// feature-flag.service.ts
import { Injectable } from '@nestjs/common';
import { LazyModuleLoader } from '@nestjs/core';

@Injectable()
export class FeatureFlagService {
  constructor(private lazyModuleLoader: LazyModuleLoader) {}

  async loadFeatureModule(featureName: string): Promise<void> {
    if (featureName === 'newFeature') {
      await this.lazyModuleLoader.load(() => import('./feature/feature.module'));
      // Feature module loaded
    }
  }
}

Conclusión


Lazy-loading en NestJS puede mejorar significativamente el rendimiento y la gestión de recursos de su aplicación.

Ya sea a través de la carga perezosa basada en rutas o la carga dinámica de módulos dentro de un servicio, esta técnica ofrece flexibilidad y eficiencia en la gestión de grandes aplicaciones.

Puede haber casos en los que determinados módulos sólo se necesiten en condiciones o configuraciones de tiempo de ejecución específicas. Por ejemplo, en aplicaciones a gran escala con colas de mensajes o procesamiento de trabajos en segundo plano, la carga diferida puede ser muy ventajosa.

Por ejemplo, si determinados gestores de colas sólo son necesarios en determinadas circunstancias (como el procesamiento de trabajos de alta prioridad o la gestión de tareas específicas de determinados eventos empresariales), la carga perezosa de estos gestores bajo demanda puede conducir a una utilización más eficiente de los recursos.

En sistemas con numerosas tareas programadas, algunas pueden ser relevantes sólo en momentos concretos o bajo determinadas condiciones.

Por ejemplo, una tarea puede ser necesaria sólo al final de un trimestre financiero o para generar informes específicos para determinados segmentos de usuarios. La carga perezosa de estos gestores de tareas garantiza que los recursos del sistema no se ocupen innecesariamente.

Aunque el lazy-loading añade cierta complejidad, sus beneficios en términos de optimización de recursos y flexibilidad pueden ser significativos, especialmente en grandes aplicaciones con funcionalidades requeridas condicionalmente como sistemas de colas y tareas programadas.

Como siempre, la clave está en evaluar cuidadosamente si los beneficios compensan la complejidad añadida en tu contexto específico.

Fuente