El patrón Proxy controla el acceso a un objeto costoso, sin cambiar su interfaz.
1. El Problema de Partida
getAllMdxFiles(dir) recorre recursivamente el filesystem con fs.readdirSync. Durante generateStaticParams, generateMetadata y el render de cada página, Next.js invoca esta función decenas de veces para la misma colección, repitiendo lecturas de disco idénticas en cada build (ver también Patrón Singleton que resuelve un problema similar con instancia única).
2. La Solución Proxy
// src/lib/mdxFilesProxy.js
import { getAllMdxFiles as realGetAllMdxFiles } from './mdx';
class MdxFilesCacheProxy {
cache = new Map();
getAllMdxFiles(dir) {
if (this.cache.has(dir)) {
return this.cache.get(dir); // Acceso controlado: no toca el filesystem
}
const files = realGetAllMdxFiles(dir); // Delega al objeto real
this.cache.set(dir, files);
return files;
}
}
export default new MdxFilesCacheProxy();3. Uso — misma interfaz, cero cambios en el cliente
// app/knowledge/[...slug]/page.jsx
import mdxFilesProxy from '@/lib/mdxFilesProxy';
// ANTES: import { getAllMdxFiles } from '@/lib/mdx'; getAllMdxFiles(dir)
// DESPUÉS: mismo nombre de método, ahora cacheado por el proxy
const files = mdxFilesProxy.getAllMdxFiles('content/knowledge/es');4. Ventajas
- Transparente para el cliente:
generateStaticParams,generateMetadatay el render llaman igual que antes. - Una sola lectura de disco por directorio durante todo el build, en vez de una por cada llamada.
- Reversible sin riesgo: si el proxy diera problemas, basta con volver a importar
getAllMdxFilesdirectamente.