Entenda o Hotwire: O Que Ele Faz Diferente do HTMX?

Hotwire
12 de novembro de 2024

Ao navegar pelo mundo do desenvolvimento front-end moderno, muitas ferramentas prometem simplificar a criação de interações dinâmicas sem sobrecarregar o desenvolvedor com códigos Javascript complexos.

Por essa razão, o HTMX tem se tornado popular. Com ele é possível atualizações dinâmicas em partes específicas da página sem recarregar completamente. Mas o que torna o Hotwire diferente? E como ele pode substituir o que você já conhece no HTMX?

Neste artigo, vamos explorar o Hotwire, destacando suas particularidades e diferenças em relação ao HTMX. Se você já usa HTMX, prepare-se para conhecer uma nova abordagem que promete otimizar ainda mais o desenvolvimento web no Rails.

O que eles tem em comum?

Ambos reconhecem as vantagens de uma abordagem centrada em HTML. Isso contrasta com os inúmeros frameworks de Single Page Application (SPA) em JavaScript que implementam o padrão fat client no navegador, tratando o HTML apenas como um meio de renderização.

Por outro lado, tanto o Hotwire quanto o HTMX reconhecem que o HTML se torna mais poderoso quando é utilizado como o mecanismo de transferência de dados. Os princípios por trás do design do HTML como uma tecnologia que prioriza o processamento pelo backend são antigos, mas ainda muito válidos. O HTML evoluiu muito, e a combinação HTML5 + CSS nos navegadores modernos é muito poderosa. No entanto, ainda não é suficiente para construir aplicações interativas modernas e ricas – está quase lá, mas ainda falta um pouco.

É justamente assim que Frameworks como Hotwire e HTMX buscam preencher essa lacuna, permitindo que o HTML renderizado no servidor ofereça uma experiência de usuário moderna. Eles são implementados em JavaScript, mas foram projetados para exigir o mínimo possível de JavaScript personalizado na aplicação. No fim das contas, isso torna a construção da maioria das aplicações web modernas muito mais simples e rápida de ser feita.

A filosofia por Trás do Hotwire

Diferente do HTMX, o Hotwire foi criado com um foco específico no ecossistema Rails. Ele é composto por três partes principais: Turbo Drive, Turbo Frame e Turbo Stream. Cada uma dessas partes permite atualizações no cliente sem a necessidade de JavaScript adicional, mas com abordagens diferentes daquelas que encontramos no HTMX.

Turbo Drive: Melhor Navegação com Menos Recarregamento

Com o Turbo Drive, o Hotwire intercepta as navegações tradicionais no site e evita recarregamentos completos da página. Isso proporciona uma navegação semelhante a uma aplicação single-page, sem a complexidade de um framework front-end.

No Rails, por padrão, ele automaticamente interceptará as requisições de links e formulários. Por exemplo:

<a href="/produtos">
  Lista de Produtos
</a>

Neste caso, ao clicar, o Turbo Drive carregará o conteúdo sem recarregar a página inteira. No HTMX, você precisaria configurar manualmente cada link ou formulário que deseja atualizar de forma dinâmica, algo como:

<a href="/produtos" hx-get="/produtos" hx-target="#conteudo">
  Lista de Produtos
</a>

Neste exemplo, podemos ver como o HTMX exige que você especifique o hx-get e o hx-target em cada elemento, enquanto o Turbo Drive aplica globalmente a interceptação, de forma transparente e sem parâmetros adicionais obrigatórios.

Turbo Frame: Componentes e Interatividade

O Turbo Frame temos uma forma de carregar e atualizar partes específicas da página sem grandes Javascript extensos.

Esse conceito é similar ao hx-target do HTMX, mas com uma integração mais profunda e transparente em seus projetos Rails. Basta envolver o conteúdo que deseja atualizar dinamicamente em um turbo-frame e ao realizar as requisições a mágica acontece.

<turbo-frame id="comentarios">
  <%= render @comentarios %>
</turbo-frame>

Ao atualizar o conteúdo desse frame, através da resposta de uma requisição, você pode enviar respostas parciais do servidor, contendo apenas o trecho a ser atualizado, mantendo assim a interatividade.

Se estivéssemos utilizando o HTMX, seria necessário configurar hx-target e hx-swap, como no exemplo a seguir:

<div id="comentarios" hx-get="/comentarios" hx-trigger="load" hx-target="#comentarios">
  <!-- conteúdo dos comentários -->
</div>

O HTMX exigirá configuração manual para cada interação que você realizar.

Turbo Stream: Reatividade em Tempo Real

O Hotwire utiliza o Turbo Stream para cenários onde atualizações em tempo real são necessárias, como notificações, atualizações de feed e chat. Turbo Streams são altamente eficientes, permitindo que o servidor envie atualizações automáticas para o cliente.

Por exemplo, ao adicionar um novo comentário, você pode aplicar o Turbo Stream na resposta servidor, de forma parecida ao exemplo a seguir:

<%= turbo_stream.append "comentarios" do %>
  <%= render @comentario %>
<% end %>

Isso adicionará o novo comentário automaticamente ao div com o id comentarios. No entanto, caso você estivesse utilizando HTMX, você precisaria configurar chamadas específicas para verificar o servidor periodicamente, para obter um comportamento de atualização similar ao do Turbo Stream.

<div id="comentarios" hx-sse="connect: /comentarios">
  <!-- comentários aparecerão aqui -->
</div>

Mas isso não seria tão performático, quando apenas uma atualização on-demand. Para replicar a funcionalidade de atualização em tempo real, o HTMX exige configurações mais avançadas com SSE (Server-Sent Events) ou WebSockets. Isso não é algo trivial, principalmente se você estiver começando no mundo do desenvolvimento web, então será uma complexidade extra que não é necessária no Rails.

A Experiência de Desenvolvedor com Rails

Minha opinião é de que se você já está usando Rails, o Hotwire é uma extensão natural do framework. Ele simplifica a estrutura de suas aplicações e foi projetado para aproveitar ao máximo as convenções do Rails.

O HTMX, por outro lado, por ser concebido para ser usado em qualquer stack, tem um propósito mais generalista. O que acaba refletindo em suas configurações adicionais necessárias para seu funcionamento.

Pelo fato do Hotwire estar em sinergia com o Rails, ele oferece uma curva de aprendizado mais suave, especialmente para quem já conhece o framework. Um formulário de criação de produtos, aplicando o Hotwire ficaria assim:

<%= form_with model: @produto, data: { turbo_frame: "produtos" } do |form| %>
  <%= form.text_field :nome %>
  <%= form.submit "Salvar" %>
<% end %>

Neste cenário o turbo_frame automaticamente cuida do redirecionamento e atualização da lista de produtos. Simples assim!

Se formos comparar com o HTMX, seria necessário definir atributos para gerenciar o comportamento do formulário, o target, para somente depois atualizar a lista após o envio. Apesar de ambas ferramentas serem poderosas, elas têm abordagens diferentes.

Se você já usa HTMX, vale a pena experimentar o Hotwire para ver como ele pode simplificar ainda mais o desenvolvimento de seus projetos.

4 min. de leitura
Top