<?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>DEV Community: Moisés Santos</title>
    <description>The latest articles on DEV Community by Moisés Santos (@mbarbosasan).</description>
    <link>https://dev.to/mbarbosasan</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%2F992552%2F2984b562-3947-49b7-bed5-cf62ac0dd868.png</url>
      <title>DEV Community: Moisés Santos</title>
      <link>https://dev.to/mbarbosasan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mbarbosasan"/>
    <language>en</language>
    <item>
      <title>Speed Run de MicroFrontends com Single-SPA (any%)</title>
      <dc:creator>Moisés Santos</dc:creator>
      <pubDate>Fri, 24 Nov 2023 20:42:07 +0000</pubDate>
      <link>https://dev.to/mbarbosasan/speed-run-de-microfrontends-com-single-spa-any-2dl4</link>
      <guid>https://dev.to/mbarbosasan/speed-run-de-microfrontends-com-single-spa-any-2dl4</guid>
      <description>&lt;p&gt;Recentemente completei 1 ano trabalhando diretamente com MicroFrontends e consegui sentir os "prazeres" e as "dores" de um MicroFrontend, com o objetivo de me aprofundar mais tanto no &lt;a href="https://single-spa.js.org/" rel="noopener noreferrer"&gt;SingleSPA&lt;/a&gt; quanto em MicroFrontends resolvi sintetizar o conhecimento nessa speedrun, ao final teremos construído dois MicroFrontends que tem como objetivo irmos migrando funcionalidades de uma aplicação legada para uma tecnologia mais nova sem que seja necessário reescrevermos toda a aplicação.&lt;/p&gt;

&lt;p&gt;Caso você não queira acompanhar o passo-a-passo, ao final eu disponibilizo a aplicação pelo Stackblitz e também a URL do repositório.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;DISCLAIMER:&lt;/strong&gt; Não sou nenhum especialista no Single-SPA e muito menos em MicroFrontends, no entanto, acredito que consigo passar a ideia geral, sugestões e correções/críticas são sempre bem-vindas.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Table of Contents
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;O que são MicroFrontends&lt;/li&gt;
&lt;li&gt;Como funciona&lt;/li&gt;
&lt;li&gt;Tipos de MicroFrontends&lt;/li&gt;
&lt;li&gt;Setup inicial&lt;/li&gt;
&lt;li&gt;Adicionando primeira aplicação&lt;/li&gt;
&lt;li&gt;Adicionando mais um MFE&lt;/li&gt;
&lt;li&gt;Conclusão&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  O que são MicroFrontends?
&lt;/h3&gt;

&lt;p&gt;MicroFrontends, ou MFE para os íntimos, á grosso modo podem ser resumidos a pequenas partes da aplicação principal sendo desenvolvidos em frameworks/libs diferentes e se comunicando como se fossem um só, isso é, com MicroFrontends podemos ter a nossa aplicação dividida em partes menores e essas partes menores podem ser Desenvolvidas em React e uma outra parte em Angular e uma terceira parte em Vue, e o Single-SPA será responsável por "montá-las" assim como "desmontá-las" quando elas já não forem mais necessárias.&lt;/p&gt;

&lt;p&gt;Tudo isso de forma desacoplada onde cada aplicação pode ter seus próprios arquivos de CSS, Libs e se comunicarem normalmente, dessa forma dependendo do tamanho da aplicação você pode ter devs trabalhando em diferentes partes do projeto com a tecnologia que tem mais conhecimento.&lt;/p&gt;

&lt;p&gt;Não pretendo entrar muito á fundo sobre como funciona por debaixo dos panos por não me sentir confortável o suficiente para isso &lt;del&gt;e é uma speedrun, o speedrunner não para a run para explicar porquê funciona, mas como faz.&lt;/del&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Mágica? Bruxaria? Apenas JavaScript...
&lt;/h3&gt;

&lt;p&gt;Ao criarmos uma aplicação com o nosso framework favorito nós sabemos, ou pelo menos espero que sim, que o arquivo gerado ao final do build é muito diferente do que estamos escrevendo, cheio de minificações e métodos/variáveis ofuscados mas além disso, os métodos que utilizamos se tornam bem diferentes e etc. No entanto, ainda que seja diferente aquela sopa de letrinhas ainda é a nossa aplicação porém agora sem a camada de abstração que o framework nos proporciona e é a partir desse arquivo que o Single-SPA atua, pelo bem da didática e da simplicidade vou utilizar do cenário mais simples possível para que seja possível entender a ideia geral sobre o Single-SPA, após ter entendido isso você será capaz de criar seus próprios MFEs.&lt;/p&gt;

