10 pontos por xguru 2024-10-10 | Ainda não há comentários. | Compartilhar no WhatsApp
  • As pessoas falam do htmx como se ele estivesse salvando a web das SPAs
  • O criador do htmx, Carson Gross, descreve essa dinâmica com humor como a "dialética hegeliana":
    • tese (thesis): MPA tradicional
    • antítese (antithesis): SPA
    • síntese (synthesis): uma aplicação composta por ilhas interativas baseadas em hipermídia
  • Mas eu não enxerguei isso e, algum tempo atrás, "criei uma SPA com htmx"
  • É uma PoC de um app simples de lista de tarefas
    • depois que a página carrega, ela não se comunica mais com o servidor
    • tudo é processado localmente no cliente
    • se o foco do htmx é gerenciar trocas de hipermídia pela rede, como isso funciona?
    • um truque simples: o código "server-side" roda dentro de um Service Worker

Service Worker

  • Atua como um proxy entre a página web e a internet
  • Pode interceptar e manipular requisições de rede
  • Pode modificar requisições, armazenar respostas em cache para uso offline e gerar novas respostas sem enviar a requisição para fora do navegador
  • Essa última capacidade é o ponto central desta aplicação de página única
  • Quando o htmx faz uma requisição de rede, o Service Worker a intercepta
  • Em seguida, o Service Worker executa a lógica de negócio e gera novo HTML
  • O htmx substitui o DOM com o novo HTML

Vantagens em relação a uma SPA tradicional

  • O Service Worker precisa usar IndexedDB como armazenamento
  • Isso preserva o estado entre carregamentos de página
  • Mesmo que você feche a página e volte depois, o app lembra os dados
  • Esse é um benefício colateral que vem "de graça" ao escolher essa arquitetura
  • Também é fácil fazer com que funcione offline

Desvantagens

  • O suporte das ferramentas de desenvolvedor é ruim
    • console.log é perdido de forma intermitente
    • os relatórios sobre a instalação do Service Worker não são confiáveis
  • Falta suporte a módulos ES no Firefox
    • todo o código precisa ficar em um único arquivo
  • A experiência geral de desenvolvimento "não é divertida"

Ainda assim, a SPA com htmx funciona bem


Detalhes de implementação

  • O HTML base é a estrutura vazia da aplicação de página única
  • A tag <body> configura o corpo do app usando htmx
    • hx-boost="true": instrui o htmx a substituir respostas de cliques em links e envios de formulário via Ajax, sem navegação de página inteira
    • hx-push-url="false": impede que o htmx altere a URL com base em cliques em links e envios de formulário
    • hx-get="./ui": instrui a buscar a página em /ui ao carregar e substituí-la
    • hx-target="body": instrui a substituir o resultado no elemento <body>
    • hx-trigger="load": instrui a executar tudo isso no carregamento da página

Endpoint /ui

  • Retorna a marcação real do app
  • Depois disso, o htmx controla links e formulários para torná-lo interativo
  • O Service Worker trata o roteamento das requisições com uma biblioteca estilo Express
    • setFilter e listTodos são funções simples que encapsulam o IDB Keyval
    • O componente App é composto por formulário de filtro, lista de tarefas e formulário de adição

Endpoint /todos/add

  • Salva a tarefa e retorna uma resposta com a UI renderizada novamente
  • O htmx substitui a resposta no DOM

Componente Todo

  • É composto por checkbox, botão de exclusão e texto da tarefa
  • O checkbox dispara uma requisição para /todos/${id}/update
  • O botão de exclusão dispara uma requisição de remoção para /todos/${id}
  • O texto da tarefa tem dois estados: "normal" e "editing"
    • o htmx escuta o evento de duplo clique
    • faz uma requisição para /ui/todos/${id}?editable=true
    • o Service Worker retorna o HTML de Todo com um <input> incluído
    • o htmx substitui o item de tarefa atual pelo HTML da resposta

Resumo

  • Tecnicamente, funciona
  • É uma boa ideia? Será mesmo o auge das aplicações baseadas em hipermídia? Devemos abandonar o React e construir assim?
  • Em um app totalmente local, a indireção do htmx parece mais um peso do que algo libertador
  • A maioria dos apps não é totalmente local
  • O padrão de "ilhas interativas (islands of interactivity)" parece melhor do que dividir o código "server-side" entre o Service Worker e um servidor real
  • Foi uma tentativa experimental de mostrar a construção de uma aplicação de página única totalmente local com hipermídia

Ainda não há comentários.

Ainda não há comentários.