Patrones de arquitectura para proyectos escalables con Next.js y App Router

Descubre cómo estructurar un proyecto Next.js con App Router de forma escalable y profesional. Aprende buenas prácticas en modularización, server components, CI/CD, testing, y más. Incluye ejemplos reales y una plantilla descargable para comenzar.

January 1, 1970

Joan Sebastian Oviedo

Joan Sebastian Oviedo

Ingeniero Informático

nextjs proyectos imagen

🧱 Patrones de arquitectura para proyectos escalables con Next.js y App Router

🧑‍💻 Introducción

Con la llegada del App Router en Next.js 13 y su madurez en la versión 14, la forma en que estructuramos nuestras aplicaciones cambió. Ya no se trata solo de crear páginas: ahora podemos pensar en layouts compartidos, segmentación avanzada por rutas, server components, y una arquitectura que pueda escalar en equipos grandes o proyectos a largo plazo.

En este artículo comparto la arquitectura que estoy usando actualmente en un proyecto real, combinando Next.js con App Router, y aplicando principios de modularización, separación de lógica, testing y mantenibilidad.

📁 Estructura moderna con App Router

La base de todo proyecto con App Router parte desde la carpeta /app. Aquí se define la estructura visual de la aplicación mediante layout.tsx, page.tsx, not-found.tsx, y la segmentación por rutas.

src/
├── app/
│ ├── (auth)/
│ │ ├── login/
│ │ ├── register/
│ │ └── layout.tsx
│ ├── configuracion/
│ ├── cotizaciones/
│ ├── layout.tsx
│ ├── not-found.tsx
│ └── page.tsx

Agrupar rutas como (auth) permite tener layouts específicos, aislar funcionalidades, y mejorar el orden de navegación. El uso de not-found.tsx mejora la UX y el control de errores.

🧩 Separación modular por features

Además del uso de App Router, implemento una capa features/ donde cada módulo de negocio se encapsula con sus propios componentes, hooks, datos y servicios.

features/
├── auth/
├── configuracion/
├── cotizaciones/
└── landing/

Esta organización permite escalar en equipos, mantener independencia entre módulos, y tener un enfoque de Feature-Sliced Design.

🔌 Server Components y lógica desacoplada

Para mantener la lógica desacoplada del renderizado, uso data/ dentro de cada feature y funciones async que pueden ser utilizadas directamente desde Server Components.

// features/configuracion/data/tarifas.ts
export async function getTarifas() {
const res = await fetch(`${process.env.API_URL}/tarifas`, { cache: 'no-store' })
return res.json()
}

Luego, esa lógica se puede consumir directamente en el archivo page.tsx del módulo configuracion, manteniendo una clara separación de responsabilidades.

📦 Buenas prácticas: hooks, lib, actions

En la raíz del proyecto tengo carpetas para lógica reutilizable:

hooks/
use-mobile.ts
lib/
apollo/
helpers.ts
utils.ts

Este enfoque me permite extraer funciones comunes (como detección de móvil, lógica de Apollo Client o formateadores) sin mezclarlas con componentes visuales.

// hooks/use-mobile.ts
export const useMobile = () => {
const [isMobile, setIsMobile] = useState(false);
useEffect(() => {
setIsMobile(window.innerWidth < 768);
}, []);
return isMobile;
};

🌍 Internacionalización, metadata y SEO

Manejo las imágenes, íconos y configuraciones SEO desde public/ y archivos como robots.txt, favicon.ico, además de utilizar generateMetadata() desde el App Router para mejorar el SEO de cada página.

// app/configuracion/page.tsx
export const metadata: Metadata = {
title: 'Configuración del sistema',
description: 'Panel de configuración para administrar usuarios y parámetros del sistema.',
}

🧪 Testing y control de calidad

Actualmente uso TypeScript con ESLint y Prettier para mantener un código limpio. La arquitectura permite agregar fácilmente herramientas como:

  • Jest o Vitest para pruebas unitarias
  • Playwright para pruebas end-to-end
  • Husky + lint-staged para validación en pre-commits

📘 Conclusión y recursos

Esta estructura me ha permitido trabajar de forma más organizada, escalar fácilmente entre proyectos frontend y fullstack, y mantener la mantenibilidad a largo plazo.

Si quieres implementar esta arquitectura desde cero, puedes descargar el template base que uso como punto de partida:

🔗 Repositorio base – Plantilla Next.js App Router

Este artículo forma parte de mi blog profesional donde comparto prácticas reales como desarrollador y líder técnico. Si te interesa seguir leyendo sobre buenas prácticas, DevOps, backend, o gestión de proyectos, puedes seguir explorando 👉 jojanes.com/blog

Enviar mensaje por WhatsApp

Have a Project in Mind?

Let's discuss your ideas and bring them to life. Whether you're looking to build a website, web application, or digital experience, I'm here to help. Reach out to me today and let's get started!

LET'S TALK
Image 0Image 1Image 2Image 3Image 4Image 5Image 6Image 7Image 8Image 9
Image 0Image 1Image 2Image 3Image 4Image 5Image 6Image 7Image 8Image 9