&lt;p&gt;Ao final do processo de build normalmente temos um arquivo chamado de &lt;code&gt;main.js&lt;/code&gt;, e esse arquivo main.js é servido ao usuário ao entrar na nossa aplicação, e ele é o responsável por renderizar nossos componentes, realizar o roteamento e tudo mais.&lt;/p&gt;

&lt;p&gt;E é através desse arquivo que o Single-SPA monta a nossa aplicação, no entanto, nós precisamos "dizer" a ele em que momentos isso deve acontecer e quando os requisitos não forem atingidos ele irá "desmontar" a aplicação novamente, para deixamos isso mais claro abaixo a função que registra um MFE e suas condições de renderização, veremos com mais calma isso mais pra frente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fajdpl74tljfdn6t1ikqp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fajdpl74tljfdn6t1ikqp.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A função &lt;code&gt;registerApplication&lt;/code&gt; é responsável por registrar a aplicação e ela recebe como parâmetro o nome da nossa aplicação (precisa ser único, mais pra frente veremos o motivo), em seguida uma função que será responsável por localizar o nosso arquivo gerado ao final do build e após isso podemos passar três tipos de dados diferentes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; uma simples &lt;code&gt;string&lt;/code&gt; onde caso a rota seja a que inserimos a aplicação será montada.&lt;br&gt;
&lt;strong&gt;2.&lt;/strong&gt; Uma array de &lt;code&gt;strings&lt;/code&gt; onde podemos realizar o processo de montagem da aplicação em rotas diferentes.&lt;br&gt;
&lt;strong&gt;3.&lt;/strong&gt; uma função e por ser uma função você pode realizar qualquer verificação que você quiser, o importante é que ao final retorne booleano.&lt;br&gt;
&lt;strong&gt;4.&lt;/strong&gt; Podemos também passar propriedades para dentro dessas aplicações, a forma como serão capturados dentro da aplicação muda para cada framework, em &lt;a href="https://single-spa.js.org/docs/ecosystem-angular#custom-props" rel="noopener noreferrer"&gt;Angular&lt;/a&gt;, por exemplo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyc344atsj7e8qn31xi94.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyc344atsj7e8qn31xi94.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;De forma bem resumida e talvez até um pouco "grosseira" essa é a ideia principal sobre como funciona o processo de montagem do Single-SPA, no entanto, eu quero gastar uns 2 centavos explicando de forma rápida como esses arquivos são servidos, especialmente quando em Desenvolvimento já que estamos constantemente alterando arquivos e esses por sua vez geram um novo "main.js", afinal ainda são aplicações inteiras e elas ainda precisam passar pelo seu respectivo processo de build para esses arquivos serem gerados e normalmente ao subirmos uma aplicação elas estão em portas diferentes, a questão aqui é que independente da porta elas ainda estão no mesmo "localhost", então ao contrário do que vimos na imagem acima onde está sendo apontado para uma pasta &lt;code&gt;src&lt;/code&gt;, podemos apontar diretamente pro &lt;code&gt;localhost:XXXX/main.js&lt;/code&gt;, assim como para outros domínios também, e isso irá funcionar normalmente, no entanto, quando em produção o ideal é que seja criado uma pasta &lt;code&gt;dist&lt;/code&gt; onde fique cada um desses arquivos talvez até fora da pasta de cada aplicação, já que não haverão mais alterações nesses arquivos após o build.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7m03o3bskh8woexpqum9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7m03o3bskh8woexpqum9.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Tipos de MicroFrontends
&lt;/h3&gt;

&lt;p&gt;Apesar de eu estar sempre me referindo a MicroFrontends como "aplicações" talvez nem todos precisem ser uma aplicação inteira, isso porquê podemos ter MicroFrontends que se tratem apenas de um único componente, ou talvez apenas serem utilitários para comunicação entre MFEs e etc, não vou entrar no mérito sobre quando se deve usar cada caso, no entanto, a depender do tipo de MFE escolhido o processo de build/configuração muda, abaixo os exemplos de MicroFrontends e suas comparações diretamente da documentação.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa0il784snxuhnturf8r1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa0il784snxuhnturf8r1.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em resumo, nós temos os seguintes tipos: &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; Applications ou Aplicações são as que após o processo de montagem passam normalmente pelo seu processo de roteamento e e o framework escolhido irá renderizar os respectivos componentes e etc.&lt;br&gt;
&lt;strong&gt;2.&lt;/strong&gt; Parcels ou parcelas/pedaços se trata de apenas um componente que pode ser inicializado em alguma parte da tela que talvez esteja sendo servida por outro framework distinto.&lt;br&gt;
&lt;strong&gt;3.&lt;/strong&gt; Utility seguem a mesma linha do Parcels, porém, eles não necessariamente precisam renderizar uma UI, podem servir apenas para comunicação, uma service e etc.&lt;/p&gt;

