<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Henrique Souza</title>
    <description>The latest articles on Forem by Henrique Souza (@henrique_souza_971900376e).</description>
    <link>https://forem.com/henrique_souza_971900376e</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1961405%2F1d7c7c5c-c64e-4b21-960f-3b45b51f74a9.jpg</url>
      <title>Forem: Henrique Souza</title>
      <link>https://forem.com/henrique_souza_971900376e</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/henrique_souza_971900376e"/>
    <language>en</language>
    <item>
      <title>Como implementar microfrontend com ReactJS?</title>
      <dc:creator>Henrique Souza</dc:creator>
      <pubDate>Wed, 21 Aug 2024 18:54:00 +0000</pubDate>
      <link>https://forem.com/henrique_souza_971900376e/como-implementar-microfrontend-com-reactjs-41np</link>
      <guid>https://forem.com/henrique_souza_971900376e/como-implementar-microfrontend-com-reactjs-41np</guid>
      <description>&lt;p&gt;&lt;strong&gt;Microfrontend&lt;/strong&gt; é uma abordagem que divide uma grande aplicação em pequenos pedaço ou pequeno apps, esse conceito segue a ideia de “&lt;em&gt;microserviço&lt;/em&gt;”, porém no lado do frontend. Resumidamente, o gráfico apresentado mostra como funciona uma aplicação que possui uma arquitetura microfrontend.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conceitos
&lt;/h3&gt;

&lt;p&gt;Antes de entrarmos na implementação é preciso entender alguns termos e conceitos. Existem dois termos que são bastante utilizados Host e Remotes.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Host&lt;/strong&gt; é à aplicação principal e funciona com um container da aplicação. É nele que renderizamos todos os nossos microfrontends.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Remotes&lt;/strong&gt; são os microfrontends. Aqui podemos fazer implementações de usando frameworks distintos e se preocupando somente em expor o que for necessário para o Host renderizar.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Module federation
&lt;/h3&gt;

&lt;p&gt;É um plugin que permite compartilhar dependências entre as aplicações definindo quais módulos podem ser expostos ou consumidos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Implementação
&lt;/h3&gt;

&lt;p&gt;Para exemplificar essa implementação, estarei usando o &lt;em&gt;&lt;strong&gt;react + viteJs&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Setup inicial do projeto ainda não muda! Esse será o Host (container)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft5t44t9wf9arucb4c7gd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft5t44t9wf9arucb4c7gd.png" alt="estrutura de pasta" width="348" height="492"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos fazer uma configuração no projeto no arquivo &lt;em&gt;&lt;strong&gt;vite.config.ts&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2hwmdvauyj0yajipmlhs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2hwmdvauyj0yajipmlhs.png" alt="vite.config.ts" width="574" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para o module federation estamos usando uma dependência do vite para fazer essa gestão &lt;em&gt;&lt;strong&gt;@originjs/vite-plugin-federation&lt;/strong&gt;&lt;/em&gt;. Fazemos um remote para consumir os microfrontends referenciando os arquivos que estão com os módulos exportados. No exemplo, no microfrontend está no link &lt;em&gt;&lt;a href="http://localhost:4173/assets/remoteEntry.js" rel="noopener noreferrer"&gt;http://localhost:4173/assets/remoteEntry.js&lt;/a&gt;&lt;/em&gt; que é o app login.&lt;/p&gt;

&lt;p&gt;Agora é só adicionar o app no seu arquivo de renderização do host.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp3kpephzf5q88owvohtf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp3kpephzf5q88owvohtf.png" alt="vite.config.ts" width="535" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fazemos a importação do microfrontend no projeto e carregamos da maneira que já conhecemos no react.&lt;/p&gt;

&lt;p&gt;Agora que temos nossa configuração do host finalizada, agora precisamos fazer montar um pequeno app que seria nosso remote.&lt;/p&gt;

&lt;p&gt;Vamos criar um outro projeto com vite e modificaremos o arquivo &lt;em&gt;&lt;strong&gt;vite.config.ts&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh3ec760mhcqi5jvq7xen.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh3ec760mhcqi5jvq7xen.png" alt="vite.config.ts" width="559" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora com uma novidade, adicionamos o &lt;em&gt;&lt;strong&gt;filename, exposes e shared&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Filename&lt;/em&gt;&lt;/strong&gt; é o nome do arquivo que ficará nossos módulos exportados.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Exposes&lt;/em&gt;&lt;/strong&gt; é são os componentes que queremos exportar para microfrontend.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Shared&lt;/em&gt;&lt;/strong&gt; são dependências que queremos compartilhar.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Mais informações estão na biblioteca &lt;em&gt;&lt;strong&gt;originjs/vite-plugin-federation.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Após esses ajustes, precisamos realizar um build no projeto e executar com algum servidor para conseguimos pegar o arquivo.js exportado.&lt;/p&gt;

&lt;p&gt;Link da implementação completa &lt;a href="https://github.com/HenriqueSouzza/microfrontend-vite" rel="noopener noreferrer"&gt;código fonte&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusão
&lt;/h3&gt;

&lt;p&gt;É uma arquitetura escalável e com boas possibilidades para fazer uma modernização em projetos legados sem que precise parar toda aplicação que está em produção. É um forte aliado para os devs que tem surgido em propostas de desenvolvimento.&lt;/p&gt;

</description>
      <category>softwaredevelopment</category>
      <category>softwareengineering</category>
      <category>frontend</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
