<?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: Robson Mathias</title>
    <description>The latest articles on Forem by Robson Mathias (@robsonmathias).</description>
    <link>https://forem.com/robsonmathias</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%2F1254280%2F52cd8496-231b-4dc5-a5c3-105aa6ccd00c.jpeg</url>
      <title>Forem: Robson Mathias</title>
      <link>https://forem.com/robsonmathias</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/robsonmathias"/>
    <language>en</language>
    <item>
      <title>Design System e Tokens no Tino</title>
      <dc:creator>Robson Mathias</dc:creator>
      <pubDate>Wed, 17 Jul 2024 19:07:42 +0000</pubDate>
      <link>https://forem.com/tino-tech/design-system-e-tokens-no-tino-3njm</link>
      <guid>https://forem.com/tino-tech/design-system-e-tokens-no-tino-3njm</guid>
      <description>&lt;p&gt;Imagine a seguinte situação: uma engenheira e um designer estão construindo uma aplicação juntos. A desenvolvedora pergunta:&lt;/p&gt;

&lt;p&gt;— Qual vai ser a cor e fonte do botão?&lt;/p&gt;

&lt;p&gt;Em resposta o Designer diz:&lt;/p&gt;

&lt;p&gt;— É a mesma da Brand, &lt;strong&gt;#FF7A00&lt;/strong&gt; e a fonte pode ser a &lt;strong&gt;Inter&lt;/strong&gt;…&lt;/p&gt;

&lt;p&gt;Basicamente é isso que vai acontecer se não utilizarem algum nome que sirva de referência para as duas pessoas. Essas referências chamam-se &lt;strong&gt;Design Tokens.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  O que é um Design Token?
&lt;/h3&gt;

&lt;p&gt;É uma &lt;strong&gt;Variável semântica de estilo&lt;/strong&gt;, um termo atribuído pela &lt;a href="https://medium.com/u/6afd5f8e05c1" rel="noopener noreferrer"&gt;Meiuca Design&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Variável —&lt;/strong&gt; Que pode ser variado ou mudado; mudável — Definição por &lt;a href="https://michaelis.uol.com.br/busca?id=V4mPA" rel="noopener noreferrer"&gt;Michaelis&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Semântica —&lt;/strong&gt; O significado dos vocábulos, por oposição à sua forma — Definição por &lt;a href="https://michaelis.uol.com.br/busca?r=0&amp;amp;f=0&amp;amp;t=0&amp;amp;palavra=Sem%C3%A2ntica" rel="noopener noreferrer"&gt;Michaelis&lt;/a&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%2Fkv7dn920ihym1n9z7x4y.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%2Fkv7dn920ihym1n9z7x4y.png" alt="Image description" width="707" height="258"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora imagine novamente a situação proposta anterior:&lt;/p&gt;

&lt;p&gt;A desenvolvedora pergunta:&lt;/p&gt;

&lt;p&gt;— Qual vai ser a cor e fonte do botão?&lt;/p&gt;

&lt;p&gt;Em resposta o Designer diz:&lt;/p&gt;

&lt;p&gt;É a mesma da Brand, &lt;strong&gt;PalettePrimaryMain&lt;/strong&gt; e a fonte pode ser a &lt;strong&gt;FontFamilyDefault.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Agora até mesmo para quem não é uma pessoa desenvolvedora, as definições fazem sentido, basta um conhecimento básico de inglês.&lt;/p&gt;

&lt;h3&gt;
  
  
  No que isso ajuda exatamente?
&lt;/h3&gt;

&lt;p&gt;Basicamente na organização e escalabilidade de times. Aqui no Tino, queremos facilitar a vida dos Designers e Desenvolvedores. Quanto maior o nosso time fica, mais componentes criamos. Os Design Tokens permitem que alteremos propriedades dos nossos elementos de uma forma mais rápida, além de facilitar a comunicação entre as pessoas.&lt;/p&gt;

&lt;p&gt;Os Design Tokens podem ser declarados de várias formas: JSON, folha de estilos, XML e etc. Nós optamos por utilizar um recurso de composição dinâmica que nos permite exportar para qualquer formato que nosso produto precisa — só esse processo já vale um post a parte sobre como funciona e como construímos esse ecossistema!&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%2Fo361c98bqh4ov9c0b0zz.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%2Fo361c98bqh4ov9c0b0zz.png" alt="Image description" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Regras e composições de Design Tokens
&lt;/h3&gt;