&lt;p&gt;A partir daqui vou focar em Applications porque é o que tenho tido mais contato.&lt;/p&gt;
&lt;h3&gt;
  
  
  Setup Inicial
&lt;/h3&gt;

&lt;p&gt;Dito tudo isso agora podemos ir para á pratica, criaremos uma aplicação que contém dois MicroFrontends, sendo um deles em Angular e o outro em AngularJS, imaginando um cenário em que precisamos sair de uma aplicação legada para uma tecnologia mais recente, no entanto, após ter entendido como funciona o processo você poderá criar qualquer outro tipo, Vue, React, Preact e etc.&lt;/p&gt;

&lt;p&gt;E por último mas não menos importante, cada framework tem sua própria "helper" lib dentro do Single-SPA, elas são responsáveis por adaptar o processo de montagem e desmontagem das aplicações conforme a necessidade do SingleSPA, dito isso, podemos ir para os requisitos:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Você pode até mesmo criar sua própria implementação caso tenha alguma necessidade específica, e se tiver interessado para saber mais a fundo como isso funciona, você pode consultar &lt;a href="https://single-spa.js.org/docs/building-applications/#lifecycle-helpers" rel="noopener noreferrer"&gt;essa parte da documentação&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Node.JS&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;create-single-spa&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;single-spa-angular&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Angular CLI&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install create-single-spa
npm install single-spa-angular
npm install @angular/cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Podemos ter duas formas de ter o nosso setup inicial, o primeiro sendo o recomendado pela documentação onde nós inserimos na raiz do projeto um arquivo HTML que irá carregar as dependências necessárias e um arquivo em JavaScript que será responsável por registrar as nossas aplicações juntamente com o Webpack, e o segundo exemplo onde você pode colocar Single-SPA na raiz do seu framework que será o "host" de todas as outras aplicações, apesar de a primeira alternativa ser a recomendada &lt;strong&gt;EU&lt;/strong&gt; não consegui identificar nenhum ganho nessa parte, além de deixar de forma bastante explicita o que é relacionado ao Single-SPA e o que é relacionado ao framework escolhido dessa forma evitando misturar arquivos, pesquisando sobre também encontrei pessoas com a mesma indagação.&lt;/p&gt;

&lt;p&gt;Portanto, seguiremos a recomendação da documentação para termos uma instalação mais limpa, após você ter entendido como funciona pode fazer o processo no seu framework favorito.&lt;/p&gt;

&lt;p&gt;Com o "create-single-spa" instalado e já na pasta do projeto nós iremos utilizar do comando que irá nos ajudar a pular toda essa parte de setup através do seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;create-single-spa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Caso não tenha instalado globalmente você pode utilizar do npx que deverá funcionar normalmente, ficando no caso &lt;code&gt;npx create-single-spa&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Após o comando ter sido executado será solicitado algumas informações sobre o nosso projeto, poderiamos até mesmo já escolher direto o framework de "host", mas como no nosso caso, nós queremos apenas a configuração inicial e ir criando cada aplicação aos poucos iremos escolher apenas o "root config", abaixo as respostas:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fovatzfeydsvhislyj6qh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fovatzfeydsvhislyj6qh.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após o comando podemos notar que alguns arquivos foram criados na nossa pasta, no entanto, os mais importantes e os que nós, de fato, iremos alterar serão os que estão dentro de &lt;em&gt;"src"&lt;/em&gt; e ao entrarmos na nossa pasta nós temos um arquivo chamado &lt;em&gt;"index.ejs"&lt;/em&gt; esse será o arquivo que irá carregar o nosso Single-SPA e após isso nós iremos carregar o nosso arquivo ".js" com a função que irá registar nossas aplicações.&lt;/p&gt;

