Desarrollo React en Marruecos

Construyo apps React en TypeScript para que la interfaz crezca sin romperse — dashboards, portales y sistemas alineados con el producto.

Eso incluye dashboards, portales de cliente y design systems alineados con cómo funciona el producto de verdad — no un tema de admin genérico.

TypeScript no es decoración sobre JavaScript — es lo que permite a un componente saber qué forma de datos recibe antes de que esa suposición se rompa en producción. Un dashboard que sigue el estado de una flota o de operaciones de tesorería tiene suficiente estado en movimiento como para que detectar un campo mal tipado en compilación ahorre una sesión de depuración después.

Los sistemas de componentes se organizan por dominio — facturación, flota, inventario — no por tipo de archivo genérico, así que una pantalla nueva en un dominio existente reutiliza lo que ya hay en vez de partir de un componente vacío. El estado que debe estar en vivo, como un mapa de flota, se alimenta de los mismos eventos WebSocket que el backend ya emite en lugar de un bucle de polling aparte.

Entrego Vite + React para UIs de producto autenticadas cuando el renderizado en servidor añade complejidad operativa sin un beneficio real, y Next.js cuando el producto necesita SSR o es contenido público. La elección se basa en lo que la interfaz tiene que hacer de verdad, no en un valor por defecto.

Problemas de negocio

  • Un dashboard de componentes sin lenguaje de dominio, así que un desarrollador nuevo tiene que leer cada archivo para adivinar para qué sirve un trozo de UI.
  • JavaScript que no se puede refactorizar cuando el producto crece, porque nada impone qué forma de datos espera una función o un componente hasta que falla en tiempo de ejecución.
  • Una gestión de estado que creció de forma orgánica en un enredo de prop drilling y contexto improvisado, así que un simple cambio de UI arriesga romper una pantalla tres niveles más allá.
  • Prop drilling a través de cinco componentes por falta de un límite de estado claro, así que un pequeño ajuste de UI significa tocar archivos que no tienen nada que ver con el cambio real.
  • Una librería de componentes que duplica el mismo botón, input y tabla en cuatro versiones ligeramente distintas porque nadie es dueño de la consistencia.
  • Un tamaño de bundle que crece sin notarlo hasta que una página tarda visiblemente más en cargar, porque nadie vigilaba qué traía cada nueva dependencia.
  • Formularios sin retroalimentación de validación real, así que un usuario solo descubre qué falló después de enviarlo a un agujero negro.

Proceso de desarrollo

  1. TypeScript primero. Organizar por dominio (facturación, flota, inventario), no por tipo de archivo, para que la lógica y los componentes relacionados queden juntos en vez de dispersos en carpetas genéricas.
  2. Consumir un contrato de API real — a menudo Laravel REST del mismo encargo — con tipos generados o escritos a mano que mantienen el frontend honesto sobre lo que el backend devuelve de verdad.
  3. Mantener el estado en vivo (dashboards dirigidos por WebSocket, mapas en tiempo real) separado del estado petición-respuesta, para que un componente no tenga que adivinar a qué tipo de actualización está reaccionando.
  4. Establecer pronto una pequeña librería de componentes compartida — inputs, tablas, modales — para que las pantallas nuevas se compongan a partir de ella en vez de reinventar la UI básica cada vez.
  5. Escribir la capa de obtención de datos una vez por dominio (un hook, un query client) en vez de esparcir llamadas fetch por los componentes, para que un cambio de backend toque un solo lugar, no veinte.
  6. Vigilar el tamaño del bundle como parte del build, no como una auditoría ocasional, para que una nueva dependencia pesada sea una decisión consciente, no un accidente.
  7. Construir los formularios con validación en línea y estados de error claros desde el inicio, ya que ahí es donde ocurre la mayor parte de la frustración de un usuario con un producto.

Qué obtienes

  • UIs de producto coherentes al añadir módulos, porque la estructura de componentes y dominio se diseñó para crecer en vez de remendarse para sobrevivir.
  • Errores de tipos detectados antes de un deploy en vez de descubiertos por un usuario haciendo clic en el botón equivocado en el momento equivocado.
  • Menos inconsistencias visuales, porque un botón se comporta igual en la pantalla de facturación que en la de flota.
  • Incorporar a un desarrollador frontend nuevo requiere un recorrido por la estructura de dominio, no una excavación arqueológica entre componentes sin relación.
  • Un producto que se mantiene rápido de cargar a medida que crece, porque el tamaño del bundle fue una restricción desde el principio, no un simulacro de emergencia después.
  • Formularios que dicen a un usuario qué falla antes de enviar, no después, que es de donde vienen la mayoría de los tickets de soporte sobre un formulario roto.
  • Una librería de componentes que un diseñador puede tomar sin un largo paso de traducción, porque los componentes ya coinciden con los mismos nombres usados en los archivos de diseño.

Proyectos seleccionados

FAQ

Do you use Next.js?

When the product needs SSR or a content-heavy public site. For authenticated product UIs I often ship Vite + React, which is faster to operate.

Empezar un proyecto →