Hotwire: tecnologia HTML over the wire
(hotwired.dev)- Hotwire é uma abordagem para criar aplicativos web modernos enviando HTML em vez de JSON, buscando carregamento inicial rápido e boa responsividade com pouco JavaScript
- Como a renderização permanece em templates no servidor, é possível manter um fluxo de desenvolvimento simples independentemente da linguagem usada
- Os frameworks criados pela 37signals para o HEY se combinam para formar o ecossistema Hotwire, que vai da web a várias plataformas
- O componente central, Turbo, lida com transições de página, envio de formulários, divisão em componentes e atualizações parciais via WebSocket sem necessidade de escrever JavaScript
- Interações personalizadas que o Turbo não cobre são complementadas pelo Stimulus, e o Hotwire Native permite criar apps móveis nativos com base em apps web existentes
A abordagem de renderizar e enviar HTML a partir do servidor
- Hotwire é uma abordagem alternativa para construir aplicações web modernas no estilo HTML-over-the-wire
- Em vez de JSON, envia HTML pela rede, permitindo criar aplicações com pouco JavaScript
- Busca carregamento rápido da primeira página, manutenção da renderização com templates no lado do servidor e uma experiência de desenvolvimento mais simples e produtiva
- A proposta é não abrir mão da velocidade e da responsividade esperadas de aplicações tradicionais de página única
- HTML-over-the-wire também pode servir como referência para criar suas próprias ferramentas, ou você pode usar diretamente os frameworks Hotwire que a 37signals criou para o HEY
O papel de Turbo, Stimulus e Hotwire Native
- Turbo é o componente central do Hotwire
- Oferece técnicas complementares para lidar rapidamente com transições de página e envios de formulários
- Divide páginas complexas em componentes e transmite atualizações parciais da página por WebSocket
- Entrega esses recursos sem exigir escrita de JavaScript
- Stimulus é usado quando é necessário código personalizado que o Turbo sozinho não cobre
- O Turbo normalmente resolve pelo menos 80% das interações que tradicionalmente exigiam JavaScript
- O Stimulus permite lidar com estado e conexões de forma centrada em HTML
- Hotwire Native é um framework web-first para criar aplicativos móveis nativos
- Fornece as ferramentas necessárias para desenvolver apps móveis aproveitando um app web existente
1 comentários
Opiniões no Hacker News
Há uma versão menos divulgada desse recurso chamada htmx: https://htmx.org/
Ela permite fazer esse tipo de coisa com um único arquivo JavaScript e, embora eu tenha visto ser usada principalmente com backends em Go, parece bastante flexível. Estou pensando em experimentar há mais ou menos um ano
Só no último ano foram centenas de submissões no HN 0, e houve até posts que passaram de 1000 pontos. Já Hotwire teve menos de 30 submissões no último ano 1, e a mais popular delas é este post
Basta olhar rapidamente no YouTube para ver influenciadores de programação destacando htmx o tempo todo, com thumbnails mostrando o rosto
O Twitter também é muito ativo, aparece com frequência no canal do YouTube do The Primeagen e é bem popular
Se estiver procurando algo parecido em PHP/Laravel, recomendo fortemente Livewire: https://laravel-livewire.com/
Para projetos mais complexos, ainda uso React, mas poder escrever tudo em Blade/PHP mantendo elementos de UI reativos é sempre revigorante. Lembro de ter visto também um pacote que permite renderizar componentes React/Vue dentro do Livewire quando necessário: https://minglejs.unitedbycode.com/. Parece uma via de escape interessante quando é preciso trazer pacotes existentes
Antes eu era bem negativo em relação a Hotwire/Livewire, mas hoje os vejo como ferramentas adequadas dependendo do contexto
Enviar templates parciais pela rede é uma abordagem de hipermídia; é só que hoje em dia não criamos muito bem apps de hipermídia. Releli o artigo de REST do RTF junto com htmx e cheguei até aqui; não acho que hipermídia seja uma arquitetura intrinsecamente superior, mas ela é uma alternativa legítima entre várias, e é bom que continue evoluindo, ainda que lentamente
É provavelmente uma das formas mais fáceis de criar uma PWA sem cair no buraco sem fim de React/Vue/Svelte
Já usei esses também e acho ótimos, mas, comparados ao htmx, parecem mais centrados na experiência do desenvolvedor do que na tecnologia. A competição entre eles provavelmente vai depender, no fim, de qual se integra melhor a cada framework de backend
Pessoalmente, vejo PWA como um problema do cliente, e acho que deve ser tratado no lado do cliente, sem adicionar dependências ao servidor
A conversa no HN de 2020, mais próxima da época em que isso apareceu pela primeira vez, está aqui: https://news.ycombinator.com/item?id=25507942
Como posts relacionados, há Why Hotwire Could be the Future of Front-end Dev - https://news.ycombinator.com/item?id=26195969 - fevereiro de 2021, 6 comentários / Hotwire: A new old way to build web apps - https://news.ycombinator.com/item?id=25942864 - janeiro de 2021, 56 comentários
Dá a sensação de que quase demos uma volta completa. Lembro que, por volta de 2005 ou 2006, usávamos uma abordagem de interceptar cliques, anexar parâmetros e receber apenas fragmentos parciais de HTML renderizados, substituindo o corpo com
.innerHTMLO truque era manter uma requisição HTTP aberta continuamente e o servidor enviar atualizações de vez em quando; essas atualizações também eram HTML. Na época talvez nem desse para manipular o DOM, então podia ser literalmente uma página com uma tag que nunca fechava
Frameworks de renderização no servidor estão facilitando interações no cliente, e o React, por meio de RSC, está facilitando a renderização no servidor. Se for uma web app com altíssima interatividade, uma SPA ainda leva vantagem
Existem muitíssimos projetos SPA, mas isso não descreve todos os sites do mundo
A paginação foi implementada assim: ao rolar a página e clicar em “Show more”, a próxima página é solicitada ao servidor como um fragmento de HTML, carregada em um iframe invisível e, quando o carregamento termina, anexada à página atual
Considerando o quanto a web, JavaScript e TypeScript melhoraram nesse meio-tempo, é difícil me empolgar de novo com essa abordagem
Não trabalhei muito com web apps que exigem frontends altamente interativos, mas, em lojas de e-commerce e apps Rails internos, Turbo e Stimulus reduziram muito o volume de coisas que novos desenvolvedores precisavam aprender
Por exemplo, em um projeto Django, criamos rapidamente uma ferramenta interna completa com o confiável KnockoutJS, e isso tem certa afinidade com o espírito do HTMX. O ainda inicial Arrow.JS é parecido. A complexidade, especialmente a complexidade de UI, em geral foi algo que nós mesmos criamos; as formas antigas não estão nada obsoletas e, na verdade, estão voltando. Há uma geração de desenvolvedores jovens que entrou no setor na época mais tola, quando a indústria tentava convencer todo mundo de que toda aplicação web precisava virar um bloco excessivamente complexo e difícil de suportar
Uso o Hey pagando desde o lançamento, e, se a experiência da web app do Hey for o melhor exemplo de Hotwire, prefiro passar
Em conexões lentas, é ruim. Pode ser porque os desenvolvedores não colocaram estados de carregamento ou erro, pode ser pela alta complexidade, ou pode ser um bug do Hey. Não sei, mas não é bom
Com latência média a alta, o comportamento parece imprevisível ou bugado. Caixas sem conteúdo abrem, links não se comportam como esperado e, quando várias ações são feitas rapidamente em sequência, elas não são interrompidas de um jeito intuitivo. Simplesmente parece desencontrado
Por pior que SPAs sejam, isso parece um passo para longe de uma UI que pareça nativa e natural
O motivo de este artigo ter voltado a aparecer agora é que, na semana passada, alguém postou que o Hey demora para abrir um modal: https://x.com/noahflk/status/1795758603577545035
O Hey foi criado por DHH, e DHH também criou Hotwire e Rails. Depois disso, virou uma discussão acalorada, misturando a resposta de DHH de que o vídeo original foi gravado em uma rede limitada, reações dizendo que, se carregar um modal leva tempo, o Hotwire depende demais da rede, defesas de Rails/Hotwire e críticas à abordagem. Foi um grande assunto no Twitter na semana passada
O autor também escreveu que foi “deliberadamente deixado lento para demonstração”: https://x.com/noahflk/status/1795855075526471915. Ele disse que não queria mostrar a experiência de alguém com “um bom MacBook em SF e internet gigabit”, mas falar de alguém usando internet móvel lenta e um notebook barato. Também houve quem apontasse que a SPA do Google Calendar é muito mais lenta, e as únicas opções também não são “internet gigabit em SF” e “3G fortemente limitado”. A postagem original era muito enganosa e, na prática, quase uma mentira
A estrutura da página, em especial, me impressionou. Por exemplo, no overlay de menu de contexto, eles aplicavam a combinação
details/summary/anchorcomo aprimoramento progressivo, e, mesmo com JavaScript desativado ou com assets não carregados, o conteúdo do menu era carregado elegantemente em um layout simples. Também havia muitos outros usos cuidadosos de Web APIs, e lembro que o código do cliente quase não era ofuscado e vinha com source maps. Não sou fã do DHH nem pretendo acompanhar o drama daquela semana, mas, desta vez, senti que a 37signals fez direitoHá 2 anos criei o Swap JS, uma implementação mais minimalista da mesma ideia: https://github.com/josephernest/Swap
Usei em alguns projetos e funciona bem