&lt;p&gt;Para ajudar com a semântica, criamos uma estrutura que ajuda a compor melhor os nomes dos nossos tokens. Essa estrutura segue uma hierarquia e ordem que deve ser respeitada. Ela é composta por seis definições:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Grupo&lt;/strong&gt; — &lt;strong&gt;Componente&lt;/strong&gt; — &lt;strong&gt;Categoria&lt;/strong&gt; — &lt;strong&gt;Variante&lt;/strong&gt; — &lt;strong&gt;Propriedade&lt;/strong&gt; — &lt;strong&gt;Estado&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Essas definições são colocadas como um guia para ajudar a compor os nomes. Não é preciso preencher todos esses requisitos, somente &lt;strong&gt;Grupo&lt;/strong&gt; e &lt;strong&gt;Variante&lt;/strong&gt; são obrigatórios.&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%2Fkkyfrzkrezbq0ow2r26n.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%2Fkkyfrzkrezbq0ow2r26n.png" alt="Image description" width="800" height="334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos entender melhor cada item dessa estrutura:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Grupo —&lt;/strong&gt; Identificador principal que agrupa um conjunto de elementos da mesma família, exemplo: (&lt;strong&gt;Button, Typography, Label&lt;/strong&gt; etc.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Componente&lt;/strong&gt; — Elemento que possui um ecossistema complexo, que possui comportamento e filhos, como (&lt;em&gt;Button&lt;/em&gt;&lt;strong&gt;Outline&lt;/strong&gt;, &lt;em&gt;Label&lt;/em&gt;&lt;strong&gt;Outline&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Categoria&lt;/strong&gt; — Modelo de um componente. Um componente pode possuir mais de um modo de exibir comportamento, como (&lt;em&gt;ButtonOutline&lt;/em&gt;&lt;strong&gt;Primary&lt;/strong&gt;, &lt;em&gt;LabelOutline&lt;/em&gt;&lt;strong&gt;Secondary&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Variante&lt;/strong&gt; — Ao pensar em variante, pensamos em uma interação direta aplicada ao componente que faz variar seu estilo, como (&lt;strong&gt;Hovered&lt;/strong&gt;, &lt;strong&gt;Pressed&lt;/strong&gt;, &lt;strong&gt;Disabled&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Propriedade&lt;/strong&gt; — Um componente pode possuir propriedades relacionadas, como (&lt;strong&gt;Icon, Label, Text, Item&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Estado&lt;/strong&gt; — É a parte mais baixa da definição, muitas vezes relacionada ao valor ou situação do elemento naquele momento, (&lt;strong&gt;Color, Size, LetterSpace, Margin&lt;/strong&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  Acordos e definições
&lt;/h3&gt;

&lt;p&gt;Como garantir que os designers e desenvolvedores criem novos Design Tokens sem fugir de nomes e estruturas similares aos demais? A solução para isso foi adotarmos acordos para garantir que criaremos no mesmo formato. Vamos listar alguns exemplos:&lt;/p&gt;

&lt;h3&gt;
  
  
  Valores de escalas
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Breakpoints (T-shirt format alias): &lt;strong&gt;xl, lg, md, sm, xs.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Size (T-shirt format): &lt;strong&gt;XSmall, Small, Large, XLarge, 2XLarge, etc… .&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Colors (Bounded Scale): &lt;strong&gt;50 ,100, 150, …900, A100, A200, A400, A700.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Main colors (Terms): &lt;strong&gt;Light, Main, Dark, ContrastText.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Elevations, Shadows(Intervals): 0, 1, 2, 3…&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Escrita
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Escrever verbos no passado.&lt;/li&gt;
&lt;li&gt;Evitar nomes compostos.&lt;/li&gt;
&lt;li&gt;Não utilizar valores numéricos em &lt;strong&gt;Grupo.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Construindo componentes com Design Tokens
&lt;/h3&gt;

&lt;p&gt;Um componente é composto por &lt;strong&gt;design tokens.&lt;/strong&gt; Para facilitar a leitura chamaremos apenas de &lt;strong&gt;tokens&lt;/strong&gt;. Durante a composição do Design System identificamos que muitos componentes possuem tokens similares. Para garantir a consistência desses tokens, decidimos aplicar um padrão de herança, onde permitimos que cada componente possua tokens customizados, mas qualquer outro token que seja igual, precisa fazer referência de uma mesma fonte que chamamos de &lt;strong&gt;Foundation&lt;/strong&gt;. Exemplo:&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%2Fdmohvrrvoex7t07zuxu9.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%2Fdmohvrrvoex7t07zuxu9.png" alt="Image description" width="800" height="236"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Essa separação entre &lt;strong&gt;Foundation&lt;/strong&gt; e &lt;strong&gt;Components&lt;/strong&gt; garante na nossa estrutura centralizar os pontos de mudanças, sem perer o poder de customizar cenários específicos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Documentando componentes
&lt;/h3&gt;

&lt;p&gt;Utilizamos Storybook, tanto para documentar componentes quanto para documentar os tokens dos componentes. É o que parece mesmo, separamos em pacotes diferentes, um pacote de apenas tokens sem elementos visuais, somente variáveis e valores, e cada outro componente ou família de componentes possui um pacote isolado, mas todos fazem referência ao pacote de Tokens, assim gerenciar versões isoladamente dos elementos.&lt;/p&gt;

&lt;p&gt;Cada pacote possui um storybook para si (falaremos melhor sobre esse ecossistema em uma publicação futura). No caso do pacote de tokens, tivemos que criar um storybook addon, para exibir e registrar a descrição dos valores, exemplo:&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%2Fuzddbog4lsm5roxlyz4i.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%2Fuzddbog4lsm5roxlyz4i.png" alt="Image description" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  E como funciona entre o Figma e o Código?
&lt;/h3&gt;

&lt;p&gt;Nosso objetivo como fundação do Design System é estabelecer um acordo que tanto desenvolvedores quanto designers evitem quebrar. Não poderia ser apenas um documento escrito, pois isso não se sustentaria a longo prazo. Por isso, criamos algo que ofereça vantagens reais para ambos os lados ao seguir e adotar o sistema.&lt;/p&gt;

&lt;p&gt;Desenvolvemos uma biblioteca com um algoritmo que extrai informações de estilo de um documento do Figma através de suas APIs. Isso permite acessar todas as informações de estilos, nomes e vetores disponíveis em um documento.&lt;/p&gt;

&lt;p&gt;Com os valores dos estilos e as regras semânticas mencionadas no início desta publicação, conseguimos criar um elo que se estende do Figma ao código front-end. Em outras palavras, a mudança ou adição de um token publicada no Figma gera uma PR (pull request) em um repositório com os novos valores em código CSS, SASS, Typescript, Dart, ou qualquer outra linguagem. Os front-ends podem então aprovar e publicar esses valores como pacotes privados para nossa organização. Isso mesmo, não precisamos que um desenvolvedor seja acionado para adicionar um novo token ou ícone; conseguimos extrair tudo automaticamente por API e Webhook do Figma.&lt;/p&gt;

&lt;p&gt;Se quiser saber mais sobre como isso funciona, siga a página do Tino. Em breve, explicaremos essa biblioteca e os fluxos com mais detalhes.&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>designsystem</category>
      <category>figma</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Cebolas e camadas para padrões de projetos no Front-end — Parte I</title>
      <dc:creator>Robson Mathias</dc:creator>
      <pubDate>Wed, 19 Jun 2024 12:35:40 +0000</pubDate>
      <link>https://forem.com/tino-tech/cebolas-e-camadas-para-padroes-de-projetos-no-front-end-parte-i-55af</link>
      <guid>https://forem.com/tino-tech/cebolas-e-camadas-para-padroes-de-projetos-no-front-end-parte-i-55af</guid>
      <description>&lt;p&gt;Nesse texto, tenho como objetivo trazer uma alternativa de padrões de projetos front-ends, esse padrão funciona independente do framework ou biblioteca.&lt;/p&gt;

&lt;p&gt;A estrutura proposta neste artigo utiliza alguns recursos e nomenclaturas conhecidas pela comunidade do ReactJS, mas outras são uma inspiração de outros ecossistemas como Angular e similares, a ideia é compartilhar um padrão que já adotei em alguns projetos e que serve muito bem para um monolito escalável, e com uma ótima fórmula para modelar um ecossistema que poderá evoluir para um micro-frontend em um futuro próximo.&lt;/p&gt;

&lt;h1&gt;
  
  
  O que vamos encontrar aqui?
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Um projeto To-Do List com ReactJs e arquitetura onion.&lt;/li&gt;
&lt;li&gt;Referências a outras publicações que irá descrever melhor alguns contextos e implementações.&lt;/li&gt;
&lt;li&gt;Uma simples comparação entre uma arquitetura layered e uma onion.&lt;/li&gt;
&lt;li&gt;Um relato dos projetos em que implementei essa composição com pontos positivos e negativos.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Mas antes de começar:
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;O projeto de exemplo não possui uma API para gerenciar acessos e salvar dados, ou seja, os dados são salvos localmente no navegador.&lt;/li&gt;
&lt;li&gt;Essa arquitetura não é uma bala de prata, é complexa e robusta para escalar grandes projetos, para algo menor considere recursos mais objetivos como um MVC por exemplo.&lt;/li&gt;
&lt;li&gt;Os nomes podem ser modificados e adaptados para cada organização e contexto.&lt;/li&gt;
&lt;li&gt;É uma arquitetura conhecida no mundo back-end então, possuímos muitos posts e referência sobre ela, mas são sobre aplicações back-end.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Porque eu preciso adotar padrões de projetos?
&lt;/h1&gt;

&lt;p&gt;O conceito de padrões foi primeiramente descrito por Christopher Alexander em &lt;a href="https://www.amazon.com.br/Uma-Linguagem-Padr%C3%B5es-Christopher-Alexander/dp/8565837173/"&gt;Uma Linguagem de Padrões&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Padrões de projeto são soluções comuns para alguns problemas típicos, mas acredito que não deva ser algo que seja uma organização de arquivos que fica mais bonita ou que agrade a preferência do programador que está construindo, porque tudo isso é sempre do ponto de vista de quem implementa. Para, ser imparcial durante a definição de um bom padrão de projeto eu levo alguns pontos em consideração de que ele precisa cumprir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Testabilidade&lt;/strong&gt; — Que seja possível implementar diferentes testes (unitário, integrado, E2E, mutação, regressão e etc…), precisa ser fácil testar, a porcentagem de coverage não significa qualidade de teste e muito menos de software, porém quanto mais difícil de testar mais cenários os desenvolvedores irá deixar de testar ao longo do caminho.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manutenabilidade&lt;/strong&gt; — A alteração de algo em funcionamento, não deveria afetar muitos lugares do organismos. Abstrações e camadas podem parecer burocráticas e verbosa, mas elas garantem a manutenção, isolamento do contexto e sua sanidade no futuro.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Escalabilidade&lt;/strong&gt; — Uma aplicação assim como uma cidade precisa ser preparada para abrigar muitos cidadãos (usuários) e os engenheiros que irão mantê-la (devs). Não é só escalar apenas código, é escalar a capacidade de muitas pessoas atuarem no mesmo projeto, um projeto grande com muitas pessoas, irá enfrentar problemas como: CI/CD, Ambiente de deploy, PRs e merges, rollback, estratégias de deploy e etc. Para todas as nossas decisões temos que levar isso em consideração.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Separação de responsabilidades (SoC — separation of concerns)&lt;/strong&gt; — Isolar domínios e responsabilidades, permite um compartilhamento melhor de recursos sem afetar a performance e complexidade da sua aplicação.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observabilidade —&lt;/strong&gt; Se algo quebrou, eu preciso saber o que e em qual momento isso aconteceu, preciso atuar e reverter o problema de maneira rápida e eficiente, garantindo que o erro não volte mais a acontecer. Como podemos saber qual é a parte da sua aplicação que mais consome performance? Será que só usar a URL é o suficiente para entender quantos elementos e domínios temos ali e o que eles realmente fazem?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evitar pastas genéricas e sem propósito, shared e utils —&lt;/strong&gt; Quando não conseguimos separar bem nossas entidades e camadas, começamos a criar acoplamento entre os recursos, gerando a necessidade de criar pastas para shared ou utils. Funciona para o primeiro elemento, mas depois de um tempo, os desenvolvedores não irão gastar muito tempo pensando sobre o domínio das coisas, e tudo será útil ou shared.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Entre camas e cebolas.
&lt;/h1&gt;

&lt;p&gt;Uma padrão de projeto de camadas tradicional (layered pattern), o fluxo de dependências entre as camadas segue de cima para baixo. Na camada superior encontramos a área de interface do usuário (User Interface), no meio o processamento das informações (Business), e na base a saída ou entrada de dados para um serviço externo (Data).&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%2F6y1fylglht19fyl9ts8z.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%2F6y1fylglht19fyl9ts8z.png" alt="Layered architecture — Arquitetura em Camadas" width="400" height="334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fazendo uma sim analogia com uma estrutura em React:&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%2F105c5eln3qbbngxsyshn.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%2F105c5eln3qbbngxsyshn.png" alt="Exemplo de composição de componentes com React." width="800" height="237"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O grande ponto sobre esse padrão é o forte acoplamento entre as camadas, uma vez que é preciso substituir qualquer uma delas, as outras camadas relacionadas sofrem uma grande alteração ou conflito de comportamento. Ou seja, imagina que precisamos mudar a camada de Data de um Rest API para um GraphQL, a camada de business sofreria diretamente com essa mudança, além da baixa reutilização dos mesmos recursos em lugares diferentes.&lt;/p&gt;

&lt;p&gt;Agora invertemos a ordem das dependências, colocando como centro a nossa camada de Business e as camadas de Data e User Interface como referências ao business. Temos uma forma de garantir que, o que é importante para nossa aplicação, fique segura de mudanças garantindo que as camadas externas fiquem responsáveis por lidar com o mundo exterior.&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%2Fu6ei297nipe81b07q7vm.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%2Fu6ei297nipe81b07q7vm.png" alt="Inversão das camadas levando o business como principal referência." width="400" height="334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos mudar um pouco mais o formato do desenho:&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%2Frzvs5904uqp4z1ovypx6.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%2Frzvs5904uqp4z1ovypx6.png" alt="Convertendo o desenho da camada para um primeiro formato da nossa cebola." width="400" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Dessa forma, o que temos de evidência?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;O Foco é a parte central da nossa aplicação &lt;strong&gt;o business&lt;/strong&gt;, é onde a nossa mudança de negócio e evolução irá acontecer ao longo do tempo. Em alguns casos é possível manter uma linguagem mais pura, sem muitos recursos atrelado a um framework.&lt;/li&gt;
&lt;li&gt;User Interface e Data são camadas periféricas, onde os recursos são substituíveis e podem ser atrelados a um recurso ou tecnologia.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Evoluindo nossa cebola
&lt;/h1&gt;

&lt;p&gt;Podemos quebrar ainda mais as camadas dividindo responsabilidades:&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%2Foauzk06rrn1ws7lnoplt.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%2Foauzk06rrn1ws7lnoplt.png" alt="Onion Architecture — Arquitetura Onion" width="400" height="439"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A camada de user Interface se torna:
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Presentation&lt;/strong&gt; — Essa é a camada relacionada ao dispositivo do usuário, seja para web, navegador ou mobile. Os controles de rotas, parâmetros de urls, diagramação visual da página e composição de múltiplos domínios, devem ser tratados aqui. No caso de uma aplicação de front-end os componentes de UI também se encontram aqui, ou seja tome cuidado ao utilizar contextos de domínios em componentes que são apenas UI como Button por exemplo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Business é composta de:
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Application&lt;/strong&gt; — Essa camada do Business é considerada como operador do domínio, conhecido por alguns como os “Use Cases (Caso de usos)”, são métodos ou componentes que cumprem uma função de controlar o estado do domínio.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Domain&lt;/strong&gt; — Já na camada de domínio, encontramos o controle das nossas principais entidades. “Todos os objetos de uma aplicação deveriam ser uma entidade?” A resposta é não necessariamente, quando você se encontra em uma situação que precisa compartilhar a mesma informação entre dois organismos distintos e vizinhos, você se esbarra no problema da Mutabilidade, logo conseguimos resolver isso com uma entidade Imutável que é parte do domínio. Se o seu domínio for um método de composição de objeto ao invés de um objeto em si também funciona, é um comportamento muito comum em uma estrutura de Functional Programing.&lt;/p&gt;

&lt;h2&gt;
  
  
  A camada de Data é separada em:
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Persistence&lt;/strong&gt; — Nem todas as aplicações que trabalhei precisou dessa camada, mas cada vez mais tempos aplicações front-ends que permitem o usuário utilizar recursos offline. Logo precisamos persistir um dado primeiramente no dispositivo do usuário, antes de enviar para o back-end. Essa camada abstrai a forma que persistimos essa informação, seja através de um Index DB, Local storage ou memória volátil. Novamente o nosso domínio não deveria se importar quem e como essas informações chegam ou saem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Infrastructure&lt;/strong&gt; — Aqui configuramos a camada de serviço e adaptadores, uma forma de criar métodos e clientes para controlar nossas chamadas com o back-end, seja ela através de Rest API, Web Assembly, GRPC ou qualquer outro recurso, novamente nosso domínio poderia apenas esperar uma promessa de dados seja como for, a camada de infraestrutura deve se resolver para passar esse acordo. Outra coisa bacana, podemos adicionar aqui transformadores e compositores, ou seja nossa entidade do domínio pode ser um objeto que para existir, precisa ser composto por uma ou mais APIs e modificações em dados, na falta de um BFF, a camada de service trabalha muito bem removendo essa composição do seu domínio e entregando um dado mais puro para as camadas de dentro da cebola.&lt;/p&gt;

&lt;h1&gt;
  
  
  As pastas e arquivos precisam respeitar esses nomes?
&lt;/h1&gt;

&lt;p&gt;Não necessariamente, é claro que se estiver com esses nomes facilita a identificação dos contextos por aqueles que já conhecem esse padrão. Porém a adoção dos padrões é um acordo entre os desenvolvedores, e para todos os projetos que implementei, a nomenclatura dos organismos ainda foram o ponto de resistência à mudança pelos desenvolvedores Front-ends. Então minha escolha foi manter os organismos com nomes já conhecido pela comunidade, e criar um dicionário explicando onde se encaixa cada um deles e seus respectivos papéis para o projeto.&lt;/p&gt;

&lt;p&gt;Para entender melhor como cada camada ou elemento disso se comporta e funciona, leia a parte 2 dessa publicação.&lt;/p&gt;

&lt;h1&gt;
  
  
  Pontos positivos
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Essa estrutura permite tomar decisões mais tarde, ou seja, podemos desenvolver uma feature ou módulo, sem precisar esperar a API ficar pronta, conseguimos criar um mock dos dados e mudar isso no futuro sem afetar o domínio.&lt;/li&gt;
&lt;li&gt;Facilita muito para testar e conseguir garantir uma boa cobertura e qualidade de test.&lt;/li&gt;
&lt;li&gt;É fácil identificar a quebra de um módulo e features em pequenas atividades e PRs.&lt;/li&gt;
&lt;li&gt;Exclui a necessidade de pastas como shared, utils e recursos que são uma gaveta de quinquilharias, no começo do projeto faz sentido, depois de um ano não sabemos se tudo que tem lá é realmente para ser compartilhado ou útil.&lt;/li&gt;
&lt;li&gt;Essa estrutura funciona para qualquer tipo de linguagem ou tecnologia, já usei com projetos Angular, React + NextJS, React, React + Gatsby, VUE e etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Pontos negativos
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;A curva de aprendizado é um pouco mais demorada, é uma estrutura robusta e complexa que exige um entendimento do porquê das coisas.&lt;/li&gt;
&lt;li&gt;Antes de desenvolver um domínio é preciso gastar tempo pensando como ele será, o que é relacionado ao seu contexto e o que não é.&lt;/li&gt;
&lt;li&gt;Possui camadas de abstração mesmo que pareça redundante.&lt;/li&gt;
&lt;li&gt;Diferente do Java que é uma linguagem que possui recursos como “Protected”, que consegue bloquear o uso indevido de algumas funcionalidades, o javascript é modo “Freestyle” onde tudo é possível, mas nem tudo deveria ser permitido. Então criar bons padrões de alias, ajuda a identificar quando alguém está usando algo de forma errada.&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Referências
&lt;/h1&gt;

&lt;p&gt;Código de exemplo:&lt;br&gt;
&lt;a href="https://github.com/RobsonMathias/frontend-onion-architecture"&gt;https://github.com/RobsonMathias/frontend-onion-architecture&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fontes de estudos:&lt;br&gt;
&lt;a href="https://refactoring.guru/pt-br/design-patterns"&gt;https://refactoring.guru/pt-br/design-patterns&lt;/a&gt;&lt;br&gt;
&lt;a href="https://code-maze.com/onion-architecture-in-aspnetcore"&gt;https://code-maze.com/onion-architecture-in-aspnetcore&lt;/a&gt;&lt;br&gt;
&lt;a href="https://jeffreypalermo.com/2008/07/the-onion-architecture-part-1"&gt;https://jeffreypalermo.com/2008/07/the-onion-architecture-part-1&lt;/a&gt;&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>architecture</category>
      <category>react</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