&lt;p&gt;Outro fator importante na utilização do Single-SPA é o SystemJS, onde ele será responsável por registrar nossos módulos JavaScript.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;DISCLAIMER:&lt;/strong&gt; Mais uma vez irei me abster sobre o arquivo &lt;em&gt;"index.ejs"&lt;/em&gt;, assim como também sobre o SystemJS, pelos motivos que citei mais acima, á grosso modo mais uma vez o ".ejs" é um arquivo com estrutura semelhante para não dizer igual ao HTML, no entanto, ele dá suporte para renderização de HTMLs dinâmicos, como você pode identificar dentro do próprio arquivo onde temos um "if/else" para apontar para arquivos diferentes dependendo do ambiente e o SystemJS tem como objetivo carregar módulos JavaScripts e assim nós podemos registrá-los na função do Single-SPA, isso mais para dar suporte a browsers que estão atrás da ES6 onde ainda não existiam módulos de forma nativa no JS, caso queira saber mais sobre: &lt;a href="https://www.geeksforgeeks.org/difference-between-systemjs-and-webpack/" rel="noopener noreferrer"&gt;SystemJS&lt;/a&gt; e &lt;a href="https://www.geeksforgeeks.org/difference-between-index-ejs-and-index-html/" rel="noopener noreferrer"&gt;".ejs"&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Já com os arquivos em mãos nós podemos agora apenas utilizar do seguinte comando para subirmos a nossa aplicação e nos será exibido a página inicial da aplicação.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm run start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9uqts2f7iqfrzxqekh9l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9uqts2f7iqfrzxqekh9l.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bom, agora nós já temos nossa configuração inicial feita basicamente e já podemos adicionar o nosso primeiro MFE, no entanto, aconselho fortemente que tente explorar a aplicação no seu formato mais enxuto antes, até que fique claro como as coisas se comportam, por ex: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Ao abrirmos o "DevTools" e inspecionarmos nossos elementos HTMLs podemos ver que toda essa aplicação que está sendo importada através de um endereço remoto (por enquanto) foi inserida dentro de uma única &lt;code&gt;div&lt;/code&gt; e o seu respectivo &lt;code&gt;id&lt;/code&gt; contém a string 'single-spa-application:@' concatenado com o nome dado ao MFE no método RegisterApplication, por isso não podemos inserir nomes repetidos talvez possa gerar problemas de vazamento de escopo de estilo e outras complicações.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tente renderizar a aplicação apenas em determinada rota, para isso basta alterar o &lt;code&gt;activeWhen&lt;/code&gt;, ex: Tente renderizar essa aplicação inicial apenas na rota &lt;code&gt;/single-spa&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Recomendo fortemente que leia os comentários no arquivo ".ejs", algumas coisas ali podem ser removidas, mas mais importante que isso é bom entender porque elas estão lá.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Adicionando nossa primeira aplicação
&lt;/h3&gt;

&lt;p&gt;Agora que já exploramos um pouco sobre como as coisas se comportam na configuração inicial podemos seguir adiante e criarmos o nosso primeiro MFE.&lt;/p&gt;

&lt;p&gt;Para isso nós utilizaremos da CLI do Angular para criarmos o nosso projeto, para isso basta executarmos os comandos abaixo em sequência:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ng new NOME_PROJETO --routing
cd NOME_PROJETO

// Incluiremos a "schematics" do single-spa dentro do Angular.
ng add single-spa-angular
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após a utilização do single-spa-angular, que será responsável por formatar nosso projeto para se adequar as configurações do single-spa, nos será feito algumas perguntas, abaixo as respostas:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6rm8xrlw49bu9vuz65zd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6rm8xrlw49bu9vuz65zd.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Caso você já esteja familiarizado com o Angular deverá ter notado algumas mudanças em relação a um projeto convencional, não pretendo entrar em todas, mas as principais:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Foi criado um componente "empty-route" que tem como objetivo auxiliar o Single-SPA durante as transições de rotas para que nenhuma página de erro seja exibido, será necessário incluí-lo nos imports do nosso &lt;code&gt;App.module.ts&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Utilizaremos de um build personalizado com o Webpack, para que ele realize o import das configurações do Single-SPA, assim o processo de build sairá do controle da CLI do Angular e será feito apenas pelo Single-SPA, mais pra frente veremos um exemplo disso.&lt;/li&gt;
&lt;li&gt;Criação de dois novos scripts dentro do &lt;em&gt;"package.json"&lt;/em&gt; onde será os scripts que utilizaremos a partir de agora, saem o &lt;code&gt;ng serve&lt;/code&gt; e &lt;code&gt;ng build&lt;/code&gt; e entram &lt;code&gt;serve:single-spa:angular-mfe&lt;/code&gt; e &lt;code&gt;build:single-spa:angular-mfe&lt;/code&gt;, respectivamente.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Com o projeto gerado nós precisamos realizar algumas correções para termos tudo funcionando, abaixo as tarefas:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; Importar o EmptyRouteComponent no nosso &lt;code&gt;App.module.ts&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;2.&lt;/strong&gt; Instalar todas as novas dependências inseridas pelo &lt;code&gt;ng add single-spa-angular&lt;/code&gt; através do &lt;code&gt;npm i&lt;/code&gt;.&lt;br&gt;
&lt;strong&gt;3.&lt;/strong&gt; Configurar as nossas rotas iniciais, dentro do &lt;code&gt;app-routing.module.ts&lt;/code&gt; iremos inserir um provider para alterar a rota inicial da aplicação, ficando da seguinte forma:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs04cma5x5miu2dgvv4ly.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs04cma5x5miu2dgvv4ly.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Existe uma boa discussão sobre os motivos que levaram a essa modificação na rota base da aplicação, caso queira conferir: &lt;a href="https://github.com/single-spa/single-spa-angular/issues/64" rel="noopener noreferrer"&gt;Aplicação não funciona sem APP_BASE_HREF&lt;/a&gt;, &lt;a href="https://github.com/single-spa/single-spa-angular/issues/62" rel="noopener noreferrer"&gt;Como renderizar router links entre diferentes aplicações em sub-rotas&lt;/a&gt; e a própria &lt;a href="https://single-spa.js.org/docs/ecosystem-angular#configure-routes" rel="noopener noreferrer"&gt;documentação&lt;/a&gt; tenta explicar de forma resumida.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;4.&lt;/strong&gt; Executarmos o &lt;code&gt;ng g environments&lt;/code&gt; para gerarmos os arquivos das variáveis de ambientes e após isso inserirmos a variável production com seu respectivo valor dentro de cada arquivo.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkjq024h0naevxbajsw53.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkjq024h0naevxbajsw53.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bom após tudo isso, agora é só subirmos a aplicação e entrarmos nela normalmente, certo?&lt;/p&gt;

