Executando verificação de segurança...
7

Como Criar um Microfrontend com React.js (Explicado de Forma Simples)

Como Criar um Microfrontend com React.js (Explicado de Forma Simples)

Você já ouviu falar em microfrontend? Imagine um grande site sendo dividido em várias partes pequenas, e cada parte sendo feita por um time diferente. É como montar um Lego: cada peça é independente, mas juntas formam algo completo. Neste artigo, vou te mostrar como criar um microfrontend com React.js, passo a passo e com exemplos simples para quem está começando.


O que é um Microfrontend

Um microfrontend é uma forma de dividir um grande aplicativo web em vários aplicativos menores, mas que funcionam juntos. Cada microfrontend pode ter seu próprio código, lógica, design e até ser feito em versões diferentes do React ou até em outro framework.

Exemplo básico de divisão:

  • app-header → mostra o cabeçalho do site
  • app-products → mostra a lista de produtos
  • app-cart → mostra o carrinho de compras

Todos esses aplicativos são carregados na mesma página final, parecendo um único site integrado.


Por que usar Microfrontends

  • Escalabilidade: cada time pode trabalhar em uma parte sem interferir nas outras.
  • Facilidade de manutenção: atualizar um módulo sem quebrar o restante.
  • Reaproveitamento: o mesmo microfrontend pode ser usado em vários projetos.
  • Deploy independente: você pode publicar um microfrontend sem precisar mexer nos outros.

Criando um Microfrontend com React.js

Vamos montar um exemplo simples com dois apps React:

  • app-main → container principal
  • app-header → microfrontend com o cabeçalho

Passo 1: Criar o projeto principal

npx create-react-app app-main  
cd app-main  
npm start  

Passo 2: Criar o microfrontend

npx create-react-app app-header  
cd app-header  
npm start  

Em src/App.js:

import React from "react";

function App() {
  return (
    <header style={{ background: "#282c34", padding: "20px", color: "white" }}>
      <h1>Meu Cabeçalho Microfrontend</h1>
    </header>
  );
}

export default App;

Passo 3: Adicionar Module Federation no app-header

Vamos usar o Module Federation, recurso do webpack que permite compartilhar código entre aplicações.

npm install webpack webpack-cli webpack-dev-server html-webpack-plugin --save-dev  

Crie o arquivo webpack.config.js no app-header:

const HtmlWebpackPlugin = require("html-webpack-plugin");
const { ModuleFederationPlugin } = require("webpack").container;

module.exports = {
  mode: "development",
  devServer: {
    port: 3001,
  },
  plugins: [
    new ModuleFederationPlugin({
      name: "app_header",
      filename: "remoteEntry.js",
      exposes: {
        "./Header": "./src/App.js",
      },
    }),
    new HtmlWebpackPlugin({
      template: "./public/index.html",
    }),
  ],
};

Passo 4: Configurar o container principal (app-main)

npm install webpack webpack-cli webpack-dev-server html-webpack-plugin --save-dev  

Arquivo webpack.config.js no app-main:

const HtmlWebpackPlugin = require("html-webpack-plugin");
const { ModuleFederationPlugin } = require("webpack").container;

module.exports = {
  mode: "development",
  devServer: {
    port: 3000,
  },
  plugins: [
    new ModuleFederationPlugin({
      name: "app_main",
      remotes: {
        app_header: "app_header@http://localhost:3001/remoteEntry.js",
      },
    }),
    new HtmlWebpackPlugin({
      template: "./public/index.html",
    }),
  ],
};

Edite src/App.js no app-main:

import React, { Suspense } from "react";

const Header = React.lazy(() => import("app_header/Header"));

function App() {
  return (
    <div>
      <Suspense fallback={<div>Carregando...</div>}>
        <Header />
      </Suspense>
      <main>
        <h2>Conteúdo principal do site</h2>
      </main>
    </div>
  );
}

export default App;

Passo 5: Rodar as aplicações

  1. Inicie o app-header:
npm run start
  1. Depois, inicie o app-main:
npm run start

Acesse http://localhost:3000 e verá o microfrontend funcionando dentro do app principal.


Dicas Extras

  • Você pode criar vários microfrontends: menu, login, produtos, etc.
  • Cada equipe pode trabalhar em um app separado.
  • É possível misturar frameworks (React, Vue, Angular).
  • Com o Module Federation, dá para compartilhar bibliotecas como React e React DOM.

Conclusão

Criar microfrontends com React.js é uma das formas mais modernas e escaláveis de desenvolver grandes aplicações web. Mesmo que pareça difícil no início, basta entender que cada parte é um pequeno aplicativo independente que trabalha em conjunto.
Com o tempo, é possível ter times diferentes atualizando e publicando módulos sem pisar no código do outro — esse é o poder dos microfrontends!

Carregando publicação patrocinada...
1

Atualmente utilizamos Module Federation em um projeto construído com Create React App (CRA) na versão 16 do React. Estamos enfrentando grandes dificuldades devido a bibliotecas desatualizadas, com problemas de segurança e dependências depreciadas. Um dos principais obstáculos é que não conseguimos atualizar o React para uma versão superior à 17 de forma imediata.

Esse cenário nos leva a prever que, se nada for feito, em breve também ficaremos presos a versões específicas do Node e do NPM, o que pode comprometer ainda mais a manutenção do projeto.

Por isso, deixo um alerta: use Module Federation com cautela e planeje muito bem antes de adotá-lo. Atualizar múltiplos microfrontends e alinhar todos os times envolvidos pode se tornar uma tarefa complexa e bastante problematica

1

Isso mesmo concordo.

Temos um time somente para controlar as versões dos MF.

Ja temos 11 MF, Tivemos essetipo de problema e tivemos que refatorar e atualizar.

Enquanto o sistema existir, vc sempre terá que em se preocupar com as versões.

A cada 2 semanas todos os MF sāo atualizado as vesões justamente para não perder o time.

1

Module federation é interessante, eu achei que fosse usar o single spa. Ha a possibilidade de usar o module federation com vue ou angular e a outra parte em react?

1

Sim é possível, porem nesse caso as apps (microfrontend) não vão compatrilhar o mesmo framework, então você precisa criar a sua forma de comunicação entre eles. Nessa tipo implementação é mais parecido com o conceit de islands (ilhas).

1
1
1
1

Mas creio que CORS não sirva pra essa finalidade não viu, CORS é um controle de segurança que acontece local, no navegador, para controle de acesso por domínios indevidos

1

Segurança Extra
Se você quer garantir que ninguém altere esses endpoints em runtime (exemplo: via injeção no window), nunca exponha a url de remote em variáveis globais na aplicação. No lado do remote, configure o CORS para aceitar apenas domínios específicos, se desejar proteção mais rígida:

preview: {
headers: {
"Access-Control-Allow-Origin": "https://seu-host-autorizado.com"
}
}

Assim, mesmo que alguém tente consumir a remote a partir de outros domínios, o navegador irá bloquear por CORS.

1

Uooou! Preciso dar uma olhadinhas nessas coisas...

Acredito que conhecer os ataques que podem acontecer do lado do cliente possa mudar um pouco como eu desenvolvo. Vocês tem alguma sugestão?

1

Boa tarde, hoje tenho um sistema que funciona coM microfronts, sao 7 projetos que formam 1 que é micro, Porem encontrei um prooblema com versoes do next, que so funciona com o next 13.1.1, Como resolveu isso, Se eu usou neXt no caso

1