Necesidades de negocio (historias de usuario, diseño, etc)
Necesidades de negocio (requerimientos, historias de usuario, criterios de aceptación, diseño, UX/UI, análisis de impacto esfuerzo de features, refinamiento, pruebas de usuario, focus group, brainstorming, etc)
Arquitectura base (capas)
📦 Features
- Dividir la app en módulos funcionales (Feature Modules) en lugar de tener todo al mismo nivel que la carpeta
app. - core para manejar servicios singleton y configuraciones globales.
- shared para componentes, pipes y directivas reutilizables.
Los módulos deberan tener la siguiente estuctrura de carpetas:
- Carpeta models donde estaran las interfaces y tipos (Model).
- Carpeta services donde estaran los servicios que gestionan la data y se comunican con la API.
- Carpeta viewmodels donde estaran los componentes inteligentes que manejan la lógica de negocio (ViewModel).
- Carpeta views donde estaran los componentes "tontos" que solo muestran datos (View)
- Archivo de rutas, Ej:
products.routes.ts.
│── features/ # Funcionalidades organizadas
│ ├── dashboard/ # Módulo de negocio específico.
│ ├── services/ # Servicios propios del modulo
│ ├── model/ # Modelos de datos.
│ ├── viewmodels/ # Adaptadores entre modelos y vistas (comp "inteligentes")
│ ├── views/ # Componentes visuales del modulo. (comp "tontos")
Lineamientos:
| Atributo | Definición |
|---|---|
| Nombre | El nombre de la carpeta del modulo se debe declarar lo más sencillo, descriptivo y corto posible. |
| Idioma | Inglés |
| Estilo Variable | kebab-case |
| Nomenclatura | <module-name> Ejemplo: products |
| Consideraciones | - No usar espacios, tildes, caracteres especiales ni la letra ñ. Evitar el uso de abreviaturas o acrónimos. Evitar combinar palabras inglés-español. |
Nota: Ocupar el patrón standalone esta prohibido usar los archivos <name>.module.ts y <name>-rounting.module.ts
⚙️ Services
Los servicios en microfrontends (MFEs) en Angular deben ser diseñados para garantizar independencia, comunicación eficiente y escalabilidad. Por lo anterior, se deberán validar y seguir las siguientes prácticas para implementar servicios correctamente en una arquitectura basada en microfrontends.
1. Independencia de los servicios
- Cada microfrontend debe tener sus propios servicios para garantizar que los módulos sean autónomos.
- Los servicios no deben depender de otros microfrontends para evitar acoplamiento entre ellos.
- Utiliza inyección de dependencias para que los servicios sean fácilmente testeables y reutilizables.
2. Comunicación entre microfrontends
- Eventos Globales: Utiliza un bus de eventos (por ejemplo, RxJS) para permitir que los MFEs se comuniquen entre sí sin acoplarse directamente.
- Interfaz de Comunicación: Define un contrato claro y API estándar para la comunicación entre microfrontends. Asegúrate de que la comunicación sea robusta y versionada.
3. Escalabilidad
- A medida que crecen los MFEs, los servicios deben ser capaces de manejar más usuarios y más peticiones de manera eficiente.
4. Testing
- Asegúrate de que los servicios sean probados de forma aislada y sin depender de otros microfrontends.
- Utiliza pruebas unitarias, pruebas de integración y pruebas end-to-end (E2E) para asegurar que los servicios se comporten como se espera.
5. Documentación
- Documenta las APIs y servicios de manera clara y accesible para todos los equipos de desarrollo. Esto facilitará la integración y escalabilidad de los microfrontends.
Lineamientos:
| Atributos | Definición |
|---|---|
| Nombre | Se debe declarar el nombre lo más sencillo, descriptivo y corto posible. |
| Definición | Parte fundamental en el desarrollo de un componente que será usada para comunicar el aplicativo front con las APIs. |
| Idioma | Inglés |
| Estilo Variable | kebab-case |
| Nomenclatura | <name>-service.ts |
| Ejemplo | general.service.ts |
| Consideraciones | No usar espacios, tildes, caracteres especiales, ni la letra ñ. Evitar el uso de abreviaturas o acrón |
Seguir las siguientes recomendaciones a la hora construir un servicio:
- Se recomienda usar Observables en los retornos de las respuestas de los servicios.
- Se recomienda usar Interfaes en las respuestas de los servicios.
- Se recomienda hacer operaciones y transformaciones de datos con rxjs antes de pasar la información a las vistas.
Ejemplo:
import { HttpClient } from "@angular/common/http";
import { Injectable } from "@angular/core";
import { map, Observable } from "rxjs";
import { IProductCard } from "../models/product.model";
import { IResponseAnime } from "../models/anime-api.interface";
@Injectable({ providedIn: "root" })
export class ProductsService {
constructor(private _httpClient: HttpClient) {}
getProducts(): Observable<IProductCard[]> {
return this._httpClient
.get<IResponseAnime>("https://api.jikan.moe/v4/anime?q=kimetsu&sfw")
.pipe(
map((response) => {
return response.data
.filter((item) => item.synopsis)
.map<IProductCard>((item) => ({
urlImage: item.images.jpg.image_url,
price: this._getNumberRandom(),
name: item.title,
description: item.synopsis!,
}));
})
);
}
private _getNumberRandom() {
return Math.floor(Math.random() * (500 - 1 + 1) + 1);
}
}
Cada microfrontend debe manejar su propio estado de servicio y evitar compartir instancias globales.
Comunicación entre Microfrontends
Cuando los microfrontends necesitan comunicarse los únicos mecanismos disponibles para ello será:
- Eventos
- Event Bus con RxJS