<?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: Diogo Neves</title>
    <description>The latest articles on Forem by Diogo Neves (@diogoneves07).</description>
    <link>https://forem.com/diogoneves07</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%2F949601%2F35a8f933-41b9-424b-b749-b7528157130b.jpg</url>
      <title>Forem: Diogo Neves</title>
      <link>https://forem.com/diogoneves07</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/diogoneves07"/>
    <language>en</language>
    <item>
      <title>Folder Structure for SPA Applications (Angular, React, Vue ...)</title>
      <dc:creator>Diogo Neves</dc:creator>
      <pubDate>Mon, 06 May 2024 15:42:04 +0000</pubDate>
      <link>https://forem.com/diogoneves07/folder-structure-for-spa-applications-angular-react-vue--546k</link>
      <guid>https://forem.com/diogoneves07/folder-structure-for-spa-applications-angular-react-vue--546k</guid>
      <description>&lt;p&gt;When starting a new Single Page Application (SPA) project, one of the most crucial decisions is the organization of the project's folders. A well-defined structure can simplify development, maintenance, and collaboration with other team members.&lt;/p&gt;

&lt;p&gt;In this article, I will explore a folder structure for starting an application, aiming to make it flexible and scalable throughout development.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It is important to note that this approach is especially useful for frameworks that do not offer a highly opinionated folder structure by default.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Directory Architecture
&lt;/h2&gt;

&lt;p&gt;Below, I present a visualization of the directory architecture that I recommend for organizing SPA projects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/src
│
├── /core
│   ├── (**Essential functionalities to initialize the application**)
│
├── /components 
│   ├── (**Presentation components**)
│
├── /widgets
│   ├── (**Independent components**)
│
├── /services
│   ├── (**Services to communicate with the API**)
│
├── /domain
│   ├── (**Application-specific types and utilities**)
│
└── /routes
    ├── (**Application pages**)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This structure provides a clear separation of responsibilities, facilitating development, maintenance, and scalability of the project.&lt;/p&gt;

&lt;p&gt;In the continuation of this article, I will explain the responsibility of each folder.&lt;/p&gt;

&lt;h3&gt;
  
  
  /core
&lt;/h3&gt;

&lt;p&gt;This folder is used to store the necessary code to initialize your application and load essential functionalities. Here reside essential services, components, and other functionalities that are used in various parts of the application.&lt;/p&gt;

&lt;h3&gt;
  
  
  /components
&lt;/h3&gt;

&lt;p&gt;Here lie the reusable components of your application focused on presenting data to the user.&lt;/p&gt;

&lt;h3&gt;
  
  
  /services
&lt;/h3&gt;

&lt;p&gt;In this folder, you should place the services responsible for communicating with your backend API. These services may include authentication logic, HTTP calls, and data manipulation.&lt;/p&gt;

&lt;h3&gt;
  
  
  /widgets
&lt;/h3&gt;

&lt;p&gt;The components in this folder are designed to be incorporated into pages independently. They use services to fetch the necessary data and make use of markup and other components to display them.&lt;/p&gt;

&lt;p&gt;Ideally, these components should be customizable only in basic styling aspects, such as colors, fonts, and sizes. They should not receive data directly, as they should be able to fetch it on their own.&lt;/p&gt;

&lt;h3&gt;
  
  
  /domain
&lt;/h3&gt;

&lt;p&gt;This folder houses types and utilities specific to the application. Here you will find data type definitions, functions, classes, and business logic that are specific to the application domain.&lt;/p&gt;

&lt;h3&gt;
  
  
  /routes
&lt;/h3&gt;

&lt;p&gt;The components in this folder combine other components to create complete pages that are displayed when the user accesses certain URLs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Additional Tip:
&lt;/h2&gt;

&lt;p&gt;In addition to the folder structure, a valuable complementary practice is to have one or more (in each directory) &lt;code&gt;README.md&lt;/code&gt; files containing information about the purpose of each folder, usage guidelines, and any other relevant information for developers interacting with the code in the future.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Remember that there is no one-size-fits-all approach that works for all projects. The structure presented in this article is just a suggestion and can be adapted according to the specific needs of your project.&lt;/p&gt;

&lt;p&gt;Try out this structure in your next project and adjust it as needed to meet your requirements.&lt;/p&gt;

&lt;p&gt;I hope this article has been helpful in getting you off to a good start with your SPA projects!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>frontend</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>Estrutura de Pastas Aplicações SPA (Angular, React, Vue ...)</title>
      <dc:creator>Diogo Neves</dc:creator>
      <pubDate>Wed, 01 May 2024 12:28:42 +0000</pubDate>
      <link>https://forem.com/diogoneves07/estrutura-de-pastas-aplicacoes-spa-angular-react-vue--d97</link>
      <guid>https://forem.com/diogoneves07/estrutura-de-pastas-aplicacoes-spa-angular-react-vue--d97</guid>
      <description>&lt;p&gt;Ao iniciar um novo projeto de Single Page Application (SPA), uma das decisões mais cruciais é a organização das pastas do projeto. Uma estrutura bem definida pode simplificar o desenvolvimento, a manutenção e a colaboração com outros membros da equipe.&lt;/p&gt;

&lt;p&gt;Neste artigo, explorarei uma estrutura de pastas para iniciar uma aplicação, visando torná-la flexível e escalável ao longo do desenvolvimento.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;É importante notar que essa abordagem é especialmente útil para frameworks que não oferecem uma estrutura de pastas altamente opinativa por padrão.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Arquitetura dos diretórios
&lt;/h2&gt;

&lt;p&gt;A seguir, apresento uma visualização da arquitetura de diretórios que recomendo para a organização de projetos de SPA:&lt;/p&gt;

&lt;p&gt;/src&lt;br&gt;
│&lt;br&gt;
├── /core&lt;br&gt;
│   ├── (&lt;strong&gt;Funcionalidades essenciais para inicializar a aplicação&lt;/strong&gt;)&lt;br&gt;
│&lt;br&gt;
├── /components &lt;br&gt;
│   ├── (&lt;strong&gt;Componentes de apresentação&lt;/strong&gt;)&lt;br&gt;
│&lt;br&gt;
├── /widgets&lt;br&gt;
│   ├── (&lt;strong&gt;Componentes independentes&lt;/strong&gt;)&lt;br&gt;
│&lt;br&gt;
├── /services&lt;br&gt;
│   ├── (&lt;strong&gt;Serviços para comunicar com a API&lt;/strong&gt;)&lt;br&gt;
│&lt;br&gt;
├── /domain&lt;br&gt;
│   ├── (&lt;strong&gt;Tipos e utilitários específicos da aplicação&lt;/strong&gt;)&lt;br&gt;
│&lt;br&gt;
└── /routes&lt;br&gt;
    ├── (&lt;strong&gt;Páginas da aplicação&lt;/strong&gt;)&lt;/p&gt;

