Web Components são aceitáveis
(nolanlawson.com)- O debate sobre web components não é uma questão de escolher apenas entre desempenho máximo e padrões da plataforma, e já parte de uma premissa exagerada ao supor que eles precisam substituir todos os frameworks JavaScript
- Custom Elements têm overhead por usarem o DOM como interface, mas em produtos reais é preciso avaliar não só desempenho, como também manutenibilidade, segurança, usabilidade e acessibilidade
- O custo de suporte a web components pelos frameworks pode ser absorvido com algumas verificações simples, e o fato de algo ser um recurso padrão não significa que todo framework precise adotá-lo obrigatoriamente
- Web components têm pontos fracos em server-side rendering (SSR), acessibilidade e parte da interoperabilidade, então ainda existem situações em que React, Solid e Svelte são mais adequados
- Em ambientes como o da Salesforce, com apps renderizados no cliente, marketplaces de componentes e forte necessidade de retrocompatibilidade de longo prazo, web components podem ser uma escolha prática
O ponto de partida do debate e a posição do autor
- O debate recente segue a partir de “Web Components Are Not the Future”, de Ryan Carniato, e “Web Components Are Not the Future — They’re the Present”, de Cory LaViska
- O ponto central não é atacar o lado oposto, mas sim saber se desenvolvedores com restrições diferentes conseguem encontrar um terreno em comum
- Ryan Carniato é muito respeitado por seu trabalho com o Solid e com desempenho e arquitetura de frameworks, como aparece no
js-framework-benchmark - Web components também têm um campo real de uso, ligado à implementação de frameworks, criação de componentes, ao Web Components Community Group, ao grupo Accessibility Object Model e ao trabalho com shadow DOM, custom elements e acessibilidade
Desempenho: o custo do DOM é real, mas não é tudo
- A fraqueza básica dos web components é o fato de serem baseados em Custom Elements
- Como toda interface precisa passar pelo DOM, surge um overhead de desempenho
- Se o objetivo for o framework absolutamente mais rápido, é preciso reduzir ao máximo os nós DOM, e nesse critério web components ficam em desvantagem
- Ainda assim, desempenho não é o único critério no desenvolvimento de software
- Manutenibilidade, segurança, usabilidade e acessibilidade também precisam ser consideradas
- Não renderizar atributos
aria-*pode tornar a renderização do DOM um pouco mais rápida, mas eles podem ser necessários para uma interface acessível - Micro-otimizações como usar
forem vez de.forEach()ouvarem vez deconst/letnormalmente não compensam o custo
- Minimizar nós DOM é a ideia central da virtualization
- Mesmo que não seja a opção mais rápida, uma abordagem mais simples pode ser suficiente
components as elementstambém não é o ideal em termos absolutos, mas nem sempre o objetivo precisa ser o ideal
- Usar juntos custom elements feitos com frameworks diferentes também faz sentido no trabalho real
- Pode ser necessário migrar gradualmente do Framework A para o Framework B
- Também pode haver casos em que vários micro frontends precisem ser combinados
- Não é a interface mais rápida, mas pode ser o trade-off necessário
- Em desempenho web real, são mais comuns pontos de melhoria de baixo custo como layout thrashing, waterfall de rede e rerenderizações desnecessárias
- Competições como
js-framework-benchmarksão interessantes para autores de frameworks, mas nem sempre são decisivas em produtos comuns - Se cada milissegundo importa em um ambiente com recursos limitados, abandonar web components também pode ser uma escolha válida
- Competições como
Custo de suporte em frameworks e liberdade de escolha
- O autor não concorda com a ideia de que oferecer suporte a web components seja um custo excessivo para quem escreve frameworks
- A detecção de props e attributes pode ser resolvida com a verificação
prop in element - Gerar web components pode ser doloroso, mas não é algo que todo framework seja obrigado a fazer
- O Vue 2 usava uma web component wrapper library separada, e o Remount existe sem participação da equipe do React
- A detecção de props e attributes pode ser resolvida com a verificação
- Dá para criar frameworks excelentes mesmo ignorando recursos adicionados à plataforma web depois de 2011
- O jQuery v1 ainda funciona em muitos sites
- Como equipes de desempenho dos navegadores otimizam padrões antigos usados por desenvolvedores web, código velho pode até ficar mais rápido em navegadores novos
- Escolher adotar recursos modernos da plataforma web traz novas considerações
- Recursos como
Symbol,Proxye Promises entram na mesma categoria - Graças à retrocompatibilidade da web, código escrito hoje pode continuar funcionando daqui a 10 anos
- Recursos como
- Também é perfeitamente possível haver frameworks que não se interessam por web components ou não querem dar suporte a eles
- É possível construir toda a UI com web components
- Também dá para misturar apenas alguns HTML web components
- Também é possível não usar nenhum
- Um framework “sem web components” também pode conquistar fãs
Padrões são referência, não obrigação
- Quando um recurso vira padrão, desenvolvedores passam a usá-lo como base de comparação
- Quem cria componentes precisa decidir se seu
<slot>deve funcionar como o<slot>nativo - Também é preciso escolher entre usar
IntersectionObserverou<img loading="lazy">, ou criar uma abstração própria
- Quem cria componentes precisa decidir se seu
- Padrões oferecem um ponto de referência comum e um vocabulário compartilhado
- Eles criam um critério para comparar e contrastar abordagens diferentes
- Mas ser padrão não significa que o recurso precise ser usado obrigatoriamente
- A web mantém lado a lado recursos opcionais e APIs antigas
- APIs depreciadas como
document.domain,withe<frame>continuam sendo suportadas - Os recursos da plataforma web podem ser escolhidos ou deixados de lado
- APIs depreciadas como
Onde web components servem — e onde não
- Web components fazem muitas coisas bem, mas não são uma ferramenta para substituir todos os frameworks JavaScript
- Entre seus pontos fracos estão server-side rendering (SSR), acessibilidade e parte da interoperabilidade
- Ainda há muitas situações em que frameworks como React, Solid e Svelte brilham mais
- Dizer que “web components não são o futuro” pode fazer sentido para certos desenvolvedores ou projetos
- No fundo do debate está o fato de pessoas diferentes estarem construindo coisas diferentes sob restrições diferentes
O caso Salesforce e o julgamento prático
- A Salesforce mostra um ambiente em que web components podem se encaixar bem
- Ela cria apps renderizados no cliente
- Tem seu próprio marketplace de componentes
- Precisa de garantias rígidas de retrocompatibilidade
- Seu horizonte de suporte é medido em anos e, em alguns casos, em décadas
- Fora dessas condições, talvez não seja necessário construir toda a UI com web components, shadow DOM e toda a estrutura associada
- Na plataforma web coexistem jogos, projetos artísticos e apps SaaS corporativos feitos com recursos variados como WebGL, Wasm e Service Workers
- Quando novos recursos são adicionados à plataforma, em vez de limitar a criatividade, eles ampliam as possibilidades de expressão de formas antes inimagináveis
- Como leituras complementares, o autor também recomenda o texto de Lea Verou e o texto de Baldur Bjarnason
1 comentários
Opiniões do Hacker News
Tentei entender o texto citado “Web Components Are Not the Future”, mas não havia muitos argumentos convincentes
O estado atual dos frameworks de front-end é uma bagunça, e não quero aprender mágica (
useState,createSignaletc.) que não dá para entender antes de ler frameworks ou documentações complexasComeçar por Web Components parece intuitivo, e eles também trazem capacidades que não existem em outros lugares, como o isolamento do Shadow DOM
Acho que a única coisa a preservar da era React é o JSX, e criei uma biblioteca para usar Web Components junto com JSX: https://webjsx.org
Fica ambíguo se a pessoa não quer aprender o framework em si, se quer algo que pareça mágico a ponto de não precisar aprender, ou se quer ou não ler a documentação
Tenho usado principalmente Vue, e o ecossistema de SPA é complexo, mas também não sei que outro sistema seria possível para gerenciar aplicações cliente com estado complexo
O padrão básico do jQuery é centrado em efeitos colaterais, selecionando elementos e alterando-os, enquanto React ou Vue.js permitem criar componentes cuja UI é determinada por dados de estado
Quando os dados mudam, a atualização ocorre com o mínimo de alterações no DOM, e esse modelo torna widgets de UI, dependendo do contexto, muito mais legíveis e fáceis de manter
Hoje, sites e aplicações desktop baseadas na web são muito mais complexos do que há 20 anos, então, se você não estiver criando apenas UIs simples, a inovação no gerenciamento de estado é importante
useStatefunciona internamente, e a forma de aplicá-lo é bastante intuitivaEm contraste, a biblioteca apresentada parece exigir desde o início um modelo mental mais complexo
Embora seja ideal entender profundamente os detalhes de um framework, o React foi bem-sucedido justamente por permitir criar aplicações bastante sofisticadas sabendo muito pouco sobre seu modelo interno
Talvez seja porque sou desenvolvedor desde a época beta do C# e desde o início de HTML/JS/CSS, mas entendi rapidamente
Escolhemos Angular ao substituir um portal central de gerenciamento de infraestrutura antigo e complexo; ele ficou estável, rápido, bonito, e todos ficaram satisfeitos
A “curva de aprendizado íngreme” parece vir principalmente de desenvolvedores que entraram no setor sabendo apenas JavaScript e um pouco de React; com mais experiência, dá para aprender na hora
useStateconsegue chegar a uma resposta lógica e correta em poucos segundosNão é complicado nem mágico, e uma implementação mínima parecida com hooks do React cabe em algumas centenas de linhas
Implementações básicas de
useStateerunFunctionComponentsão mais fáceis do que a maioria dos trabalhos do 3º semestre de Ciência da Computação na universidadeSe isso é o critério para magia, então estamos cercados de Warlocks de nível 20 criando novas Eldritch Invocations até durante o café da manhã
Acho que um dos motivos pelos quais as pessoas se desencontram nesse debate é que estão otimizando para coisas diferentes
Se você está em uma startup financiada por VC, movendo-se rápido e criando um produto central que continuará sendo mantido, um framework pode fazer sentido
Mas, em um laboratório acadêmico, não há muito dinheiro para manter aplicações já criadas, e elas precisam continuar funcionando mesmo depois que o financiamento passa para novos projetos
Estou quase terminando de reescrever uma aplicação Vue como Web Components, porque as dependências haviam apodrecido a ponto de ser impossível atualizá-las
Antes eu gastava tempo consertando o inferno de dependências, e continuaria fazendo isso; experimentei Web Components, gostei de imediato e fiz a migração
As dependências caíram de cerca de 15 para cerca de 1 (d3js), e não me arrependo
Aplicação antiga https://bam.iobio.io/, nova aplicação https://bam2.iobio.io/
Ninguém obriga você a atualizar um framework sempre para a versão mais recente, então teria sido possível simplesmente permanecer na versão do Vue que já usava
Sem um motivo especial, talvez fosse aceitável usar a mesma versão até o fim
Isso não quer dizer que Vue fosse necessário para esse caso de uso desde o início, nem que remover dependências tenha sido uma má escolha, mas, se você gosta de Vue, não parece haver uma força obrigando a ficar na versão mais recente
Fico curioso se o motivo de o Vue exigir dependências adicionais está no sistema de build
Por isso não entendo bem por que o ecossistema de VC não conseguiria sobreviver sem frameworks
Gosto do fato de o Svelte dar suporte à criação de Web Components por meio da Custom Elements API
Como o Svelte compila para JS/HTML/CSS comuns, é natural criar componentes reutilizáveis que funcionam em qualquer framework ou em JS vanilla: https://svelte.dev/docs/custom-elements-api
Acompanho a discussão sobre Web Components há anos, mas, como desenvolvedor full-stack, ainda não sei bem o que eles podem fazer para melhorar minha vida
A maioria destes exemplos basicamente colocava dados em HTML como templates, e isso já dá para fazer com handlebars
Será que estou deixando passar alguma coisa?
Se você usa HTML como documento, Web Components permitem adicionar recursos de interação em tempo real mais sofisticados
Exemplos disso são emuladores de terminal conectados a WebSocket, seletores de data, elementos de formulário personalizados, mapas, tabelas de dados, widgets de abas e aqueles componentes personalizados que o antigo jquery-ui oferecia
Dá para fazer sem Web Components, mas, ao criar como componentes personalizados, o HTML fica muito mais limpo e continua com cara de documento
Seria bom ter uma biblioteca consistente de Web Components, e parece que também dá para fazer um chat em tempo real bem decente com HTMX e eventos enviados pelo servidor
O navegador isola todo o HTML, CSS e JS sem gambiarras extras
É bom poder criar um Web Component, definir claramente as APIs de JS, HTML e CSS em termos de variáveis e então colocá-lo em qualquer ambiente sem quebrar, ou sem precisar criar um labirinto de namespaces CSS complexos e dependências de frameworks
Por exemplo, você pode adicionar recursos como filtragem ou ordenação por arrastar e soltar com um Web Component que envolve uma tabela; se o JS estiver desativado ou falhar ao carregar, o usuário ainda recebe a tabela e o conteúdo básicos
Antigamente isso era muito melhor do que a tela branca dos frameworks de front-end, mas hoje a renderização do lado do servidor está amplamente disponível, então a vantagem diminuiu
O encapsulamento de estilos também é bom, mas hoje bibliotecas de UI headless e scoped styles dos frameworks são comuns, então parece menos urgente do que há 10 anos
Porém, para usar slots é preciso optar pelo Shadow DOM, então é irritante não poder estilizar seus próprios componentes reutilizáveis simplesmente colocando uma folha de estilos na página
Se uma demo mostra 200 linhas de ajuste manual do DOM, fica difícil dizer que Web Components são o futuro
Isso é tudo; para a maioria dos outros propósitos, eles são bem ruins
Além disso, dá para publicar um componente de UI que funcione em todos os frameworks sem criar 7 versões dele
A pior parte dos Web Components e do Shadow DOM é que eles podem fazer extensões de navegador funcionarem mal ou simplesmente não funcionarem
Os fornecedores de navegadores também não parecem ter pressa para corrigir essa situação
Vejo que um dos maiores “erros” dos Web Components foi tê-los associado ao Shadow DOM na cabeça das pessoas
No desenvolvimento de apps, se você se mantém no DOM vivo, Web Components se tornam uma opção muito leve e fácil
Você pode continuar usando as ferramentas de CSS que quiser, como bootstrap, tailwind etc., e ainda obter excelente encapsulamento funcional quase sem custo, especialmente usando algo como lit-html como renderizador
As equipes em geral acharam trabalhar com Web Components nativos algo revigorante, e desenvolvedores vindos do mundo dos frameworks, depois de cerca de uma semana de adaptação, não queriam voltar
Só com propriedades simples de classe e uma chamada manual da função de renderização em
set(), dá para obter os benefícios da reatividade sem a burocracia dos frameworksO problema é que quase não há material mostrando como começar no “modo fácil”
A maioria dos materiais introdutórios empurra a pessoa direto para tecnologias dolorosas como Shadow DOM e CSS parts, mais voltadas a autores de bibliotecas do que a desenvolvedores de apps
Acho que eu deveria escrever um guia tipo “The Good Parts” sobre como Web Components podem facilitar a vida
Como alternativa, há os “HTML web components”, que usam apenas o DOM vivo, priorizam renderização no servidor e são bons como substitutos do “tempero de jQuery”: https://adactio.com/journal/20618
Também há o “Shadow gristle”, que usa Shadow DOM o mínimo possível e deixa no DOM vivo aquilo que precisa de estilização ou composição: https://glazkov.com/2023/03/02/shadow-gristle/
Essa tecnologia parece ser tanto uma bênção quanto uma maldição, dependendo de como é usada, então estou reunindo materiais e comentários relacionados
O melhor ponto é não cair no inferno de dependências a cada duas semanas
A interoperabilidade é a maior vantagem do ponto de vista do usuário, mas acho que se subestima o fato de que, em troca, surge um custo de performance: cada componente usado pode trazer junto um runtime desnecessário
Usar um framework como Lit junto com Web Components é a abordagem recomendada e, com o tempo, à medida que surgem novos frameworks e componentes ficam presos a versões antigas, esse custo se acumula
Eu não recomendaria a ninguém uma direção em que uma página tenha várias bibliotecas duplicadas e, se isso fizer parte das boas práticas, não é bom no longo prazo
Depois de ver por anos textos, redes sociais e vídeos de defensores de Web Components — e eu deveria ser exatamente o público-alvo —, vejo que, além do imposto da interoperabilidade, há uma série de desvantagens que os frameworks mainstream não têm
Dentro do ecossistema de cada framework, a interoperabilidade funciona bem, e a mesma dinâmica que faz desenvolvedores buscarem interoperabilidade também os leva a se reunir em torno de alguns poucos frameworks mainstream
Na minha visão, Web Components não acompanham do ponto de vista técnico e adicionam muita complexidade à plataforma Web em prol de um design do início dos anos 2010: https://x.com/Rich_Harris/status/1840116730716119356
Há muitos frameworks com runtime pequeno, como Svelte, e não estou dizendo para colocar 100 deles numa página, mas acho que uns 5 ou 6 tudo bem
Não quer dizer que seja ideal, mas pode ajudar em migrações incrementais ou micro frontends
Como referência, o React 17 também introduziu a capacidade de ter várias versões do React na mesma página: https://nolanlawson.com/2021/08/01/why-its-okay-for-web-components-to-use-frameworks/, https://bundlephobia.com/package/svelte@4.2.19, https://legacy.reactjs.org/blog/2020/10/20/react-v17.html
React e react-dom juntos passam de 100 KB, enquanto Svelte e Lit ficam na casa de um dígito em KB
Dá para incluir bastante framework antes de chegar perto do nível de inchaço que as pessoas usam todos os dias sem pensar
Os sinais que vi de forma consistente até agora não são bons; essa comunidade está no X, e Web Components não resolvem os problemas deles nem são bem usados mesmo no melhor cenário
Espero que consigam convencer, mas eles em geral dizem que Web Components fracassaram e, no conjunto, foram ruins para a Web
A maioria dos runtimes é bem pequena, e o fato de dois runtimes rodarem ao mesmo tempo não implica um grande overhead de performance
Frameworks Web modernos são todos reativos; se não há nada a que responder, eles não fazem nada
Se uma parte da página for feita em React, outra em Lit e outra em Svelte, não vejo bem por que a experiência do usuário ou o consumo de bateria ficariam perceptivelmente piores do que numa página com um único framework
O tweet citado é sobre Web Components serem ou não “primitivas úteis para criar frameworks”, e mesmo fãs que os usaram de verdade em geral provavelmente não diriam que são
Web Components são um mecanismo de distribuição e, se a alternativa é criar a mesma biblioteca 7 vezes para React, Preact, Svelte, Solid, Vue e vanilla JS, isso é horrível
Gosto de Web Components e sou otimista quanto à possibilidade de eles nos tirarem do inferno de frontend atual que nós mesmos criamos
Recentemente fiz uma apresentação curta sobre o futuro do frontend, e parecia que outras pessoas também esperavam uma saída
Criei uma tabela de dados para uma GUI de banco de dados, e a rolagem continua muito suave mesmo carregando centenas de milhares de linhas
Também pretendo publicar em breve uma biblioteca de Web Components; ainda é cedo e está meio bruta, mas gostaria que mais pessoas dessem uma olhada: www.astra-ui.com
Seria melhor reorganizar a barra lateral pensando em design responsivo para telas pequenas e usar max-width no body em vez de width
O botão “explore components” no rodapé da página inicial parece não apontar para lugar nenhum
Vocês dizem para “aprender com implementações de componentes bem estruturadas e acessíveis”, mas não encontrei links para as implementações na documentação
Vocês dizem que “não há dependências para manter ou atualizar”, mas me parece que o próprio astra-ui é uma dependência, e também há um changelog: https://www.astra-ui.com/changes/
Também dizem ter “controle total sobre o código e a estilização”, mas não entendo como isso é possível enquanto se depende da implementação fornecida pela biblioteca
Fiquei curioso sobre o motivo de decidirem publicar essa biblioteca. Abrir software interno pode ser útil quando a empresa tem um objetivo específico, mas geralmente tende a consumir tempo sem retorno
Bibliotecas de componentes precisam disputar adoção no ecossistema; caso contrário, não há público, e há pouco motivo para publicá-las
Parecem uma ótima solução
Há alguns meses, em um emprego novo, herdei uma base de código JS com cerca de 250 mil linhas
Uma única classe gigantesca e algumas subclasses faziam tudo, e alguns arquivos chegavam a 30 mil linhas
Não havia framework nem reatividade, então, ao clicar em um botão, era preciso atualizar manualmente tudo na tela por meio de event listeners
Parecia um código escrito por alguém que ficou trancado por anos numa cela de mosteiro levando apenas um livro básico de JavaScript
Como eu precisava fazer aos poucos, comecei a refatorar para Web Components, e isso ajudou muito; até agora reduzi 50 mil linhas
Mas o objetivo real era aprender tudo o que o código existente fazia antes de reescrevê-lo
Refazer com Web Components é uma forma de alcançar esse objetivo, e é bom que não tenham jogado tudo fora para recomeçar do zero
Só que, se você avançar até certo ponto e depois for para outro projeto, há o risco de a próxima pessoa chegar e começar a refatorar no próprio estilo, virando uma base de código obscura em três estilos diferentes
Ainda assim, é melhor do que reescrever 250 mil linhas de uma vez
Uma coisa de que gostei em Web Components é que, ao menos em teoria, eles podem funcionar mesmo com JS desativado
Já fiz isso algumas vezes para melhoria progressiva
No geral, concordo com o Nolan. Web Components ainda têm arestas suficientes para ser difícil dominarem o mundo no estado atual, mas são bem bons para certos casos de uso
Só não sei bem quanto à afirmação de que não combinam com renderização no lado do servidor; tenho feito isso sem problemas
Pelo que vi, parece ser necessário JavaScript para registrar um template em uma tag específica: https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_templates_and_slots
No ReactJS, é possível renderizar componentes ou templates no servidor, e considero JSX uma linguagem de templates bem boa
Pelo que entendo, Web Components não têm uma boa linguagem de templates embutida, então é preciso trazer uma por conta própria
Não conheço um mecanismo padrão para pegar o trecho de componente JS associado a uma tag e renderizar o HTML necessário sem executar JS
Se, no futuro, for possível renderizar no servidor três frameworks diferentes de Web Components, compô-los entre si e fazer hydration de forma limpa, então poderemos considerar o problema resolvido: https://nolanlawson.com/2023/08/23/use-web-components-for-what-theyre-good-at/