
Arquitectura moderna Microfrontends: Caso real TCG Pocket – II
Ahora comenzamos la parte práctica del proyecto:
✅ Creamos el monorepo con Nx.
✅ Generamos la app shell
, que servirá de host para los microfrontends.
✅ Configuramos next-i18next
para traducción en español e inglés.
✅ Verificamos que el servidor funcione localmente y muestra el texto traducido correctamente.
Paso 1: Crear el monorepo con Nx
Usaremos Nx por su robustez y soporte para múltiples frameworks (Next.js, NestJS, React, etc.).
npx create-nx-workspace@latest tcg-pocket --preset=apps --package-manager=npm --workspaceType=integrated
Explicación:
-
tcg-pocket
: nombre del workspace. -
--preset=apps
: crearemos un monorepo sin proyectos iniciales. -
--package-manager=npm
: usaremos npm (puedes usar pnpm o yarn si prefieres).
Paso 2: Instalar plugins para Next.js y NestJS
npm install --save-dev @nx/next @nx/nest
-
@nx/next
: para apps Next.js. -
@nx/nest
: para el backend BFF con NestJS.
Paso 3: Generar la aplicación shell
(Next.js)
npx nx g @nx/next:app apps/shell --style=tailwind
Esto crea:
/apps/shell
Con todos los archivos de un proyecto Next.js básico.
Paso 4: Añadir soporte para next-i18next
Instalamos la librería:
npm install next-i18next
Creamos la configuración base de i18n en la raíz del shell:
// next-i18next.config.js
module.exports = {
i18n: {
defaultLocale: 'es',
locales: ['es', 'en'],
},
};
Paso 5: Configurar Next.js para usar i18n
Edita /apps/shell/next.config.js
:
//@ts-check
const { composePlugins, withNx } = require('@nx/next');
const { i18n } = require('./next-i18next.config');
/**
* @type {import('@nx/next/plugins/with-nx').WithNxOptions}
**/
const nextConfig = {
reactStrictMode: true,
i18n,
nx: {},
};
const plugins = [
withNx,
];
module.exports = composePlugins(...plugins)(nextConfig);
Paso 6: Crear archivos de traducción
Creamos carpetas de traducción dentro de la app shell
:
/apps/shell/public/locales
/es
common.json
/en
common.json
Ejemplo de /apps/shell/public/locales/es/common.json
:
{
"title": "Bienvenido a TCG Pocket Explorer",
"description": "Explora cartas de Pokémon TCG Pocket con arquitectura moderna"
}
Y para /en/common.json
:
{
"title": "Welcome to TCG Pocket Explorer",
"description": "Explore Pokémon TCG Pocket cards with modern architecture"
}
Paso 7: Usar traducción en la app
Edita /apps/shell/pages/index.tsx
:
import { useTranslation } from 'next-i18next';
import { serverSideTranslations } from 'next-i18next/serverSideTranslations';
export default function Home() {
const { t } = useTranslation('common');
return (
<main className="flex flex-col items-center justify-center min-h-screen">
<h1 className="text-3xl font-bold">{t('title')}</h1>
<p className="mt-2 text-gray-600">{t('description')}</p>
</main>
);
}
// Para que Next.js cargue las traducciones en SSR:
export async function getStaticProps({ locale }: { locale: string }) {
return {
props: {
...(await serverSideTranslations(locale, ['common'])),
},
};
}
Editar el archivo pages/_app.tsx:
import { AppProps } from 'next/app';
import Head from 'next/head';
import './styles.css';
import { appWithTranslation } from 'next-i18next';
function CustomApp({ Component, pageProps }: AppProps) {
return (
<>
<Head>
<title>Welcome to shell!</title>
</Head>
<main className="app">
<Component {...pageProps} />
</main>
</>
);
}
export default appWithTranslation(CustomApp);
Esto nos permitirá usar la traducción en toda la web.
Paso 8: Levantar el servidor y probar
Arrancamos la app shell
:
nx run shell:dev
Esto corre en http://localhost:3000
.
Probar el cambio de idioma
Para ver cómo funciona la traducción:
-
Accede a
http://localhost:3000/es
→ ves la versión en español. -
Accede a
http://localhost:3000/en
→ ves la versión en inglés.
¡La traducción ya está activa y funcionando!
¿Qué logramos?
✅ Monorepo base creado y estructurado con Nx.
✅ App shell
Next.js lista como host de microfrontends.
✅ Configuración de i18n con next-i18next
y traducciones en español e inglés.
✅ Servidor corriendo y funcionando correctamente.
¿Qué sigue?
En el próximo post:
-
Agregaremos los microfrontends
sets
ycards
. -
Configuraremos Module Federation para que el
shell
cargue sus módulos remotos. -
Documentaremos la configuración y primeras integraciones.
-- ¿Quieres recibir mi newsletter? --
No te pierdas de aprender:
Mi newsletter mensual viene con una dosis de inspiración, recursos para descargar, consejos de desarrollo rápidos y los mismos recursos que aprendo.