&lt;p&gt;Essa estrutura proporciona uma separação clara de responsabilidades, facilitando o desenvolvimento, manutenção e escalabilidade do projeto.&lt;/p&gt;

&lt;p&gt;Na continuação deste artigo, explicarei a responsabilidade de cada pasta.&lt;/p&gt;

&lt;h3&gt;
  
  
  /core
&lt;/h3&gt;

&lt;p&gt;Esta pasta é utilizada para armazenar o código necessário para inicializar o seu aplicativo e carregar funcionalidades essenciais. Aqui residem os serviços essenciais, componentes e outras funcionalidades que são utilizadas em várias partes da aplicação.&lt;/p&gt;

&lt;h3&gt;
  
  
  /components
&lt;/h3&gt;

&lt;p&gt;Aqui ficam os componentes reutilizáveis da sua aplicação focados na apresentação dos dados ao usuário.&lt;/p&gt;

&lt;h3&gt;
  
  
  /widgets
&lt;/h3&gt;

&lt;p&gt;Os componentes nesta pasta são projetados para serem incorporados nas páginas de forma independente. Eles utilizam serviços para buscar os dados necessários e fazem uso de marcação e outros componentes para exibi-los.&lt;/p&gt;

&lt;p&gt;O ideal é que esses componentes sejam customizáveis apenas em aspectos básicos de estilização, como cores, fontes e tamanhos. Eles não devem receber dados diretamente, pois devem ser capazes de buscar por conta própria.&lt;/p&gt;

&lt;h3&gt;
  
  
  /services
&lt;/h3&gt;

&lt;p&gt;Nesta pasta, você deve colocar os serviços responsáveis por se comunicar com a API do seu backend. Esses serviços podem incluir lógica de autenticação, chamadas HTTP e manipulação de dados.&lt;/p&gt;

&lt;h3&gt;
  
  
  /domain
&lt;/h3&gt;

&lt;p&gt;Esta pasta abriga tipos e utilitários específicos da aplicação. Aqui você encontrará definições de tipos de dados, funções, classes e lógica de negócios que são específicas para o domínio da aplicação.&lt;/p&gt;

&lt;h3&gt;
  
  
  /routes
&lt;/h3&gt;

&lt;p&gt;Os componentes nesta pasta combinam outros componentes para criar páginas completas que são exibidas quando o usuário acessa determinadas URLs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dica Adicional:
&lt;/h2&gt;

&lt;p&gt;Além da estrutura de pastas, uma prática complementar valiosa é ter um ou varios(em cada diretório) arquivos &lt;code&gt;README.md&lt;/code&gt; contendo informações  sobre o propósito de cada pasta, orientações de uso, e quaisquer outras informações relevantes para os desenvolvedores que interagem com o código no futuro.&lt;/p&gt;

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

&lt;p&gt;Lembre-se de que não há uma abordagem única que funcione para todos os projetos. A estrutura apresentada neste artigo é apenas uma sugestão e pode ser adaptada conforme as necessidades específicas do seu projeto.&lt;/p&gt;

&lt;p&gt;Experimente esta estrutura em seu próximo projeto e ajuste conforme necessário para atender às suas necessidades.&lt;/p&gt;

&lt;p&gt;Espero que este artigo tenha sido útil para ajudá-lo a começar com o pé direito em seus projetos SPA!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>productivity</category>
      <category>frontend</category>
      <category>programming</category>
    </item>
    <item>
      <title>Como criar seu próprio sistema de gerenciamento de estado com vanilla JS?</title>
      <dc:creator>Diogo Neves</dc:creator>
      <pubDate>Tue, 27 Dec 2022 21:33:34 +0000</pubDate>
      <link>https://forem.com/diogoneves07/como-criar-seu-proprio-sistema-de-gerenciamento-de-estado-com-vanilla-js-29fm</link>
      <guid>https://forem.com/diogoneves07/como-criar-seu-proprio-sistema-de-gerenciamento-de-estado-com-vanilla-js-29fm</guid>
      <description>&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%2Fensewb5p4ch8egpmz50w.jpg" 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%2Fensewb5p4ch8egpmz50w.jpg" alt="Ligações entre dados da aplicação" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gerenciando o estado não é uma coisa nova em software, mas ainda é relativamente novo para construir software em JavaScript. Tradicionalmente, manteríamos o estado dentro do próprio DOM ou até mesmo o atribuiríamos a um objeto global na janela. Agora, porém, somos mimados com opções de bibliotecas e estruturas para nos ajudar com isso. Bibliotecas como Redux, MobX e Vuex(Ou Pinia) tornam o gerenciamento do estado entre componentes quase trivial. Isso é ótimo para a resiliência de um aplicativo e funciona muito bem com uma estrutura reativa de state-first, como React ou Vue.&lt;/p&gt;

&lt;p&gt;Mas como essas bibliotecas funcionam? O que seria necessário para escrever uma nós mesmos?&lt;/p&gt;

&lt;h2&gt;
  
  
  Conceitos
&lt;/h2&gt;

&lt;p&gt;Antes de começar, é importante conhecer alguns conceitos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Estado&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O estado pode ser entendido como o local onde guardarmos dados da aplicação, este pode ser global onde toda a aplicação pode fazer uso ou local onde apenas uma parte ou componente da aplicação podem fazer uso.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Observadores&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;São funções que são vinculadas a determinados valores para que possam ser chamadas sempre que esse valor mudar e, então, executar algo sobre a mudança.&lt;/p&gt;

&lt;p&gt;Existem outros conceitos e provavelmente você poderá ver pequenas mudanças em cada biblioteca, mas com isso podemos iniciar o desenvolvimento do nosso próprio sistema.&lt;/p&gt;

&lt;h2&gt;
  
  
  Começando
&lt;/h2&gt;

&lt;p&gt;De início vamos criar uma função &lt;code&gt;store&lt;/code&gt; que receberá um objeto normal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;initStateObject&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora que podemos acessar as propriedades que o “usuário” do nosso sistema vai precisar, devemos fazer algo com elas, devemos retornar algo que ele possa realmente usar como sistema de gerenciamento de estado, para isso devemos definir como irá funcionar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Devemos permitir obter e alterar o valor atual da propriedade.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Devemos permitir a criação de observadores para cada propriedade.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para realizar a primeira parte, podemos criar um novo objeto derivado do objeto passado como argumento, este novo objeto conterá todas as propriedades, porém, elas serão convertidas em funções que quando chamadas sem argumento, retornarão o valor atual da propriedade e quando chamado com um argumento, este passará a ser o novo valor da propriedade:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;initStateObject&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Obtém uma lista com todas as propriedades no objeto.&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;keys&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;initStateObject&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// O objeto que terá as propriedades como funções.&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;realStateObject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;

  &lt;span class="c1"&gt;// Útil para evitar alterá o objeto original.&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;initStateObjectClone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;initStateObject&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// A função que será usada no lugar da propriedade.&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;propertyFn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newValue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Se não houver um novo valor, retorne o valor atual.&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newValue&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;initStateObjectClone&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

      &lt;span class="c1"&gt;// Atualiza o valor da propriedade&lt;/span&gt;
      &lt;span class="nx"&gt;initStateObjectClone&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;newValue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;newValue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="c1"&gt;// Adiciona a propriedade como uma função ao objeto de estado.&lt;/span&gt;
    &lt;span class="nx"&gt;realStateObject&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;propertyFn&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Retorna o objeto de estado.&lt;/span&gt;
  &lt;span class="cm"&gt;/**
   * ? O objeto é congelado para evitar inserção de propriedades
   * ? já que não lidaremos com elas.
   * */&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;freeze&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;realStateObject&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com isso podemos saber quando um valor de uma propriedade foi consultado ou alterado.&lt;/p&gt;