&lt;p&gt;Então... caso você tente subir a aplicação será isso que você verá:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl26xg87aaa7rrravbna3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl26xg87aaa7rrravbna3.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Perceba que está tudo "normal", nós estamos vendo o "app-root" no DevTools, porem nada está sendo renderizado e o HTML está preenchido normalmente com a tela inicial do Angular, como havia explicado mais acima, a partir do momento que utilizamos do comando &lt;code&gt;ng add single-spa-angular&lt;/code&gt; foram feitas alterações no processo de build e serve da nossa aplicação de forma que apenas o Single-SPA tem o "poder" de montar o componente.&lt;/p&gt;

&lt;p&gt;Para isso precisamos voltar ao nosso arquivo &lt;em&gt;".js"&lt;/em&gt; lá na pasta raiz do projeto onde está o &lt;em&gt;"index.ejs"&lt;/em&gt; e precisamos registrar a nossa aplicação, assim como as condições de renderização, para isso não iremos alterar a configuração inicial (ainda), continuaremos renderizando a página de antes, registaremos apenas uma segunda aplicação da seguinte forma:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbzvykfd16i619s21yba2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbzvykfd16i619s21yba2.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E ao sairmos do diretório do Angular no teminal e executarmos o comando &lt;code&gt;npm run start&lt;/code&gt; conseguiremos ver as duas aplicações coexistindo no mesmo espaço:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fatqmal84pwb2e7er9v1l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fatqmal84pwb2e7er9v1l.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Caso você não tenha conseguido e tenha surgido erros, existem dois erros comuns nesse momento, sendo o primeiro você não subiu a sua aplicação Angular e ela não está acessível, lembre-se, você precisa "servir" o arquivo &lt;code&gt;main.js&lt;/code&gt; para o SingleSPA já que nós estamos apontando para &lt;code&gt;localhost&lt;/code&gt; e o segundo é a ausência do 'Zone.js' que é dependência fundamental do Angular, você pode "descomentar" essa linha no &lt;code&gt;index.ejs&lt;/code&gt;:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhudzaq2ztbuqpoo2hidc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhudzaq2ztbuqpoo2hidc.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bom agora nós temos as nossas duas aplicações coexistindo no mesmo espaço, ainda que de forma "bugada" mas isso é mais por conta das configurações de estilo inicial do setup do Angular, podemos apagar o conteúdo do &lt;code&gt;App.component.html&lt;/code&gt; e deverá voltar ao normal, agora que temos o nosso primeiro componente, aconselho mais uma vez a explorar como as coisas funcionam:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt;. Tente alterar a rota de montagem do Angular e inicialize ele em uma outra rota sem a página inicial do Single-SPA.&lt;br&gt;
&lt;strong&gt;2&lt;/strong&gt;. Tente renderizar componentes diferentes dentro do Angular de acordo com a rota.&lt;/p&gt;
&lt;h4&gt;
  
  
  Adicionando mais um MFE
&lt;/h4&gt;

&lt;p&gt;Bom agora que você já explorou um pouco mais o seu primeiro MFE, espero que sim, podemos seguir adiante e adicionar um novo MFE que será o nosso AngularJS, ao final do AngularJS criaremos uma navegação simples entre MFEs através de &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; onde o Angular será o "host" principal e o AngularJS será servido apenas em páginas específicas.&lt;/p&gt;

&lt;p&gt;Daqui pra frente é basicamente mais do mesmo que já fizemos anteriormente, precisamos instalar o nosso AngularJS e realizar o bootstrap dele conforme fariamos com uma aplicação normal em AngularJS, caso você não seja familiar estarei inserindo o código e você pode copiar e colá-lo dentro do nosso arquivo "js" de configurações.&lt;/p&gt;

