¡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

Aprende a implementar un envío de correos electrónicos programados con Spring Boot y Resend

De forma sencilla, envía correos a través de una API REST con Spring Boot y Resend.

Leer más →