HTMX é tão legal que eu fiz o meu próprio (2024)
(dbushell.com)- HTMX é uma abordagem que melhora o frontend de forma progressiva com foco em HTML renderizado no servidor, evoluindo a partir do jeito de fazer as coisas antes de UIs JavaScript modernas no estilo React incharem demais
- Ao trocar SvelteKit por DinoSsr na refatoração do servidor de um podcast web app auto-hospedado, surgiu o problema de a navegação entre páginas interromper a reprodução de áudio, e com HTMX foi possível atualizar apenas a área `` e manter o componente de áudio
- HTMX é distribuído como uma biblioteca de frontend, mas boa parte da implementação fica nos templates e na configuração do backend, e requisições HTTP que retornam HTML acabam funcionando, na prática, como a API do HTMX
- Os atributos
hx-*, o exemplo de `` clicável e exemplos avançados com muito JavaScript inline mostram limitações dos templates declarativos com atributos e pontos de incômodo na documentação - A mini implementação própria usou cache com
304, a History API, substituição de `` e preload baseado em eventos de ponteiro como elementos principais, resultando em menos JavaScript no navegador e em um codebase menor e mais simples
O lugar do HTMX
- HTMX rejeita a UI JavaScript moderna e prefere HTML renderizado no servidor, sendo uma abordagem que evoluiu a partir do modo de desenvolvimento anterior ao inchaço do frontend com React
- Scroll infinito e resultados de busca em tempo real são exemplos populares de HTMX, e embora ele pareça limitado por não tentar resolver todos os problemas que React e afins tentam resolver, dentro desses limites é uma ferramenta de grande valor
- HTMX não é uma “magic bullet”, e o ponto principal é a visão de que algumas das ideias por trás do HTMX são mais importantes do que o próprio HTMX
Experimento
- Ler a documentação não foi suficiente, então foi testado o uso real, e a refatoração do servidor do podcast web app auto-hospedado virou o alvo da aplicação de HTMX
- A implementação anterior usava SvelteKit, que é uma ferramenta preferida, mas pode ser pesada para sites pequenos
- O alvo da substituição era o DinoSsr, que o autor estava criando por conta própria e que também é usado no mesmo projeto para build de site estático e para servir um blog de bookmarks
- O DinoSsr é principalmente orientado ao lado do servidor e pode fornecer componentes como “islands” de frontend, mas não é estruturado para oferecer interação de página inteira
- O componente de player de áudio precisava ser mantido durante a navegação entre páginas, e quando a navegação recarregava a página inteira a experiência de reprodução terminava rapidamente
- O SvelteKit cuidava das atualizações de UI e do roteamento no frontend, mas na nova build apenas o componente do player de áudio usa JavaScript no frontend, e o DinoSsr intencionalmente não tenta fazer roteamento no lado do cliente
- Algumas páginas diferem apenas na seção ``, então, ao melhorar os links progressivamente com HTMX e atualizar só essa área, foi possível manter o componente de áudio sem recarregar a página inteira
- A aplicação de HTMX funcionou bem, mas logo depois o HTMX foi removido e substituído por uma versão mínima feita à mão com a mesma ideia
Algumas ideias sobre HTMX
- Nesse experimento, o HTMX foi um substituto para o Svelte no frontend, mas não um substituto de encaixe imediato como o React, e sim uma grande mudança de mentalidade
- HTMX é distribuído como uma biblioteca JavaScript para melhorar o frontend de forma progressiva, mas a maior parte da implementação acontece no backend, em uma estrutura em que os templates e a configuração do servidor precisam ser preparados manualmente
- Requisições HTTP que servem HTML funcionam na prática como a API do HTMX, e detalhes como configurar cabeçalhos HTTP são importantes para o cache correto
- Há os atributos padrão
data-*e odataset, então usar atributos com prefixo não padrãohx-*é uma pequena reclamação - A documentação do HTMX tem muitos exemplos com ``, e o exemplo abaixo é uma estrutura em que, quando o usuário clica em uma
div, é enviada uma requisiçãoPUTpara/messagese a resposta é carregada nessa mesmadiv
Put To Messages
- Há críticas de que exemplos em que o usuário precisa clicar em um elemento `` não são desejáveis
- Alguns exemplos avançados de HTMX que usam JavaScript inline ficam meio bagunçados e mostram os limites de templates declarativos baseados em atributos
- Independentemente das críticas, HTMX oferece um conjunto de recursos limitado, porém útil, e é uma ferramenta capaz de melhorar muitos padrões comuns de web design
Fazer o próprio
- Logo depois de adicionar HTMX com sucesso, ele foi removido e substituído por uma implementação mínima feita à mão usando as mesmas ideias
- Para permitir requisições
fetchcom cache, foram usados os cabeçalhos HTTPlast-modified,if-modified-sincee respostas304 - A integração básica com histórico usou
pushStateepopstate - Foi adicionado código para extrair e substituir o elemento ``, e, inspirado pela extensão preload do HTMX, também foi embutido preload baseado em eventos de ponteiro
- O preload baseado em eventos de ponteiro inicia a requisição
fetchantes de o eventoclickacontecer, oferecendo um pequeno ganho de desempenho - O código-fonte experimental é bem básico, mas mostra que a quantidade de JavaScript realmente necessária no navegador é pequena
- Com HTMX ou com a abordagem “we have HTMX at home”, o resultado foi um codebase muito menor e mais simples
JavaScript de frontend
- Templates e componentes são praticamente necessários para organização e reutilização de código, a menos que o site seja muito pequeno, e isso também pode ser implementado no lado do servidor com PHP, Ruby, Go, JavaScript etc.
- Não é necessário duplicar essa estrutura no navegador nem implementá-la apenas no navegador, mas muitos desenvolvedores deixaram de fazer essa pergunta por causa da popularidade de React e similares
- O cansaço com JavaScript de frontend é real e se conecta à experiência de preferir templates de servidor mais antigos enquanto, ao mesmo tempo, se superprojeta UI em JS
- Mesmo que o HTMX em si não seja visto como algo tão excelente, sua filosofia ainda é uma abordagem valiosa o bastante para envergonhar desenvolvedores modernos de JavaScript
1 comentários
Comentários do Lobste.rs
É uma implicância pequena, mas não gosto muito de usar atributos HTML com prefixo
hx-*onde daria para usardata-*O htmx já suporta há muito tempo o prefixodata-Quanto ao ponto de que não se deve fazer o usuário clicar em um `` elemento, o melhor é usarhx-boostdo htmx em tags de âncora e formulário. Ele aprimora automaticamente essas tags da forma correta, então dá para evitar divs clicáveis É um projeto que mostra o quão pouco JavaScript o navegador realmente precisa, e parece que daqui para frente a manutenção será mínima, com quase nenhuma necessidade de patches de segurança. É algo a se comemorarO HTMX não sobrecarrega o servidor por renderizar tudo? Passa uma sensação parecida com os problemas de CGI de antigamente
Por motivos parecidos, estou usando alpine-ajax, que é muito semelhante ao htmx
alpine-ajax. Se eu fosse começar de novo com a ideia de “obter as vantagens de uma SPA a partir de SSR”, provavelmente iria por esse caminho Até porque já estou usando alpine para os recursos reativos no cliente. Só que, no momento, já há bastante htmx no repositório e também não tenho nenhuma reclamação do htmx