¡Vite + Module Federation es INCREÍBLE!

¡Vite + Module Federation es INCREÍBLE!

Erick Medel Galindo

Introducción

Personalmente, me encanta la simplicidad de Vite, así que en este post explicaremos paso a paso, de manera sencilla, cómo modularizar nuestras aplicaciones frontend para utilizar una arquitectura de microfrontend.

La arquitectura de microfrontend nos permite dividir partes de nuestra aplicación en módulos individuales y autónomos, brindando a los equipos frontend la misma flexibilidad y velocidad que los microservicios ofrecen a los equipos de backend.

Para este post usaré Bun, por lo que será una dependencia a tener en cuenta si deseas seguir el paso a paso.

Puedes instalar Bun siguiendo las instrucciones en este enlace.

Paso 1: Crear las aplicaciones host y remota

Primero, crea las aplicaciones host y remota de React usando Vite CLI.

bun create vite host --- --template react-ts bun create vite remote --- --template react-ts

Paso 2: Configurar la aplicación remota

Ahora, instalemos las dependencias necesarias y agreguemos el plugin Module Federation a la aplicación remota.

cd remote bun install bun install @module-federation/vite

Crea una nueva carpeta y archivo para el componente que será expuesto por la aplicación remota.

mkdir ./src/components touch ./src/components/ExampleComponent.tsx

Agrega el siguiente código al archivo ExampleComponent.tsx.

export default () => { return <span style={{ backgroundColor: 'lightblue', borderRadius: '5px', padding: '5px', margin: '5px', display: 'inline-block', border: '1px solid black', }}> Module Federation 😎 </span>; };

En el archivo vite.config.ts, agrega la siguiente configuración para exponer el componente.

import { federation } from '@module-federation/vite'; import react from '@vitejs/plugin-react'; import { defineConfig } from 'vite'; import { dependencies } from './package.json'; export default defineConfig(() => ({ build: { target: 'chrome89', }, plugins: [ federation({ filename: 'remoteEntry.js', name: 'remote', exposes: { './remote-app': './src/components/ExampleComponent', }, remotes: {}, shared: { react: { requiredVersion: dependencies.react, singleton: true, }, }, }), react(), ], }));

Actualiza los scripts en el archivo package.json para construir y visualizar la aplicación remota usando el puerto 4174.

"scripts": { "dev": "vite --port 4174", "build": "tsc && vite build", "preview": "bun run build && vite preview --port 4174" },

Construye y visualiza la aplicación remota.

bun run build bun run preview

Si abres el navegador y vas a http://localhost:4174/remoteEntry.js, deberías ver el archivo de entrada remoto que será consumido por la aplicación host.

alt text

Paso 3: Configurar la aplicación host

Ahora, en otra terminal, ve a la aplicación host e instala las dependencias necesarias y agrega el plugin Module Federation.

cd host bun install bun install @module-federation/vite

En el archivo vite.config.ts, agrega la siguiente configuración para consumir el componente remoto.

import { federation } from '@module-federation/vite'; import react from '@vitejs/plugin-react'; import { defineConfig } from 'vite'; import { dependencies } from './package.json'; export default defineConfig(() => ({ build: { target: 'chrome89', }, plugins: [ federation({ name: 'host', remotes: { remote: { type: 'module', name: 'remote', entry: 'http://localhost:4174/remoteEntry.js', entryGlobalName: 'remote', shareScope: 'default', }, }, exposes: {}, filename: 'remoteEntry.js', shared: { react: { requiredVersion: dependencies.react, singleton: true, }, }, }), react(), ], }));

Actualiza los scripts en el archivo package.json para construir y visualizar la aplicación host usando el puerto 4173.

"scripts": { "dev": "vite --port 4173", "build": "tsc && vite build", "preview": "bun run build && vite preview --port 4173" },

Agrega el siguiente código al archivo App.tsx para consumir el componente remoto.

import { lazy, useState } from 'react' import reactLogo from './assets/react.svg' import viteLogo from '/vite.svg' import './App.css' const RemoteComponent = lazy( // @ts-ignore async () => import('remote/remote-app'), ); function App() { const [count, setCount] = useState(0) return ( <> <div> <a href="https://vite.dev" target="_blank"> <img src={viteLogo} className="logo" alt="Vite logo" /> </a> <a href="https://react.dev" target="_blank"> <img src={reactLogo} className="logo react" alt="React logo" /> </a> </div> <h1>Vite + React + <RemoteComponent/> </h1> <div className="card"> <button onClick={() => setCount((count) => count + 1)}> count is {count} </button> <p> Edit <code>src/App.tsx</code> and save to test HMR </p> </div> <p className="read-the-docs"> Click on the Vite and React logos to learn more </p> </> ) } export default App

Paso 4: Construir y probar la aplicación

Construye y visualiza la aplicación host.

bun run build bun run preview

Si abres el navegador y vas a http://localhost:4173/, deberías ver el archivo de entrada remoto que será consumido por la aplicación host.

alt text

Conclusión

¡Vite + Module Federation es una combinación poderosa que nos permite crear aplicaciones frontend escalables y es muy fácil de implementar!

Espero que esta guía te haya sido útil, que puedas comenzar a usarla en tus proyectos y que la compartas con tus colegas.

Si tienes alguna pregunta, no dudes en hacerla a través de redes sociales.

Happy coding!

Referencias

¿Te gusta mi contenido? ¡Invítame un café! ☕

Buy Me a Coffee

Última Publicación

Spring Batch desde Cero

Aprende los fundamentos de Spring Batch, un framework de Java para el procesamiento de grandes volúmenes de datos. Descubre cómo iniciar un proyecto, configurar tu entorno y crear un flujo de trabajo básico.

Leer más →