&lt;p&gt;Agora devemos permitir a anexação de observadores para que qualquer parte da aplicação interessada em uma propriedade saiba que ela foi alterada e faça algo a respeito.&lt;/p&gt;

&lt;p&gt;Para isso, vamos aproveitar o fato de que as funções Javascript podem receber propriedades:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;initStateObject&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Obtém uma lista com todas as propriedades no objeto.&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;keys&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;initStateObject&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// O objeto que terá as propriedades como funções.&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;realStateObject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;

  &lt;span class="c1"&gt;// Útil para evitar alterá o objeto original.&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;initStateObjectClone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;initStateObject&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;//! Novo:&lt;/span&gt;
    &lt;span class="c1"&gt;// Armazena os observadores para cada propriedadade.&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;watchers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// A função que será usada no lugar da propriedade.&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;propertyFn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newValue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Se não houver um novo valor, retorne o valor atual.&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newValue&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;initStateObjectClone&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

      &lt;span class="c1"&gt;// Atualiza o valor da propriedade&lt;/span&gt;
      &lt;span class="nx"&gt;initStateObjectClone&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;newValue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="c1"&gt;//! Novo:&lt;/span&gt;
      &lt;span class="c1"&gt;// Percorre todos os observadores e passa a eles o novo valor.&lt;/span&gt;
      &lt;span class="nx"&gt;watchers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newValue&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;newValue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="c1"&gt;//! Novo:&lt;/span&gt;
    &lt;span class="c1"&gt;// Método `watch()` que será responsável por adicionar os observadores.&lt;/span&gt;
    &lt;span class="nx"&gt;propertyFn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;watch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;//! Novo:&lt;/span&gt;
      &lt;span class="c1"&gt;// Chama o observador imediatamente na primeira vez.&lt;/span&gt;
      &lt;span class="nf"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;initStateObjectClone&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

      &lt;span class="c1"&gt;// Armazena o observador.&lt;/span&gt;
      &lt;span class="nx"&gt;watchers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="c1"&gt;// Uma função responsável por remover o observado.&lt;/span&gt;
      &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;watchers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="c1"&gt;// Adiciona a propriedade como uma função ao objeto de estado.&lt;/span&gt;
    &lt;span class="nx"&gt;realStateObject&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;propertyFn&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Retorna o objeto de estado.&lt;/span&gt;
  &lt;span class="cm"&gt;/**
   * ? O objeto é congelado para evitar inserção de propriedades
   * ? já que não lidaremos com elas.
   * */&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;freeze&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;realStateObject&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O que fizemos foi adicionar um método &lt;code&gt;watch()&lt;/code&gt; nas funções que foram criadas a partir das propriedades, ele é responsável por adicionar o observador, o método &lt;code&gt;watch()&lt;/code&gt; também retorna uma função que quando chamada remove o observador.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo de uso:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;store&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;userData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;watch&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;u&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;u&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Òlá, &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;u&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;!`&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;userData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;username&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Diogo Neves&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Fechamento
&lt;/h2&gt;

&lt;p&gt;Isso é apenas o básico, mas com isso temos um sistema de gerenciamento de estado simples e útil!&lt;/p&gt;

&lt;p&gt;Poderíamos usar Proxies Javascript, no entanto, acredito que dessa forma fica mais fácil de entender e pensar por si próprio como um sistema de gerenciamento de estado funciona, mas recomendo a leitura sobre &lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Proxy"&gt;Proxies&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Obrigado por chegar até aqui!&lt;/p&gt;

&lt;p&gt;Qualquer dúvida deixe um comentário, até mais!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>BemtvJS - Overview</title>
      <dc:creator>Diogo Neves</dc:creator>
      <pubDate>Sun, 27 Nov 2022 16:56:49 +0000</pubDate>
      <link>https://forem.com/diogoneves07/bemtvjs-overview-e51</link>
      <guid>https://forem.com/diogoneves07/bemtvjs-overview-e51</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;BemtvJS:&lt;br&gt;
Template-based reactivity,&lt;br&gt;
Brackethtml,&lt;br&gt;
CSS-In-Template,&lt;br&gt;
SuperComponent,&lt;br&gt;
CSS-In-JS,&lt;br&gt;
Hooks,&lt;br&gt;
DOM events,&lt;br&gt;
CompVars,&lt;br&gt;
Transformation functions,&lt;br&gt;
Automatic routing,&lt;br&gt;
and Code-Splitting.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;BemtvJS is a UI library that takes an approach contrary to most libraries and frameworks. Usually UI tools observe the state (variables and properties) and when it changes it updates the template and applies the result to the DOM, Bemtv makes the template itself check if the state has changed and update itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Brackethtml
&lt;/h2&gt;

&lt;p&gt;Brackethtml is a markup language built into Bemtv that allows you to reduce HTML redundancy, support it and look like it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;btn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`button[Click me!]`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Brackethtml also allows insertion of CSS-In-Template, which is simply CSS-In-JS inserted directly into the template:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;btn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`button[color:blue; ~ Click me!]`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  SuperComponent
&lt;/h2&gt;

&lt;p&gt;Creating a component:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bemtv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="s2"&gt;`App`&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The returned value is called a SuperComponent. Internally, each time the component is used, a lightweight instance is created that manages this new rendering of the component.&lt;/p&gt;

&lt;p&gt;These instances assume “control” whenever an action occurs in them, where the reaction is the execution of a previously passed callback, normally in Hooks and DOM events.&lt;/p&gt;

&lt;h3&gt;
  
  
  CSS-In-JS
&lt;/h3&gt;

&lt;p&gt;In addition to the style that can be applied directly to the template, a great option is to use the css() method:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bemtv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;css&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;template&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="s2"&gt;`App`&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;css&lt;/span&gt;&lt;span class="s2"&gt;`
  color: blue;
  font-size: 20px;
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="s2"&gt;`h1[Hello world!]`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Hooks
&lt;/h3&gt;