&lt;p&gt;Caso você queira pode criar outra aplicação em Angular também e repetir os passos que fizemos acima.&lt;/p&gt;

&lt;p&gt;Antes de inserirmos o AngularJS realize as seguintes alterações no  Angular:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Altere a inicialização do Angular para ser feito apenas na rota &lt;code&gt;/ng&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Insira um parágrafo no template do App.component.ts que servirá de identificação do Angular, ex: "Hello World Angular"&lt;/li&gt;
&lt;li&gt;Insira uma tag de &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; com o href para &lt;code&gt;/js&lt;/code&gt;, essa tag nos levará para a rota que iremos inserir o AngularJS.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Lembre-se de sair da pasta do Angular:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install angular@1.8.2
// helper lib do AngularJS
npm install single-spa-angularjs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E após isso caso você não conheça ou não queira criar a aplicação em AngularJS de exemplo pode colar o código abaixo no mesmo arquivo .js onde registramos as aplicações, de preferência antes do registro.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import singleSpaAngularJS from 'single-spa-angularjs'
import angular from 'angular'

angular.module('app', [])

angular
    .module('app')
    .component('root', {
      template: `&amp;lt;p&amp;gt; Hello World AngularJS&amp;lt;/p&amp;gt;&amp;lt;a href="/ng"&amp;gt;Retornar ao Angular 13&amp;lt;/a&amp;gt;`,
      controller: function () {
        this.$onInit = function () {
          console.log("AngularJS Bootstrapped")
        }

        this.$onDestroy = function () {
          console.log("AngularJS Unmounted!")
        }
      }
    })


