- Explica as técnicas básicas de desenvolvimento web usando apenas HTML, CSS e JavaScript
- Apresenta como implementar sites e aplicações somente com tecnologias web padrão, sem ferramentas de build nem frameworks
- Aborda formas de estruturar e estilizar usando Web Components e recursos modernos de CSS
- Busca um ambiente de desenvolvimento simples e benefícios de longo prazo, sem a complexidade dos frameworks nem o peso da manutenção
- Tutorial voltado principalmente para desenvolvedores que já dominam tecnologias web padrão
Visão geral da Web Plain Vanilla
Uma visão geral das principais técnicas para criar sites e aplicações apenas com tecnologias web padrão, sem ferramentas de build nem frameworks, no desenvolvimento web
- Descreve um ambiente que utiliza apenas editor, navegador e padrões web
- Apresenta uma estrutura que permite implantação em produção sem configuração inicial nem lógica no lado do servidor
Tópicos abordados
1. Componentes (Components)
- Mostra como usar Web Components para compor elementos de alto nível apenas com HTML, JavaScript e CSS
- Mostra uma forma de substituir a abordagem de componentes de frameworks como React ou Vue
2. Estilização (Styling)
- Mostra como aproveitar o poder do CSS moderno para substituir as conveniências oferecidas por CSS Modules, PostCSS e SASS
- Apresenta o conceito de uma organização de estilos estruturada e modular, indo além do CSS clássico
3. Sites (Sites)
- Mostra como estruturar projetos web com base em Web Components e fazer o deploy sem ferramentas de build nem servidor
- Apresenta um fluxo de deploy prático e simples
4. Aplicações (Applications)
- Mostra como criar aplicações web de página única usando apenas técnicas vanilla
- Explica abordagens de roteamento e gerenciamento de estado
Público recomendado
Destinado a desenvolvedores que já conseguem trabalhar razoavelmente com HTML, CSS e JavaScript
- Para quem está começando em desenvolvimento web, recomenda percursos de aprendizado básico como Odin Project ou MDN
Por que a abordagem vanilla
Os frameworks modernos oferecem rapidamente estrutura e recursos poderosos, mas vêm acompanhados do aumento da complexidade das ferramentas e dos frameworks, além de uma carga constante de manutenção
- A abordagem Plain Vanilla abre mão de parte da conveniência de curto prazo em troca de simplicidade e do benefício de longo prazo de uma manutenção praticamente zero
- Os navegadores atuais tornam essa abordagem realmente viável graças ao excelente suporte aos padrões web de hoje
1 comentários
Opiniões do Hacker News
Eu já saí da discussão "vanilla ou framework" e hoje penso mais em: "isso realmente precisa de um site?"
Quando você começa a ficar cético sobre a necessidade real de uma interface web, especialmente em webapps e no universo de SaaS B2B, descobre que dá para levar o negócio bastante longe sem sequer mexer no navegador
A maior parte do tempo que gastei criando sites e apps foi em UI/UX administrativa, isto é, fazer o administrador alterar campos no banco de dados para que a aplicação se comporte de acordo com a expectativa do cliente
Em muitos casos, é muito mais rápido, simples e com menos trabalho inútil entregar ao negócio apenas um template de configuração (como uma planilha Excel) e inserir/mesclar o resultado diretamente em tabelas SQL
A web oferece apenas um tipo de UI/UX. E-mail ou arquivos de texto puro às vezes são mais flexíveis
Especialmente em órgãos públicos, os compradores muitas vezes não entendem direito o que estão adquirindo e acabam pagando caro demais
Os responsáveis por compras precisam ser mais bem instruídos sobre o que realmente é necessário
Uma loja física de urnas não tem carrinho, então por que a loja virtual precisaria ter?
Quando comprei ferramentas especializadas de marcenaria online, apenas preenchi um formulário e recebi as peças com a fatura; se eu quisesse, nem precisava pagar na hora
Existem muitos formatos de comércio, online e offline, e, se você observar com atenção como as pessoas vivem de formas interessantes, vai encontrar isso por toda parte
Com um mínimo de capacidade de manutenção, um template de Excel + um script simples e customizado acaba sendo muito mais flexível.
É especialmente eficaz quando o usuário final já é o tipo de pessoa que lida com dados brutos de qualquer forma
E ainda hoje 99% do B2B funciona desse jeito
Não sou contra frameworks. Só acho que em muitos casos eles são desnecessários
Sempre me perguntei por que eu deveria adicionar 100 KB de JS antes mesmo de escrever uma linha de código
Eu e minha equipe construímos o https://restofworld.org sem nenhum framework
Pesquisas, outreach e feedback por e-mail foram extremamente positivos em termos de usabilidade e experiência de leitura
Talvez usemos um framework mais tarde, mas por enquanto JS vanilla continua servindo muito bem
De um lado, há pessoas construindo grandes webapps em equipes de 30+ pessoas, e basta alguém dizer que fez sem framework para surgir imediatamente uma enxurrada de dúvidas sobre como lidou com funcionalidades essenciais em grande escala
Mas a resposta é que essas funcionalidades nem são necessárias, porque estamos falando de algo como um blog, então nem havia necessidade de framework desde o início
Por outro lado, quem nunca teve experiência com webapps realmente grandes acaba pensando: "por que as pessoas usam frameworks?"
A web é, de fato, um conjunto extremamente diverso de softwares.
Então, ao discutir frameworks, acho que é preciso deixar claro de que tipo de software estamos falando
Neste caso, isto é um blog em WordPress
Ela usa WordPress, que é um grande framework, e apenas está sendo renderizada de forma estática
O TFA fala de não usar ferramenta de build nenhuma, apenas padrões modernos da web. Só editor, navegador e padrões web
Nos apps corporativos em que trabalhei, 100 KB nunca foi uma preocupação
A maioria eram apps grandes feitos por várias equipes, usando React etc.
Em Lob/B2B, ninguém liga para o carregamento inicial da página
Os usuários usam o app todos os dias e, na maior parte do tempo, os assets estáticos já vêm direto do cache do navegador
Se você usa um framework inteligente como Next.js, o conteúdo é separado em chunks imutáveis por rota
O render inicial é HTML estático, então o usuário nem percebe a hidratação
Mas, na discussão entre vanilla e framework, sempre que aparece um exemplo desses é um site de notícias/artigos, então penso: "eu nem teria usado framework nisso desde o começo"
No fim, exemplos reais de uso precisariam ser apps mais interativos
Hoje em dia prefiro usar apenas o framework e padrões consistentes, minimizando outras dependências
No iPhone, eu já estava acostumado demais a voltar e ver a página inteira recarregar sempre
Mas desenvolvedores vivem obcecados, por diversão, com telas de loading, componentes hidratados, animações excessivas e modais irritantes
Além disso, scroll infinito é péssimo para usabilidade, porque dificulta acompanhar onde você está pela posição da barra de rolagem
Parabéns por ter participado da construção
No caso de Mithril, por exemplo, dá para ter tudo em 10 KB compactados com gzip
Se eu pensar em implementar manualmente uma tabela reativa com busca, formulários com rótulos, validação e erros bem feitos, por que eu faria isso do zero se posso usar uma biblioteca de UI em Svelte e um produto bem validado com só 25 KB de overhead?
E WordPress também é um framework
Usar framework não torna algo lento. Nem WordPress, nem qualquer outra coisa
Rápido demais
Por produtividade do desenvolvedor, em teoria.
Na prática, muitas vezes nem ajuda tanto assim
Fico curioso se essa abordagem teve algum problema mais sério
Estou desenvolvendo um sistema para cerca de 2 mil usuários, e eles não se importam nem um pouco com UI reativa
O melhor é fazer um monólito, não se preocupar com refresh de página e simplesmente focar em concluir o trabalho
A motivação em geral nem foi tão técnica, mas sim o custo alto demais de distribuir apps nativos
A web oferece um padrão barato de distribuição de aplicações, mas a tecnologia de UI continua ruim
No passado houve várias tentativas meio capengas, como X11, Java e Flash, e espero que um dia apareça um jeito mais confortável de desenvolver webapps
@view-transitionjá dá para fazer transições suaveshttps://developer.mozilla.org/en-US/docs/Web/CSS/@view-transition
A maior parte do software é muito mais lenta e menos responsiva do que dispositivos mecânicos de 120 anos atrás
Não precisa puxar pacote npm nenhum
O backend fica em express/node, o código inteiro fica junto, mas no ambiente de desenvolvimento o servidor roda como o servidor padrão do React, e em produção roda de outro jeito, então você acaba precisando de um modelo esquisito de build e operação que anula a conveniência do servidor de dev, como hot reload
Até SPAs de grandes empresas como Reddit e X (Twitter etc.) foram instáveis demais no mobile
A menos que você seja do tamanho do Twitter, ou tenha uma plataforma centrada em API, acho que não há motivo para insistir em SPA
Se nem empresas de dezenas de bilhões fizeram isso direito, é perigoso achar que eu farei melhor
Não é preciso reescrever tudo em React
Os recursos mais avançados, no estilo SPA, citados pelo autor original são opcionais
Você chegou a investigar também quem abandonou o sistema?
Eu queria viver num mundo assim
Venho da era pré-framework, quando tudo ainda era imaturo e era comum encontrar gente que só sabia jQuery
Hoje, sinto que o custo-benefício dos frameworks do pós-query selector já não é tão grande assim, embora frameworks de teste sejam outra história e sejam ótimos
Estamos presos numa prisão de frameworks do React, e todo fracasso é resultado de uma complexidade espaguetificada
Máquinas de estado viram gambiarras hardcoded, e os artefatos traduzidos, minificados e transpilados ficam difíceis de reconhecer
Source maps são mais uma camada de complexidade para manutenção
Entendo por que os frameworks foram criados, mas me custa imaginar que seguir aprendendo frameworks seja mais fácil para novos engenheiros do que aprender JS vanilla
HTML era só uma marcação feita para facilitar um pouco a renderização de texto, e HTTP também era assim
No passado, a proporção texto/marcação precisava ser alta, mas agora isso se inverteu completamente
Mesmo assim, resolvemos empilhar todo o desenvolvimento de apps em cima disso, como se fosse o futuro, e basta olhar para dentro do React para ver décadas de truques e remendos
No passado, seria como tentar fazer apps com Excel+VB ou com PDF+PostScript, algo totalmente absurdo
Talvez por isso consumir megabytes de JS pareça tanto um exagero
Quando os dados mudam e a UI reage na hora, se eu tiver de fazer listeners manualmente, diff de atualização e ainda limpar eventos, parece quase gerenciamento manual de memória
Na era do jQuery era assim, e havia muitos erros
Quando for possível modularizar a view de forma declarativa e baseada em componentes com JS vanilla, aí talvez eu volte, mas por enquanto acho totalmente inviável
Falta um fator decisivo
React e Angular claramente faziam sentido antes do ES2015
Depois disso, cansei da constante mudança nos frameworks de frontend
Até dentro do React, a forma de fazer componentes e gerenciar estado vive mudando
Eu ainda não compro a ideia de Web Components
Mesmo com recursos recentes como
@scoped,import {type:css}e afins, continuo achando muito mais sensato renderizar os elementos estaticamente e depois atualizá-los dinamicamente com JS modernoSou cético em relação à maioria das abordagens com Web Components e sigo acreditando que precisamos inovar fora de frameworks como React/Svelte
Nunca senti que Web Components fossem úteis nos vários sites que mantenho
A questão do Shadow DOM aparece dezenas de vezes por página, mas na maior parte dos casos isso só resolve problemas criados pela própria adoção dele
Meus componentes são específicos do meu app, então eu nem tenho problema de Shadow DOM
Fico curioso sobre como Web Components tratariam isso no backend
Você pode adicionar métodos extras à sua própria tag e encapsular a lógica de atualização dentro do componente
Precisamos de práticas que priorizem bibliotecas leves ou código que possamos escrever nós mesmos
HTMX tem coisas boas, mas ainda se comporta como uma tag script; seria suficiente deixar URL/método claramente no HTML e coisas como
hx-targetsó em atributosdata-definidos pelo JSNão quero carregar todos os recursos do HTMX que não vou usar
Não acho que Web Components sejam substitutos para o que outros frameworks chamam de componentes
Não dá para passar valores compostos (Object, Array etc.) por atributos, há boilerplate demais e não existe reatividade
Eu programo em um estilo vanilla JS usando
signals[1]Nem todo padrão W3C é a resposta certa, e convém lembrar do fracasso do XHTML
[1] https://wrnrlr.github.io/prelude/
http://youmightnotneedjs.com
Isso parece uma abordagem bem adequada para quem faz páginas web como hobby
Frameworks servem para padronização, para embutir boas práticas no desenho e para acelerar o início do desenvolvimento
O site em si não tem valor intrínseco; o que importa é como expor seu conteúdo com eficiência e desenvolver a coisa certa no prazo
Nesse sentido, frameworks reduzem custos atuais e futuros
Em grandes empresas, as decisões muitas vezes são guiadas por moda, hábito e uma postura defensiva em torno dos frameworks populares; a perda de produtividade causada pela complexidade extra não é acompanhada, e decisões erradas acabam até alinhadas com os incentivos pessoais ou do time
Ou seja, não dá para justificar a escolha de framework dizendo que "só pode ser a decisão racional"
Usar framework não garante automaticamente boas práticas e, na verdade, pode acabar gerando sistemas ainda mais inchados e lentos
Material realmente excelente
Acho que, se você vai desenvolver para a web, precisa conhecer bem os fundamentos e saber aproveitar ao máximo a plataforma web
Depois disso, usar ou não sistema de build/framework passa a ser uma escolha livre, desde que você entenda os trade-offs
Pessoalmente, gosto de Remix (/React-router v7+) porque ele dialoga com a filosofia dos padrões web
Ou seja, você consegue fazer mais com menos desenvolvimento, inclusive alterar dados do servidor usando apenas formulários HTML
Também recomendo https://every-layout.dev, onde dá para aprender várias técnicas de layout de alta performance, acessíveis e flexíveis usando apenas CSS nativo do navegador
Trabalho profissionalmente com desenvolvimento web desde 1998
Na semana passada implementei um projeto pequeno totalmente em vanilla e está funcionando muito bem
É uma ferramenta web para escrever threads longas no Mastodon
Durante todo o desenvolvimento, eu ficava pensando: "será que estou fazendo algo errado por não usar framework?"
Parece que todo mundo espera frameworks hoje em dia
Splinter, splinter.almonit.club, para quem quiser dar uma olhada