QP Suspense es una implementación de la lógica de Suspense (al estilo React, Vue, Svelte). Muy en simple (y raptando descaradamente la definición de Suspense que trae React):
<Suspense>
lets you display a fallback until its children have finished loading.
Entonces tenemos que aplicando suspense
podemos, de alguna manera, asegurar que el o los componentes serán desplegados cuando efectivamente estén listos para ser desplegados. Y mientras tanto se muestra un loader (fallback).
De momento el único requerimiento es una versión de Angular >= v14 , ya que utiliza componentes y directivas standalone
.
La librería aún no está publicada en NPM, sin embargo se puede instalar desde el repositorio Github, referenciando directamente el paquete:
npm install https://github.com/QuePlan/qp-suspense/releases/download/v1.0.1/queplan-qp-suspense-1.0.1.tgz
Versiones disponibles: https://github.com/QuePlan/qp-suspense/releases
Resumiendo mucho el uso de este componente, el caso de uso más simple es:
<suspense>
<ng-template [defaultView]="myComponentFactory"></ng-template>
<ng-template fallbackView>
<p>Cargando componente MyComponent</p>
</ng-template>
<ng-template errorView>
<p>ERROR cargando componente MyComponent</p>
</ng-template>
</suspense>
y bajo el supuesto que el código no sea lo suficiente autoexplicativo:
Si se desea minimizar el LCP reservando el espacio para el componente, se puede utilizar un elemento HTML, con estilos o clases CSS; y usar suspense como una directiva de tipo atributo:
<section suspense style="display: block; min-height: 15rem;">
<ng-template [defaultView]="usersFactory" [componentParams]="componentParams"></ng-template>
<ng-template fallbackView>
<h4>Fetching Users...</h4>
</ng-template>
</section>
setupReady
y hasError
.En todos los casos, los componentes deben estar definidos como alguna variedad de Suspenseable, y según sea la clase que extienden, serán los métodos que van a requerir implementar (los subtipos + OOP se encargan de esa magia).
Para mayor información se recomienda ejecutar el proyecto de ejemplo:
npm start -- --configuration=development --project qp-suspense-demo --o
El detalle cada caso supuestamente está bien documentado.