Pablo Marzal Garrigós

Cómo organizar tu proyecto de React con PODS

Aprende a organizar tu código para mantenerlo limpio y escalable.

Uno de los mayores desafíos en el desarrollo de software es mantener tu código limpio, escalable y fácil de mantener. Cuando estás usando frameworks como React, la organización del código es clave para que la aplicación pueda escalar sin volverse un caos.

Veamos cómo organizar un proyecto utilizando Pods, un enfoque que permite dividir tu aplicación en unidades auto-contenidas, donde cada pod tiene su propia lógica, componentes, y comunicación con el backend. Además, veremos cómo separar las preocupaciones para mantener el código más modular y flexible, usando un ejemplo práctico que puedes usar como plantilla.

🔗 React Pods Architecture Boilerplate

¿Qué es un "Pod" y por qué usarlo?

El concepto de Pod proviene de la idea de agrupar todo lo relacionado con una funcionalidad específica dentro de un único "contenedor". En este contenedor o "pod", puedes incluir componentes, lógica de negocio, interacción con APIs, modelos de datos, y todo lo que pertenece a esa funcionalidad. La ventaja principal es que cada unidad es independiente, lo que hace que el código sea más fácil de manejar y de escalar.

Estructura Básica del Proyecto con Pods

Para que los pods sean efectivos, es esencial seguir una estructura que favorezca la organización. Aquí te muestro cómo puedes estructurar los archivos dentro de un pod:

pod architecture
  1. Container: Gestiona el estado y la comunicación con la API.
  2. Component: Únicamente responsable de renderizar el diseño y los elementos visuales.
  3. components (optional): Una carpeta donde se pueden almacenar componentes adicionales más pequeños, normalmente cuando se descompone el componente principal en subcomponentes reutilizables.
  4. API: Esta carpeta contiene los archivos necesarios para interactuar con la API de backend. Esto incluye la obtención de datos y su asignación desde los modelos API a los modelos de vista. La lógica de la API se mantiene separada del contenedor para garantizar una mejor modularidad.

Beneficios de utilizar este tipo de arquitectura

  1. Separación de preocupaciones: Al dividir la lógica entre contenedores y componentes, y aislar la lógica relacionada con la API, mantenemos una clara separación de preocupaciones, lo que hace que el código sea más fácil de gestionar y escalar.
  2. Reutilización: Cada pod encapsula una funcionalidad específica, que puede reutilizarse en diferentes páginas o funcionalidades.
  3. Encapsulación de la API: En lugar de tener una carpeta de API centralizada, el acceso a la API se almacena dentro del pod correspondiente, manteniendo juntos los activos relacionados. Esto también reduce el riesgo de que modificaciones accidentales afecten a otras partes de la aplicación.

Conceptos avanzados de esta estructura

  1. Manejo de la API: El contenedor no trata directamente con el modelo API en bruto. En su lugar, introducimos mappers para convertir los modelos de API en modelos de vista. Esto mantiene la vista y la lógica separadas de los detalles del backend.
  2. Patrón de repositorio: En algunos casos, la comunicación de la API se abstrae aún más en un repositorio que habla en lenguaje «viewmodelish». Esto ayuda a desacoplar completamente la vista del modelo de datos.

Una plantilla para comenzar

El enfoque de Pods es una de las mejores maneras de mantener tu proyecto organizado y limpio a medida que crece. Separar la lógica en pequeñas unidades auto-contenidas hace que el código sea más fácil de mantener. Te dejo una plantilla con el código completo a los conceptos de pods que acabamos de ver y cómo organizarlos en tu propio proyecto. Al utilizar este enfoque, estarás listo para comenzar a crear aplicaciones escalables y fáciles de mantener desde el principio.

Aquí tienes un resumen de los principales directorios que encontrarás dentro de src:

  1. Layout: Contiene los principales componentes de layout utilizados en toda la aplicación.
  2. Router: Esta carpeta contiene la configuración de enrutamiento utilizando react-router-dom, permitiendo la navegación entre diferentes escenas.
  3. Scenes: Cada escena conecta un layout específico con uno o más pods, representando distintas vistas de la aplicación.
  4. Global-css: Esta carpeta incluye estilos globales como reset, normalize y responsive breakpoints.
  5. Pods: Siguiendo el enfoque de los pods, encapsulamos una gran cantidad de funciones en pods aislados. Estos pods actúan como islas de funcionalidad y, según nuestra experiencia, suele haber una correspondencia unívoca entre un pod y una página.