window.myAngularApp = singleSpaAngularJS({
  angular: window.angular,
  mainAngularModule: 'app',
  uiRouter:true,
  preserveGlobal: false,
  template: '&amp;lt;root/&amp;gt;'
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;e após isso podemos registrar a nossa aplicação normalmente da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;registerApplication({
  name: '@angularjs',
  app: myAngularApp,
  activeWhen: '/js'
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Feito tudo isso, agora ao entrar na aplicação na rota base &lt;code&gt;/&lt;/code&gt; não veremos mais nada, no entanto, ao entrarmos na rota do &lt;code&gt;/js&lt;/code&gt; poderemos ver a mensagem que inserimos no template e uma tag para retornar ao Angular 13, e se tiver sido feito o que pedi mais acima em relação ao Angular 13 será renderizado outra tag para retornar ao AngularJS e é basicamente tudo isso, agora temos duas aplicações de tecnologias diferentes coexistindo em rotas diferentes.&lt;/p&gt;

&lt;p&gt;Para finalizarmos nós podemos fazer com que o Angular seja a rota base alterando o &lt;code&gt;/ng&lt;/code&gt; para &lt;code&gt;/&lt;/code&gt; e ao entrarmos em &lt;code&gt;/js&lt;/code&gt; veremos os dois MFEs coexistindo na mesma página.&lt;/p&gt;

&lt;p&gt;Abaixo a URL para a aplicação no Stackblitz e o &lt;a href="https://github.com/mbarbosasan/single-spa-devto" rel="noopener noreferrer"&gt;repositório&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://stackblitz.com/~/fork/github/mbarbosasan/single-spa-devto" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdeveloper.stackblitz.com%2Fimg%2Fopen_in_stackblitz.svg" alt="Abrir no Stackblitz"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;IMPORTANTE:&lt;/strong&gt; Ao entrar no stackblitz ele já irá executar o &lt;code&gt;npm i&lt;/code&gt; e o &lt;code&gt;npm start&lt;/code&gt; do Single-SPA, no entanto, você ainda precisará navegar até a pasta &lt;code&gt;angular-mfe&lt;/code&gt; e instalar as suas respectivas dependencias e subir a aplicação. Além disso eu também precisei fazer algumas modificações para se adequar a URL fornecida pelo Stackblitz, mas deixei um comentário explicando o que fazer caso tente utilizá-la localmente.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Observações e Conclusões finais
&lt;/h3&gt;

&lt;p&gt;Pessoalmente, acredito que um dos principais ganhos de utilizarmos de MicroFrontends é podermos migrar de um Framework para o outro sem a necessidade de reescrita total de todos os componentes e termos as duas aplicações coexistindo no mesmo espaço, especialmente quando queremos atualizar a aplicação para tecnologias mais novas.&lt;/p&gt;

&lt;p&gt;No entanto, á depender do tamanho da aplicação e seu respectivo contexto todo a complexidade e "overhead" necessário para utilização do Single-SPA não se "paga", já que você pode acabar caindo em alguns casos bem específicos de problemas e por não serem casos comuns você terá que desbravar o Stackoverflow atrás de respostas ou entrar a fundo sobre como funciona por debaixo dos panos, uma alternativa ao SingleSPA é o Nx que vem ganhando cada vez mais popularidade além de &lt;strong&gt;EU&lt;/strong&gt; achar a documentação melhor, caso queira conferir pode começar pela explicação sobre &lt;a href="https://nx.dev/concepts/module-federation/module-federation-and-nx#what-is-module-federation" rel="noopener noreferrer"&gt;"Module Federations"&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;E é basicamente &lt;del&gt;tudo&lt;/del&gt; isso, se você chegou até aqui: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/3oz8xsaLjLVqVXr3tS/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/3oz8xsaLjLVqVXr3tS/giphy.gif" alt="Kissing cat"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>frontend</category>
      <category>javascript</category>
      <category>angular</category>
    </item>
    <item>
      <title>Criando uma API REST Mockada em 5 minutos.</title>
      <dc:creator>Moisés Santos</dc:creator>
      <pubDate>Sat, 19 Aug 2023 15:42:01 +0000</pubDate>
      <link>https://dev.to/mbarbosasan/criando-uma-api-mockada-em-5-minutos-1a7j</link>
      <guid>https://dev.to/mbarbosasan/criando-uma-api-mockada-em-5-minutos-1a7j</guid>
      <description>&lt;p&gt;É uma situação bastante comum durante o início dos estudos de frontend, e especialmente quando estamos começando a criar os primeiros projetos pessoais, nos depararmos com uma barreira significativa que é precisar de uma API externa para manipular os dados fornecidos e exibí-los nas telas, e aí surge as famigeradas APIs da NASA, IMDB (&lt;strong&gt;R.I.P&lt;/strong&gt;) e entre outras conhecidas, são excelentes APIs por terem uma boa documentação e uma quantidade enorme de informações que podemos manipular da forma como quisermos, no entanto, essas mesmas APIs acabam passando a visão de projetos de youtube/cursos que devido a uma quantidade considerável de pessoas que o fazem acaba dando a impressão de projetos em que se está sendo copiado e colado o que está escrito na tela, que veja bem, não são projetos ruins ainda são bons projetos para se começar e aprender, porém com um mercado cada vez mais competitivo precisamos encontrar uma forma de nos diferenciar, dito isso, surge a idéia do &lt;a href="https://mockapi.io/projects"&gt;&lt;strong&gt;MockAPI&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MockAPI&lt;/strong&gt; se trata de uma ferramenta que nos permite criar uma API REST com valores &lt;strong&gt;"mockados"&lt;/strong&gt;[1] e gerados de forma aleatória de uma forma muito simples e fácil de personalizar, além de também não exigir que tenhamos um servidor rodando na máquina, a API será servida inteiramente por eles e podemos acessá-los de qualquer lugar e a qualquer momento, dito isso, iremos criar uma API que simula um endpoint que nos fornece dados de Usuários.&lt;/p&gt;

&lt;p&gt;[1]: Valores falsos, normalmente usados para simular valores reais que estão inseridos em banco de dados ou manipulados por operações.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;DISCLAIMER:&lt;/strong&gt; O MockAPI é um "freemium", ou seja, é uma plataforma que tem uma parte dos recursos sendo fornecidos gratuitamente e uma outra parte sendo paga, no entanto, para projetos menores e que não exigem a necessidade de muitos endpoints a serem consumidos ele irá atender muito bem.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  1. Cadastro
&lt;/h3&gt;

&lt;p&gt;Entre no &lt;a href="https://mockapi.io/projects"&gt;MockAPI&lt;/a&gt; e faça o seu cadastro clicando no botão &lt;strong&gt;"Get Started"&lt;/strong&gt; no canto superior direito, pode ser pelo GitHub ou por qualquer outra forma, não há diferença.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KwyrMPB2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/boxmsk1l8llzmogt5fyh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KwyrMPB2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/boxmsk1l8llzmogt5fyh.png" alt="Image description" width="800" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Informações sobre o Projeto
&lt;/h3&gt;

&lt;p&gt;Após o cadastro e iremos nos deparar com a tela abaixo, : &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--g58BUO4K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6h0hycf54szeh40j9trx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--g58BUO4K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6h0hycf54szeh40j9trx.png" alt="Image description" width="800" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O MockAPI divide as APIs que criamos através de Projetos, então cada projeto terá um domínio específico e esse domínio pode fornecer XPTO recursos, exemplo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5-Utu_v---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uakarvjqhc4re74z44dj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5-Utu_v---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uakarvjqhc4re74z44dj.png" alt="Image description" width="572" height="208"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Explicado isso, agora podemos criar o nosso projeto, clicando no botão de &lt;strong&gt;"+"&lt;/strong&gt; em azul no canto superior.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Criando o nosso projeto
&lt;/h3&gt;

&lt;p&gt;A tela abaixo aparecerá e temos dois campos a serem preenchidos, o primeiro se trata do nome do projeto, esse nome não irá influenciar na URL gerada, será apenas para fins de identificação dentro da plataforma, e abaixo temos um campo opcional onde podemos inserir algum prefixo que esse sim será concatenado na URL, não encontrei ainda uma utilidade para o prefixo então normalmente não coloco, fica seu critério.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VKK0rdQf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kx6rj9fycg5etrf6m1e9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VKK0rdQf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kx6rj9fycg5etrf6m1e9.png" alt="Image description" width="382" height="593"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após a criação do projeto e entrarmos nele iremos para a tela abaixo onde já conseguiremos criar o nosso primeiro recurso que será consumido:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--twciGKgf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7uqn974z0b9ypyt0w4ve.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--twciGKgf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7uqn974z0b9ypyt0w4ve.png" alt="Image description" width="800" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;IMPORTANTE&lt;/strong&gt;: A URL no topo da página &lt;strong&gt;NÃO&lt;/strong&gt; deve ser compartilhada, ela é única e por ser acessível de qualquer lugar e por qualquer pessoa você pode acabar tendo problemas com a plataforma caso alguém utilize ela em excesso, para quem está um pouco mais a frente nos estudos deve ter sentido a ausência de uma chave para validar o usuário, no entanto, essa validação não existe e API é exposta para qualquer usuário que tenha o link.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  4. Criando e manipulando o recurso
&lt;/h3&gt;

&lt;p&gt;Ao clicarmos em &lt;strong&gt;"New Resource"&lt;/strong&gt; a seguinte tela será aberta, e aqui começamos a modelar o formato dos dados que devem ser retornados assim como o nome do recurso.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nj3jDjfK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ypi1fc6cqulqs7inp5uv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nj3jDjfK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ypi1fc6cqulqs7inp5uv.png" alt="Image description" width="603" height="901"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No primeiro campo será onde iremos colocar o nome do recurso, esse nome será concatenado com a URL que vimos no passo anterior, então evite caracteres especiais, acentos e etc.&lt;/p&gt;

&lt;p&gt;Nos campos abaixo do nome podemos criar quantos campos quisermos que cada objeto dentro desse recurso tenha, além de também utilizar o Faker.js, que é onde o MockAPI realmente brilha, para gerarmos os dados mais realísticos possíveis desde nomes de pessoas, datas, fotos de pessoas, comidas e etc. Enfim, dá para mockar muito valores, como estamos criando uma coleção de usuários irei criar a API com os seguintes dados:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lCHTa6Bp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ff7w78ncgmb9gnjw2fax.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lCHTa6Bp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ff7w78ncgmb9gnjw2fax.png" alt="Image description" width="532" height="803"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(1): Primeiro Nome&lt;br&gt;
(2): Sobrenome&lt;br&gt;
(3): Foto de pessoas aleatórias, no caso virá uma URL e podemos inserí-las nas tags de &lt;strong&gt;img&lt;/strong&gt;&lt;br&gt;
(4): Email&lt;br&gt;
(5): Data de Nascimento&lt;/p&gt;

&lt;p&gt;Feito isso agora, podemos clicar no botão de &lt;strong&gt;"Create"&lt;/strong&gt; e dizer exatamente quantos objetos serão criados a partir do modelo que criamos, sendo o máximo 100 objetos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yk_MKX8G--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oe1ww2zyo42eesb1sbla.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yk_MKX8G--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oe1ww2zyo42eesb1sbla.png" alt="Image description" width="800" height="243"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por fim agora basta criarmos a requisição concatenando a URL do topo da página com o nome do nosso recurso, podendo também enviarmos requisições do tipo GET quando POST, PUT, PATCH e DELETE, basta alterarmos os headers para isso.&lt;/p&gt;

&lt;p&gt;Resultado final:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jZz4G-MD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mir6silf3b5tgmqaeu91.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jZz4G-MD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mir6silf3b5tgmqaeu91.png" alt="Image description" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;DISCLAIMER:&lt;/strong&gt; O MockAPI por padrão não faz nenhum tipo de validação nos métodos de alteração/criação então qualquer valor enviado é armazenado na coleção.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;MockAPI é o que eu tenho utilizado com mais frequência para quando eu quero criar algo mais simples e/ou para aprender alguma tecnologia nova ou para testar algum cenário e etc, muito pela facilidade de manipular e modelar a API da forma como eu quiser gerando dados aleatórios para cada objeto dentro da API, além de que as funcionalidades essenciais são gratuitas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/mbarbosasan/MockAPI_Devto"&gt;Arquivo final.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>mock</category>
      <category>braziliandevs</category>
      <category>api</category>
    </item>
  </channel>
</rss>