&lt;p&gt;Each component instance goes through a series of steps, we can run functions called hooks in each of these steps:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bemtv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;onInit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onMount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onUpdate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onUnmount&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="s2"&gt;`App`&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nf"&gt;onInit&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Called(only once) when the instance is initialized.&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nf"&gt;onMount&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Called(only once) after the component template has been mounted in the DOM.&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nf"&gt;onUpdate&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Called after the template update is applied to the DOM.&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nf"&gt;onUnmount&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Called(only once) after the component is removed/unmounted from the template it was in.&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  DOM Events
&lt;/h3&gt;

&lt;p&gt;We can use DOM events directly from SuperComponent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bemtv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;click$&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mouseover$&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="s2"&gt;`App`&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;click&lt;/span&gt;&lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;capture&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;mouseover&lt;/span&gt;&lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hey!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  CompVars
&lt;/h2&gt;

&lt;p&gt;We can pass an object as an argument to the component, this object is called &lt;code&gt;compVars&lt;/code&gt; and all properties added to it are isolated to each rendering of the component, including data structures like Array, Set, Map and Object.&lt;/p&gt;

&lt;p&gt;Knowing our “variables”, Bemtv manages to provide really sweet syntactic sugars.&lt;/p&gt;

&lt;p&gt;An example is that we can add the path to the property directly in the template using the &lt;code&gt;$&lt;/code&gt; symbol:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bemtv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;render&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="s2"&gt;`Message`&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hey!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="s2"&gt;`button[Clicked: $message ]`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If we have a property with the same name as an HTML attribute, we can use the &lt;code&gt;@&lt;/code&gt; symbol to tell Bemtv to treat the property as a key and value:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bemtv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;render&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="s2"&gt;`Img`&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;avatar.png&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;My avatar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="s2"&gt;`img[ @src @alt ]`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Transformation Functions
&lt;/h2&gt;

&lt;p&gt;The Transformation functions allow us to add a “mark” to a data structure and tell Bemtv to transform the data structure only when necessary, this allows us to focus only on the data structure.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;tFn&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bemtv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tListJoin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;tFn&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; br[] &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above example creates a transform function that can be used with lists, and when the list is requested by the template it executes that function and adds the result to the template:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tFn&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bemtv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tListJoin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;tFn&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; br[] &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;template&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="s2"&gt;`List`&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;list&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;tListJoin&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="s2"&gt;`div[Users: $list ]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Whenever this list is changed (eg &lt;code&gt;$.list.push(item)&lt;/code&gt;), Bemtv will detect and use the transform function again and render the change.&lt;/p&gt;

&lt;h2&gt;
  
  
  Automatic routing
&lt;/h2&gt;

&lt;p&gt;Bemtv uses an innovative automatic route creation system, this is possible because the components can behave like routes/pages.&lt;/p&gt;

&lt;p&gt;Bemtv is able to automatically figure out when a “normal” component should also be treated as a route:&lt;/p&gt;

&lt;p&gt;A regular component:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bemtv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;template&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="s2"&gt;`AboutUs`&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="s2"&gt;`We are cool!`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The component responsible for rendering the App:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bemtv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;render&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="s2"&gt;`App`&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="s2"&gt;`
      Welcome!  br[]br[]

      #[] br[]br[]

      #AboutUs[ Link to about us ]`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second component uses the &lt;code&gt;#[]&lt;/code&gt; symbol, it is within it that the routes are rendered.&lt;/p&gt;

&lt;p&gt;Note the &lt;code&gt;#AboutUs[...]&lt;/code&gt;, this is where the “magic” happens.&lt;br&gt;
First, Bemtv will read the &lt;code&gt;App&lt;/code&gt; component template and find that the &lt;code&gt;AboutUs&lt;/code&gt; component&lt;br&gt;
is also a route (thanks to the &lt;code&gt;#&lt;/code&gt; before it), and when the template is rendered, everything inside the &lt;code&gt;#AboutUs[...]&lt;/code&gt; component will be wrapped in an &lt;code&gt;a&lt;/code&gt; tag with the &lt;code&gt;href&lt;/code&gt; attribute pointing to the route.&lt;/p&gt;

&lt;p&gt;The route address will be the component name in kebab-case: &lt;code&gt;/about-us&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;When the user clicks on the link, the &lt;code&gt;AboutUs&lt;/code&gt; component will be rendered in &lt;code&gt;#[]&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Bemtv will also figure out that the component is a route whenever we access some method of the component that targets routes, even if it is not called (thanks to Proxies).&lt;/p&gt;
&lt;h2&gt;
  
  
  Code-Splitting
&lt;/h2&gt;

&lt;p&gt;To automate the component import process, Bemtv offers the autoImportComponents() function which accepts an object where the properties name must be the components name and their values ​​must be a function that imports the component using &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/import" rel="noopener noreferrer"&gt;dynamic imports&lt;/a&gt;(dynamic import):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;autoImportComponents&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bemtv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;autoImportComponents&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nc"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./components/Counter&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bemtv will import the component as soon as the component is used in a template, however, it will ignore the component until it is available.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closure
&lt;/h2&gt;

&lt;p&gt;These are not all the functionalities offered by Bemtv, for example, we are not talking about the innovative data sharing system between the components.&lt;br&gt;
You can check everything in the project repository:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/diogoneves07/bemtvjs" rel="noopener noreferrer"&gt;https://github.com/diogoneves07/bemtvjs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Bemtv is a recent project, you are welcome to be part of the construction of this tool.&lt;/p&gt;

&lt;p&gt;Any questions or if you want to contribute to the project, you can contact me or open a PR.&lt;/p&gt;

&lt;p&gt;Thanks for getting this far!&lt;/p&gt;

</description>
      <category>career</category>
      <category>interview</category>
      <category>learning</category>
    </item>
    <item>
      <title>BemtvJS - Visão geral</title>
      <dc:creator>Diogo Neves</dc:creator>
      <pubDate>Sun, 27 Nov 2022 16:46:20 +0000</pubDate>
      <link>https://forem.com/diogoneves07/bemtvjs-visao-geral-2fi1</link>
      <guid>https://forem.com/diogoneves07/bemtvjs-visao-geral-2fi1</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;BemtvJS: &lt;br&gt;
Reatividade baseada em template,&lt;br&gt;
Brackethtml, &lt;br&gt;
CSS-In-Template, &lt;br&gt;
SuperComponent, &lt;br&gt;
CSS-In-JS, &lt;br&gt;
Hooks, &lt;br&gt;
DOM events, &lt;br&gt;
CompVars, &lt;br&gt;
Funções de transformação, &lt;br&gt;
Roteamento automático, &lt;br&gt;
e Divisão de código.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;BemtvJS é uma biblioteca de UI que adota uma abordagem contrária à maioria das bibliotecas e estruturas. Normalmente as ferramentas de UI observam o estado (variáveis ​​e propriedades) e quando ele muda, atualiza o template e aplica o resultado ao DOM, a Bemtv faz o próprio template verificar se o estado mudou e se atualizar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Brackethtml
&lt;/h2&gt;

&lt;p&gt;Brackethtml é uma linguagem de marcação incorporada ao Bemtv que permite reduzir a redundância do HTML, suportá-lo e se parecer com ele:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;btn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`button[Click me!]`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Brackethtml também permite a inserção de CSS-In-Template, que  simplesmente é CSS-In-JS inserido diretamente no template:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;btn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`button[color:blue; ~ Click me!]`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  SuperComponent
&lt;/h2&gt;

&lt;p&gt;Criando um componente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bemtv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="s2"&gt;`App`&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O valor retornado é chamado de SuperComponent. Internamente, cada vez que o componente é usado, é criada uma instância leve que gerencia essa nova renderização do componente.&lt;/p&gt;

&lt;p&gt;Essas instâncias assumem o “controle”, sempre que ocorre uma ação nelas, onde a reação é a execução de um callback passado anteriormente, normalmente em Hooks e eventos do DOM.&lt;/p&gt;

&lt;h3&gt;
  
  
  CSS-In-JS
&lt;/h3&gt;

&lt;p&gt;Além do estilo que pode ser aplicado diretamente no template, uma ótima opção é utilizar o método css():&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bemtv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;css&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;template&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="s2"&gt;`App`&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;css&lt;/span&gt;&lt;span class="s2"&gt;`
  color: blue;
  font-size: 20px;
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="s2"&gt;`h1[Hello world!]`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Hooks
&lt;/h3&gt;

&lt;p&gt;Cada instância do componente passa por uma série de etapas, podemos executar funções chamadas hooks em cada uma dessas etapas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bemtv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;onInit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onMount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onUpdate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onUnmount&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="s2"&gt;`App`&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nf"&gt;onInit&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Chamada(apenas uma vez) quando a instância é inicializada.&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nf"&gt;onMount&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Chamada(apenas uma vez) depois que o template do componente foi montado no DOM.&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nf"&gt;onUpdate&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Chamada após a atualização do template ser aplicada ao DOM.&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nf"&gt;onUnmount&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Chamado(apenas uma vez) depois que o componente é removido/desmontado do template em que estava.&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Eventos do DOM
&lt;/h3&gt;

&lt;p&gt;Podemos usar eventos DOM diretamente do SuperComponent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bemtv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;click$&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mouseover$&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="s2"&gt;`App`&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;click&lt;/span&gt;&lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;capture&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;mouseover&lt;/span&gt;&lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hey!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Variáveis de ​​componentes(compVars)
&lt;/h2&gt;

&lt;p&gt;Podemos passar um objeto como argumento para o componente, este objeto é chamado &lt;code&gt;compVars&lt;/code&gt; e todas as propriedades adicionadas a ele são isoladas a cada renderização do componente, incluindo estruturas de dados como Array, Set, Map e Object.&lt;/p&gt;

&lt;p&gt;Conhecendo nossas “variáveis”, a Bemtv consegue fornecer açúcares sintáticos realmente doces. &lt;/p&gt;

&lt;p&gt;Um exemplo é que podemos adicionar o caminho para a propriedade diretamente no template usando o símbolo &lt;code&gt;$&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bemtv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;render&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="s2"&gt;`Message`&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hey!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="s2"&gt;`button[Clicked: $message ]`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se tivermos uma propriedade com o mesmo nome de um atributo HTML podemos usar o símbolo &lt;code&gt;@&lt;/code&gt; para informar a Bemtv para tratar a propriedade como chave e valor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bemtv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;render&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="s2"&gt;`Img`&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;avatar.png&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;My avatar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="s2"&gt;`img[ @src @alt ]`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Funções de transformação
&lt;/h2&gt;

&lt;p&gt;As funções de transformação nos permitem adicionar uma “marca” a uma estrutura de dados e informa ao Bemtv para transformar a estrutura de dados somente quando necessário, isso nos permite focar apenas na estrutura de dados.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;tFn&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bemtv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tListJoin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;tFn&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; br[] &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O exemplo acima cria uma função de transformação que pode ser usada com listas, e quando a lista é solicitada pelo template ele executa essa função e adiciona o resultado ao template:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tFn&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bemtv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tListJoin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;tFn&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; br[] &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;template&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="s2"&gt;`List`&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;list&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;tListJoin&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="s2"&gt;`div[Users: $list ]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sempre que esta lista for alterada (ex: &lt;code&gt;$.list.push(item)&lt;/code&gt;), A Bemtv detectará e usará a função de transformação novamente e renderizará a alteração.&lt;/p&gt;

&lt;h2&gt;
  
  
  Roteamento automático
&lt;/h2&gt;

&lt;p&gt;A Bemtv utiliza um inovador sistema de criação automática de rotas, isso é possível porque os componentes podem se comportar como rotas/páginas.&lt;/p&gt;

&lt;p&gt;O Bemtv é capaz de descobrir automaticamente quando um componente “normal” também deve ser tratado como uma rota:&lt;/p&gt;

&lt;p&gt;Um componente normal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bemtv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;template&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="s2"&gt;`AboutUs`&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="s2"&gt;`We are cool!`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O componente responsável por rendrizar o App:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bemtv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;render&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="s2"&gt;`App`&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="s2"&gt;`
      Welcome!  br[]br[]

      #[] br[]br[]

      #AboutUs[ Link to about us ]`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O segundo componente apresenta a utilização do simbolo &lt;code&gt;#[]&lt;/code&gt;, é dentro dele que as rotas são renderizadas.&lt;/p&gt;

&lt;p&gt;Observe o &lt;code&gt;#AboutUs[...]&lt;/code&gt;, é aqui que a mágica acontece.&lt;br&gt;
Primeiro, a Bemtv lerá o template de componente &lt;code&gt;App&lt;/code&gt; e descobrirá que o componente &lt;code&gt;AboutUs&lt;/code&gt;&lt;br&gt;
também é uma rota (graças ao &lt;code&gt;#&lt;/code&gt; antes dele), e quando o template for renderizado, tudo dentro do componente &lt;code&gt;#AboutUs[...]&lt;/code&gt; será envolvido em uma tag &lt;code&gt;a&lt;/code&gt; com o atributo &lt;code&gt;href&lt;/code&gt; apontando para a rota.&lt;/p&gt;

&lt;p&gt;O endereço da rota será o nome do componente em kebab-case: &lt;code&gt;/about-us&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Quando o usuário clicar no link, o componente &lt;code&gt;AboutUs&lt;/code&gt; será renderizado em &lt;code&gt;#[]&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A Bemtv também descobrirá que o componente é uma rota sempre que acessarmos algum método do componente que se destine a rotas, mesmo que não seja chamado(graças a Proxies).&lt;/p&gt;
&lt;h2&gt;
  
  
  Dividindo o Código (Code-Splitting)
&lt;/h2&gt;

&lt;p&gt;Para automatizar o processo de importação de componentes, a Bemtv oferece a função &lt;code&gt;autoImportComponents()&lt;/code&gt; que aceita um objeto onde o nome das propriedades deve ser o nome dos componentes e seus valores devem ser uma função que importa o componente usando &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/import" rel="noopener noreferrer"&gt;importações dinâmicas&lt;/a&gt;(dynamic import):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;autoImportComponents&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bemtv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;autoImportComponents&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nc"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./components/Counter&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A Bemtv fará a importação do componente assim que componente for utilizado em um template, porém, irá ignorar o componente até o momento em que estiver disponível.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fechamento
&lt;/h2&gt;

&lt;p&gt;Essas não são todas as funcionalidades oferecidas pela Bemtv, por exemplo, não estamos falando do inovador sistema de compartilhamento de dados entre os componentes. &lt;br&gt;
Você pode conferir tudo no repositório do projeto:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/diogoneves07/bemtvjs" rel="noopener noreferrer"&gt;https://github.com/diogoneves07/bemtvjs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Bemtv é um projeto recente, você é bem-vindo para fazer parte da construção desta ferramenta.&lt;/p&gt;

&lt;p&gt;Qualquer dúvida ou se quiser contribuir com o projeto, pode entrar em contato comigo ou abrir uma PR.&lt;/p&gt;

&lt;p&gt;Obrigado por chegar até aqui! &lt;/p&gt;

</description>
      <category>emptystring</category>
    </item>
    <item>
      <title>Super IA vs Devs</title>
      <dc:creator>Diogo Neves</dc:creator>
      <pubDate>Sat, 19 Nov 2022 00:48:52 +0000</pubDate>
      <link>https://forem.com/diogoneves07/super-ia-vs-devs-no</link>
      <guid>https://forem.com/diogoneves07/super-ia-vs-devs-no</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.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%2Fr8rif4o7j5vbfpymgj9l.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fr8rif4o7j5vbfpymgj9l.jpg" alt="Um robô humanoide" width="800" height="535"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Recentemente, durante uma conversa em um grupo de amigos desenvolvedores, surgiu uma dúvida: Uma super IA poderia ou não “roubar” o espaço dos programadores no mercado de trabalho?&lt;/p&gt;

&lt;p&gt;Para ter um parâmetro de quão “super” essa IA precisaria ser, imagine a combinação das ferramentas e IAs mais poderosas atualmente, exatamente aquelas que você está acostumado a usar, certamente seria muito poderosa.&lt;/p&gt;

&lt;h2&gt;
  
  
  A minha resposta...
&lt;/h2&gt;

&lt;p&gt;Começo minha resposta com uma pergunta: atualmente, na empresa em que você trabalha, sendo júnior ou sênior, sua única responsabilidade é sentar em uma cadeira e programar?&lt;/p&gt;

&lt;p&gt;Um programador é semelhante a um arquiteto e como tau, tem grande importância naquilo que está sendo construído, ele normalmente vai além do código, fazendo parte do planejamento, acompanhado execução e ajudando na tomada de decisões de acordo com as necessidades do projeto.&lt;/p&gt;

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

&lt;p&gt;Eu vejo essas “ferramentas” literalmente como ferramentas que ajudam ou vão ajudar o programador a ser mais produtivo ou que simplesmente atacam um determinado problema que pode ser automatizado, mesmo com uma “Super AI“, não vejo o mundo dos programadores sendo abalado, de fato. &lt;/p&gt;

&lt;p&gt;Na verdade, com a automatização de determinadas tarefas sobra mais tempo para os programadores focarem em coisas realmente importantes como qualidade do código, testes e novas funcionalidade. Ou seja, contribui para desenvolvermos softwares incríveis e torná-lo mais sustentáveis ao longo do tempo.&lt;/p&gt;

&lt;p&gt;Deixe-me saber se concorda ou não comigo nos comentários!&lt;/p&gt;

&lt;p&gt;Obrigado por chegar até aqui!&lt;/p&gt;

</description>
      <category>watercooler</category>
    </item>
    <item>
      <title>O quão bom você é na sua linguagem favorita?</title>
      <dc:creator>Diogo Neves</dc:creator>
      <pubDate>Thu, 17 Nov 2022 12:53:17 +0000</pubDate>
      <link>https://forem.com/diogoneves07/o-quao-bom-voce-e-na-sua-linguagem-favorita-42ee</link>
      <guid>https://forem.com/diogoneves07/o-quao-bom-voce-e-na-sua-linguagem-favorita-42ee</guid>
      <description>&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%2Fg8w40aeim061qrnpe5g7.jpg" 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%2Fg8w40aeim061qrnpe5g7.jpg" alt="Homem no topo da montanha" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nos últimos anos aprofundei meus conhecimentos em JavaScript e recentemente me surgiu uma dúvida: Como saber se sou realmente bom em JavaScript? &lt;/p&gt;

&lt;p&gt;A questão não é se sou um bom desenvolvedor ou programador, mas até onde cheguei em uma determinada linguagem.&lt;/p&gt;

&lt;h2&gt;
  
  
  A resposta...
&lt;/h2&gt;

&lt;p&gt;A resposta para isso é “depende”, depende do seu parâmetro de comparação, porque ele vai determinar o que você considera “bom”.&lt;/p&gt;

&lt;p&gt;No entanto, podemos usar uma analogia e comparar o aprendizado de uma linguagem de programação com o aprendizado de uma idioma falado.&lt;/p&gt;

&lt;p&gt;O sonho de todo estudante de idiomas é pronunciar e conhecer as palavras de um determinado idioma como os falantes nativos, no entanto, nem mesmo os falantes nativos conhecem todas as palavras ou todas as maneiras pelas quais uma frase pode ser montada. &lt;/p&gt;

&lt;p&gt;Mas na maioria das vezes que um falante nativo ouve ou lê palavras em seu idioma, ele as reconhece rapidamente, mesmo sem saber o que elas realmente significam.&lt;/p&gt;

&lt;p&gt;Voltando ao mundo das linguagens de programação, acredito que um programador alcançou um bom nível ou “nativo” em uma determinada linguagem sempre que, ao ver algo novo nessa linguagem, não se sente “confuso” ou “perdido”, ou seja, mesmo que não saiba exatamente o que está acontecendo, você deve ter uma noção básica e se sentir confortável.&lt;/p&gt;

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

&lt;p&gt;Atualmente, gosto de pensar assim porque simplesmente não é necessário definir níveis. &lt;/p&gt;

&lt;p&gt;Nós podemos testar esse raciocínio ao olhar para um bloco de código em uma linguagem desconhecida e depois olhar para outro na nossa linguagem favorita, obviamente suas habilidades podem fazer você compreender os dois códigos, mas ao olhar para um bloco de código em uma linguagem desconhecida parecerá que você não está falando em seu idioma nativo, mas sim em um outro idioma.&lt;/p&gt;

&lt;p&gt;Deixe um comentário para que eu saiba se você concorda ou não comigo!&lt;/p&gt;

&lt;p&gt;Obrigado por chegar até aqui!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>career</category>
    </item>
    <item>
      <title>Super componentes... E muito mais!</title>
      <dc:creator>Diogo Neves</dc:creator>
      <pubDate>Thu, 17 Nov 2022 12:36:11 +0000</pubDate>
      <link>https://forem.com/diogoneves07/super-componentes-e-muito-mais-cj2</link>
      <guid>https://forem.com/diogoneves07/super-componentes-e-muito-mais-cj2</guid>
      <description>&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%2Fj7zjjv622e8sl084ar97.jpg" 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%2Fj7zjjv622e8sl084ar97.jpg" alt="Super-heróis Batman e homem aranha de mãos dadas" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O último lançamento da biblioteca &lt;a href="https://github.com/diogoneves07/bemtvjs"&gt;&lt;strong&gt;Bemtv&lt;/strong&gt;&lt;/a&gt; veio com recursos interessantes, o mais marcante deles a sintaxe possibilitada pelos SuperComponents.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que SuperComponent?
&lt;/h2&gt;

&lt;p&gt;Um dos objetivos de criar componentes é poder utilizá-los muitas vezes em sua aplicação. Com o SuperComponent, internamente, cada vez que o componente é usado, cria-se uma instância leve que gerência essa nova renderização do componente. Essas instâncias assumem o “controle”, sempre que ocorre uma ação nelas, onde a reação é a execução de um callback passado anteriormente, normalmente em Hooks e eventos do DOM.&lt;/p&gt;

&lt;h2&gt;
  
  
  Um breve olhar
&lt;/h2&gt;

&lt;p&gt;Componente &lt;strong&gt;Counter&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bemtv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;click$&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;css&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;render&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="s2"&gt;`Counter`&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;click&lt;/span&gt;&lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;css&lt;/span&gt;&lt;span class="s2"&gt;`
  padding: 20px;
  color: blue;
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="s2"&gt;`button[Clicked: $count ]`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Logo, vemos que não precisamos envolver a lógica do componente em uma função como de costume, então a sintaxe parece melhor e mais limpa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Variáveis de ​​componentes(compVars)
&lt;/h2&gt;

&lt;p&gt;No exemplo anterior, passamos um objeto com uma propriedade &lt;code&gt;count&lt;/code&gt; como argumento, este objeto é chamado &lt;code&gt;compVars&lt;/code&gt; e todas as propriedades adicionadas a ele são isoladas a cada renderização do componente, incluindo estruturas de dados como Array, Set, Map e Object.&lt;/p&gt;

&lt;p&gt;Conhecendo nossas “variáveis”, a Bemtv consegue fornecer açúcares sintáticos realmente doces. &lt;/p&gt;

&lt;p&gt;Um exemplo é que podemos adicionar o caminho para a propriedade diretamente no template usando o símbolo &lt;code&gt;$&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bemtv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;render&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="s2"&gt;`Counter`&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hey!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="s2"&gt;`button[Clicked: $message ]`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se tivermos uma propriedade com o mesmo nome de um atributo HTML podemos usar o símbolo &lt;code&gt;@&lt;/code&gt; para informar a Bemtv para tratar a propriedade como chave e valor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bemtv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;render&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="s2"&gt;`Img`&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;avatar.png&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;My avatar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="s2"&gt;`img[ @src @alt ]`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Funções de transformação
&lt;/h2&gt;

&lt;p&gt;As funções de transformação nos permitem adicionar uma “marca” a uma estrutura de dados e informa ao Bemtv para transformar a estrutura de dados somente quando necessário, isso nos permite focar apenas na estrutura de dados.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;tFn&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bemtv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tListJoin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;tFn&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; br[] &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O exemplo acima cria uma função de transformação que pode ser usada com listas, e quando a lista é solicitada pelo template ele executa essa função e adiciona o resultado ao template:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tFn&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bemtv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tListJoin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;tFn&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; br[] &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;template&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="s2"&gt;`List`&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;list&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;tListJoin&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="s2"&gt;`div[Users: $list ]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sempre que esta lista for alterada (ex: &lt;code&gt;$.list.push(item)&lt;/code&gt;), A Bemtv detectará e usará a função de transformação novamente e renderizará a alteração.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;As funções de transformação podem ser incrivelmente poderosas porque com &lt;code&gt;Brackethtml&lt;/code&gt; podemos até retornar a marcação com CSS-In-JS.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Router
&lt;/h2&gt;

&lt;p&gt;Um Router é usado para navegação entre visualizações de vários componentes em uma aplicação Bemtv, permite alterar a URL do navegador e mantém a UI sincronizada com a URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;router&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bemtv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="s2"&gt;`Home`&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="s2"&gt;`Hey!`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="s2"&gt;`AboutUs`&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="s2"&gt;`Hey Again!`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;render&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="s2"&gt;`MyPages`&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="s2"&gt;`
      #[] br[]br[] 
      Links: 
        #Home[Click to go home!]  
        #AboutUs[Click to know about us!]`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No exemplo acima, criamos duas rotas(Bemtv cria rotas automaticamente) e fornecemos um local para que elas sejam renderizadas &lt;code&gt;#[]&lt;/code&gt; e também criamos links &lt;code&gt;#Home[ Texto do link ]&lt;/code&gt;, tudo isso em poucas linhas!&lt;/p&gt;

&lt;h2&gt;
  
  
  Fechamento
&lt;/h2&gt;

&lt;p&gt;Esses são apenas alguns dos novos recursos da biblioteca, caso queira saber mais segue o link para o repositório do projeto: &lt;a href="https://github.com/diogoneves07/bemtvjs"&gt;&lt;strong&gt;Bemtv&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Obrigado por chegar até aqui!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>frontend</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Reactive templates “automagically”</title>
      <dc:creator>Diogo Neves</dc:creator>
      <pubDate>Wed, 26 Oct 2022 15:11:08 +0000</pubDate>
      <link>https://forem.com/diogoneves07/reactive-templates-automagically-32m9</link>
      <guid>https://forem.com/diogoneves07/reactive-templates-automagically-32m9</guid>
      <description>&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%2F9uplkub45gzzn7lm9ei5.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%2F9uplkub45gzzn7lm9ei5.png" alt="Bemtv logo" width="329" height="250"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One of the most talked about topics lately in the JavaScript universe is Reactive Programming,&lt;br&gt;
something we see somehow in major UI libraries and frameworks like React, Vue, Svelte, Solid, Angular and others.&lt;/p&gt;

&lt;p&gt;This article is not intended to explain &lt;a href="https://dev.to/this-is-learning/what-the-hell-is-reactive-programming-anyway-31p5"&gt;reactive programming&lt;/a&gt;, however, keep in mind that basically(in world of UI libraries/frameworks) whenever the state changes, the template is checked, updated, and the changes are applied to the DOM.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Obviously, each framework deals with this in its own way, some more reactive, others declarative, with VDOM, without VDOM...&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What if we tried to do the opposite of what these frameworks normally do? Instead of changing the state causing the template to be updated, the template itself checks to see if the state has changed and updates itself.&lt;/p&gt;

&lt;p&gt;At first it may seem strange, but this is the proposal of the Bemtv library.&lt;/p&gt;
&lt;h2&gt;
  
  
  A brief look
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Counter&lt;/strong&gt; component:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bemtv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;click$&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;css&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;render&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="s2"&gt;`Counter`&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;click&lt;/span&gt;&lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;css&lt;/span&gt;&lt;span class="s2"&gt;`
  padding: 20px;
  color: blue;
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="s2"&gt;`button[Cliked: $count ]`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It uses a &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Window/requestAnimationFrame"&gt;requestAnimationFrame&lt;/a&gt; loop to execute just the component template, thus getting the updated template to compare with the previous template to detect if there have been any changes and apply them to the DOM.&lt;/p&gt;

&lt;p&gt;We might think that this will overload the browser, however, there are best practices we should follow to avoid this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Everything inside the template must be strings, numbers or light calculations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The function that generates the template should only be used for this.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bemtv also uses a sophisticated system to determine if there have been any changes to the template, continues using the browser's repaint as a basis, but reduces the number of checks as the user interacts with the page and the time the component takes to generate the template, this makes Bemtv more efficient.&lt;/p&gt;

&lt;p&gt;Bemtv does its work at runtime, it has a markup language very similar to HTML basically reducing its redundancy and a CSS-In-JS library all integrated into the template, and a &lt;code&gt;Router&lt;/code&gt; full of syntactic sugars.&lt;/p&gt;

&lt;p&gt;Bemtv is currently &lt;strong&gt;not available for production&lt;/strong&gt; and its main goal is to be a tool for &lt;strong&gt;small web applications&lt;/strong&gt; that can be learned in minutes instead of hours.&lt;/p&gt;

&lt;h2&gt;
  
  
  And that’s it
&lt;/h2&gt;

&lt;p&gt;That's it for today, but you can find out more details on &lt;a href="https://github.com/diogoneves07/bemtvjs"&gt;project repository&lt;/a&gt; and if you like the idea, don't forget to leave your star, it encourages the development of the project, see you soon!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Templates reativos “automagicamente”</title>
      <dc:creator>Diogo Neves</dc:creator>
      <pubDate>Wed, 26 Oct 2022 14:56:51 +0000</pubDate>
      <link>https://forem.com/diogoneves07/templates-reativos-automagicamente-35ij</link>
      <guid>https://forem.com/diogoneves07/templates-reativos-automagicamente-35ij</guid>
      <description>&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%2F9uplkub45gzzn7lm9ei5.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%2F9uplkub45gzzn7lm9ei5.png" alt="Bemtv logo" width="329" height="250"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Um dos tópicos mais comentados ultimamente no universo JavaScript é a Programação Reativa,&lt;br&gt;
algo que vemos de alguma forma nas principais bibliotecas e frameworks de UI como React, Vue, Svelte, Solid, Angular e outros.&lt;/p&gt;

&lt;p&gt;Este artigo não pretende explicar &lt;a href="https://dev.to/this-is-learning/what-the-hell-is-reactive-programming-anyway-31p5"&gt;programação reativa&lt;/a&gt;, entretanto, tenha em mente que basicamente(no mundo das bibliotecas/frameworks de interface do usuário) sempre que o estado muda, o template é verificado, atualizado e as alterações são aplicadas ao DOM.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Obviamente, cada framework lida com isso à sua maneira, uns mais reativos, outros declarativos, com VDOM, sem VDOM...&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;E se tentássemos fazer o oposto do que esses frameworks normalmente fazem? Em vez de alterar o estado fazendo com que o template seja atualizado, o próprio template verifica se o estado mudou e se atualiza.&lt;/p&gt;

&lt;p&gt;A princípio pode parecer estranho, mas essa é a proposta da biblioteca Bemtv.&lt;/p&gt;
&lt;h2&gt;
  
  
  Um breve olhar
&lt;/h2&gt;

&lt;p&gt;Componente &lt;strong&gt;Counter&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bemtv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;click$&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;css&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;render&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="s2"&gt;`Counter`&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;click&lt;/span&gt;&lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;css&lt;/span&gt;&lt;span class="s2"&gt;`
  padding: 20px;
  color: blue;
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="s2"&gt;`button[Cliked: $count ]`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ela usa um &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Window/requestAnimationFrame"&gt;requestAnimationFrame&lt;/a&gt; loop para executar apenas o template do componente, obtendo assim o template atualizado para comparar com o template anterior para detectar se houve alguma alteração e aplicá-las ao DOM.&lt;/p&gt;

&lt;p&gt;Podemos pensar que isso sobrecarregará o navegador, no entanto, existem boas práticas que devemos seguir para evitar isso:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Tudo dentro do template deve ser strings, números ou cálculos leves.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A função que gera o template só deve ser usada para isso.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A Bemtv também utiliza um sistema sofisticado para determinar se houve alguma alteração no template, continua usando como base a repaint(repintura) do navegador, mas reduz o número de verificações à medida que o usuário interage com a página e o tempo que o componente leva para gerar o template, isso torna a Bemtv mais eficiente.&lt;/p&gt;

&lt;p&gt;A Bemtv faz seu trabalho em tempo de execução, ela possui uma linguagem de marcação muito parecida com HTML basicamente reduzindo sua redundância e uma biblioteca CSS-In-JS tudo integrado ao template, e um &lt;code&gt;Router&lt;/code&gt; cheio de açúcares sintáticos.&lt;/p&gt;

&lt;p&gt;Atualmente, Bemtv &lt;strong&gt;não está disponível para produção&lt;/strong&gt; e seu principal objetivo é ser uma ferramenta para &lt;strong&gt;pequenas aplicações Web&lt;/strong&gt;, que pode ser aprendida em poucos minutos ao invés de horas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fechamento
&lt;/h2&gt;

&lt;p&gt;Por hoje é só, mas você pode saber mais detalhes no &lt;a href="https://github.com/diogoneves07/bemtvjs"&gt;repositório do projeto&lt;/a&gt; e se gostar da ideia, não esqueça de deixar sua estrela, ela incentiva o desenvolvimento do projeto, até breve!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
