Criando um site sem frameworks e várias bibliotecas
(kodingkitty.com)- A Koding Kitty aplicou uma stack centrada em HTML estático ao site de uma pequena empresa, operando as páginas necessárias e um blog sem um CMS grande nem frameworks
- Os critérios de escolha foram velocidade, conveniência no desenvolvimento, hospedagem barata e baixa complexidade; WordPress, no-code, frameworks e Jamstack exigiam configuração e aprendizado demais em relação aos requisitos
- O conteúdo é escrito diretamente em HTML, em vez de Markdown ou editor visual, facilitando lidar com posts que misturam texto e widgets em HTML/CSS/JS
- Estruturas repetidas e blocos comuns são tratados com templates Jinja, e um script Python de 45 linhas encadeia a detecção de mudanças, renderização de HTML e chamada da CLI do Tailwind CSS
- Por ser um site estático, hospedagem barata foi suficiente; a hospedagem web da Hetzner começa em 2 EUR e aguentou até um pico de tráfego vindo da primeira página do Hacker News
Por que escolher uma stack simples
- A stack tecnológica do site da Koding Kitty foi composta de forma intencionalmente simples, ajustada aos requisitos reais, em vez de seguir a tendência recente de desenvolvimento web leve
- O objetivo era uma configuração com pouco atrito para desenvolvedores, considerando que uma solução simples poderia ser melhor para os clientes do que uma combinação complexa de frameworks e bibliotecas
- Um design distinto, mas sem exageros, poderia ser criado de várias formas, mas a configuração atual foi uma escolha adequada ao escopo necessário
Requisitos e critérios iniciais
- Desde o início, decidiu-se criar um site estático
- As funcionalidades necessárias eram basicamente uma página inicial, uma vitrine e um blog; não havia muito além disso
- Os critérios eram quatro
- Site rápido
- Desenvolvimento rápido
- Hospedagem barata
- Complexidade mínima
Opções avaliadas, mas descartadas
-
WordPress e CMS semelhantes
- Reconhece-se que o WordPress teve um grande papel na internet
- Mas era exagerado para requisitos modestos
- Não havia necessidade de armazenar conteúdo em banco de dados, nem de plugins ou editor visual
-
Ferramentas no-code
- Parecia estranho para alguém que programa para a web usar ferramentas no-code
- Havia o desejo de possuir o conteúdo diretamente e controlar o site como quisesse
- A criação por código parecia mais rápida do que com um editor WYSIWYG no-code
- A necessidade de aprendizado inicial e contínuo também era um peso
-
Frameworks
- Havia experiência com frameworks, mas não se queria trazer toda a configuração junto
- Componentes como banco de dados, configuração, bibliotecas e recursos administrativos poderiam se multiplicar demais
- Mesmo sendo possível personalizar tudo, a conclusão foi que o resultado poderia acabar parecido com o WordPress
-
Jamstack e geradores de sites estáticos
- Geradores de sites estáticos pareciam uma opção bem alinhada aos requisitos
- É possível escolher uma linguagem, programar e criar rapidamente um site estático com um botão ou script
- Porém, exigiam configuração inicial e aprendizado inicial e contínuo
- Embora a conveniência de escrever o blog em Markdown tenha sido reconhecida, no geral foi escolhida uma solução mais simples
Composição da KittyStack
- A configuração da Koding Kitty foi organizada em torno dos quatro requisitos
-
Site rápido
- Sites estáticos funcionam rapidamente
-
Desenvolvimento rápido
- O conteúdo é escrito em HTML, não em Markdown nem em um editor avançado
- Como os posts da Koding Kitty misturam texto e widgets em HTML/CSS/JS, escrever HTML diretamente era adequado
-
Hospedagem barata
- O custo de hospedagem de sites estáticos varia conforme o provedor e os recursos adicionais necessários
- Como sites estáticos não exigem uma grande configuração de hardware, é possível escolher uma configuração mínima
- A hospedagem web da Hetzner começa em 2 EUR
- O site da Koding Kitty aguenta até picos de tráfego do nível de chegar à primeira página do Hacker News
-
Complexidade mínima
- Algumas páginas e posts têm padrões repetidos
- Seria possível copiar e colar, mas com o tempo isso poderia ficar difícil de controlar
- Eram necessários loops e a capacidade de incluir blocos de código como cabeçalhos e rodapés
Jinja e fluxo de build
- Estruturas repetidas e inclusão de arquivos comuns são tratadas com templates Jinja
- O Jinja oferece loops, inclusão de arquivos como barra de navegação e rodapé, além de outros recursos de template
- A equipe já tinha experiência anterior com frameworks baseados em Jinja, então não precisou aprender um sistema novo
Cadeia de ferramentas simples
- As páginas estáticas finais são geradas com um script Python de 45 linhas
- A contagem inclui comentários e linhas em branco
- O fluxo de build é o seguinte
- O desenvolvedor modifica
index.src.html Watchdog.pydetecta a alteração no arquivo- O template Jinja é renderizado como
index.html - A CLI do Tailwind CSS é chamada para gerar
styles.min.css
- O desenvolvedor modifica
- Durante o desenvolvimento, o Live Server serve os arquivos e recarrega quando há mudanças
- Na implantação, os arquivos são enviados manualmente por FTP
Vantagens de um desenvolvimento web menos complexo
- O desenvolvimento web pode ser mantido simples sem sacrificar muita coisa
- Limitar as opções a algumas alternativas pode, na verdade, dar uma sensação maior de liberdade
- Para muitos clientes, uma solução mais rápida, mais simples e mais barata pode ser útil
- É preciso observar a web como um todo e avaliar se o mesmo resultado pode ser alcançado com uma stack tecnológica menos complexa
1 comentários
Comentários do Hacker News
Também acabei chegando à mesma abordagem para meu portfólio de fotografia. Como migrei do desenvolvimento para a fotografia, a vantagem é não depender de Squarespace como outros fotógrafos
Depois de testar várias opções baseadas em servidor feitas com Ghost, Statamic e Phoenix/Vapor, além de geradores de site estático comuns, no fim passei a escrever tudo em HTML puro, sem templates, e enviar para um servidor da Hetzner com rsync
É um pouco incômodo não ter templates para UI compartilhada, como a navegação, mas até agora nunca tive uma mudança que levasse mais de alguns minutos com regex, e uma vez o git me salvou quando uma regex gulosa apagou conteúdo no começo
Gerar variações por tamanho e formato de imagem é trabalhoso, mas isso me força a experimentar novos layouts em vez de depender de layouts engessados como os do Ghost. Além disso, a qualidade parecia ligeiramente melhor ao exportar imagens para a web no editor RAW Capture One do que com as bibliotecas ou ferramentas CLI usadas pela maioria dos geradores de site estático
É mais lento, mas vejo isso como algo mais próximo de montar um livro de fotografia. No começo dá mais trabalho, mas depois que termina, terminou, e não preciso ficar migrando entre vários CMS e quebrando tudo pelos próximos 20 anos
Na prática, é uma estrutura de alguns arquivos HTML com o poder extra de templates; as fotos vêm de um álbum dedicado a esse site via API do Flickr, e o Netlify faz deploy automático só com
git pushO custo total, incluindo hospedagem, é 0 dólar, e dá para gerenciar as fotos pelo celular com o app do Flickr. Também gosto do fato de que, com o Netlify, não preciso mexer em um servidor de verdade
O método que usei recentemente também pode ajudar (https://news.ycombinator.com/item?id=36592641). Foi fácil usar Google Sheet como fonte de dados, e provavelmente teria sido igual trocando para um sistema de arquivos com fotos
Isso parece menos “simples (simple)” e mais apenas simplista (simplistic). Dá para fazer um site relativamente simples não fazendo quase nada e cortando os cantos
Mesmo olhando só para o modo escuro, praticamente a única funcionalidade não trivial visível nesta página, ele é implementado com JS carregado com atraso, então há um inevitável flash branco a cada carregamento de página. Para fazer direito, teria que ser com classe no
bodyvia CSS, e uma solução que não funciona não tem valor, seja simples ou complexaAlém disso, trazer um interpretador customizado inteiro de “hyperscript” como https://hyperscript.org/ para três linhas de JS sobre localStorage e configuração de modo escuro vai contra a ideia de que “simplicidade é a sofisticação máxima”. Carregar uma biblioteca de 96 KB sem cache só para isso é estranho, e fico me perguntando se é por isso que o HTML não valida
Por fim, um toggle binário é uma implementação ruim de modo escuro porque ignora as configurações do sistema/navegador. Mesmo se o modo escuro estiver ativado no sistema do smartphone, o site continua em modo claro até o usuário ligar manualmente, e também não respeita configurações do sistema que mudam conforme horário ou luz ambiente. O localStorage pode expirar e os dispositivos mudam, então o usuário precisa configurar repetidamente, e é bem possível que ele não concorde com essa implementação “simples” de que o desenvolvedor fala
Se você considerar configurações de sistema/navegador, troca por fuso horário, luz ambiente e afins, a complexidade cresce de um jeito que entra em conflito com a filosofia de um site simples. Melhor simplesmente remover o modo escuro; o HN também é sempre claro e isso não impede muito a leitura à noite
Em geral, você quer respeitar
prefers-color-schemee ao mesmo tempo oferecer um toggle, e se o usuário já escolheu manualmente antes no site, quer priorizar essa escolha. Aí você ainda precisa de JS e localStorageMinha forma preferida é usar estilo inline com
body {visibility: hidden; opacity: 0;}. Dá para manter a página anterior visível e, no momento deDOMContentLoaded, verificarprefers-color-schemee localStorage, definir corretamente a classe do body e só então renderizar a páginaMeu site respeita o tema claro/escuro com CSS e não tem toggle manual. Tenho como meta pessoal um site em HTML/CSS puro, sem JS, e acho que as configurações de claro/escuro devem respeitar a preferência do usuário. Se um toggle for necessário, ele deveria ficar não dentro do site, mas nas configurações da barra de ferramentas do navegador
Se /u/gwern estiver lendo, meu site https://daveon.design/ foi influenciado pelo design do gwern e pelo Tufte.css. Também há mistura de publicações antigas, manuscritos e gosto pessoal, mas o gwern foi o exemplo central que primeiro me inspirou sobre como um site pessoal moderno e limpo poderia parecer e o que poderia conter
Falando nisso, hoje em dia SvelteKit + Skeleton é realmente impressionante em termos de velocidade para criar um protótipo utilizável
Mesmo sem conhecer Svelte direito, se você entender o roteamento baseado em arquivos, o resto é praticamente HTML até você precisar de mais; Tailwind já vem por padrão, e os temas em geral ficam bem próximos do vanilla
Nos últimos meses testei várias coisas, como Astro, Lit, Next.js, templates nativos do Go, pug e Eleventy, e até agora essa combinação é a minha favorita em quase todos os aspectos
Basta olhar o próprio site do Skeleton https://www.skeleton.dev/docs/get-started: mesmo apertando Page Down ele não rola, ao passar o mouse sobre a barra de navegação também não rola, e ao imprimir ele corta tudo e mostra só a parte visível na tela. Eu apontei esse problema, mas ainda não é alta prioridade, e mesmo assim muitos sites usam esse padrão de componentes
Parece que o Skeleton considera que inverter as cores do tema escuro já produz um tema claro aceitável, mas na prática não é assim. DaisyUI é mais maduro, mais performático, mais usado e trata acessibilidade com seriedade. Também impressiona conseguir isso só com animações em CSS, sem JS, resolvendo as partes difíceis de HTML/CSS e deixando você escrever diretamente a parte fácil de Svelte. A dependência de Svelte também é menor, então é fácil levar o HTML do DaisyUI para outros frameworks
Tailwind funciona de imediato, e fazer deploy em lugares como a Netlify também é muito simples. Hoje, eu diria que é o melhor construtor de sites estáticos e muito mais simples do que a abordagem explicada no texto
Com
+page.tse a configuração adequada, dá para fazer também um site estático, além de poder evoluir para um app multipágina ou de página únicaMeu Deus, fazer um site com HTML e CSS parece uma loucura
Brincadeiras à parte, fora os templates eu uso praticamente a mesma stack. Se você não é desenvolvedor web, é difícil entender a necessidade de um framework CSS, e fazer você mesmo é muito mais fácil. Também testei geradores de site como Hugo, mas não economizei tempo nenhum
Alguns meses atrás tentei melhorar minhas habilidades em CSS recriando sites de algumas empresas, e visualmente todos puderam ser reproduzidos só com HTML e CSS. Só que os sites reais dessas empresas nem apareciam quando o JS era desligado
Estamos empilhando frameworks sobre frameworks, novas linguagens e novas ferramentas, e a maioria só aumenta a complexidade e o trabalho corrido da próxima geração. Os 5% de sites que realmente precisam disso são exceção
Também achei interessante que era um site vendendo um serviço real e fiquei curioso sobre a faixa de preço
Acho que a forma mais minimalista e produtiva é simplesmente usar PHP, porque a linguagem foi criada originalmente para esse tipo de uso
Para um site simples, não precisa de composer nem de lógica de roteamento; basta separar arquivos de header/footer/navigation e fazer include deles em cada página
header.php,pagename.phpefooter.php. Para sites simples eu faço assim, e é muito fácil e rápidoSe o HTML pudesse inserir HTML externo como CSS ou JS, até isso seria desnecessário na maior parte dos casos. Seria ótimo se simplesmente deixassem a gente usar isso livremente
Você muda alguma coisa, faz git commit/push, e em menos de 30 segundos as alterações se refletem no mundo inteiro. É muito bom e não precisa de hospedagem de servidor separada
Isso me faz lembrar da frase “tão simples quanto possível, mas não mais simples”. Provavelmente não é do Albert Einstein
HTML + CSS puros, com o CSS dentro de cada tag HTML ou da própria página, funciona bem para começar. Quando a página vira duas, você acaba extraindo o CSS para um arquivo separado
Mas quando você começa a criar um site com várias páginas no mesmo formato, passa a precisar de um sistema de templates com include e de um gerador de páginas estáticas
Se as páginas forem orientadas por dados, você precisa de um gerador de sites programável que consuma dados e produza páginas; se os dados forem “em tempo real”, então é preciso gerar páginas por visualização, o que já te leva pelo menos ao território do PHP, ou até ao território dos frameworks web modernos com servidor em execução
Recentemente fiz um site pro bono ligado a um hobby. É um site de divulgação de dança e de eventos, e a proprietária é uma professora de dança sem muito conhecimento técnico. Gereis um site estático no plano gratuito da Netlify com o Eleventy(https://www.11ty.dev/) e adicionei código de build customizado para buscar dados de uma Google Sheet, para que a professora pudesse definir os próximos eventos
Levei umas boas horas para fazer, mas agora está rodando bem sem custo de operação/manutenção. Descobri que existe um ponto ideal poderoso entre uma configuração totalmente mínima e algo no nível de Rails/Phoenix/Django
Dito isso, um site quase certamente terá mais de 3 páginas, então isso pode ser um pouco diferente da probabilidade de um bloco de código genérico ser usado 3 vezes ou mais
Também queria saber se a estrutura chama a Google Sheets API no lado do cliente para preencher os dados e, nesse caso, se existe uma camada de cache ou se cada cliente recebe uma cópia nova toda vez
Essa discussão sobre frameworks e complexidade já cansou de verdade
Se o cliente exige um CMS customizado com fluxo de publicação em várias etapas, internacionalização e acessibilidade para compliance, você precisa de ferramentas poderosas para entregar isso no tempo que o cliente espera. No mundo enterprise há muitos clientes assim, por isso existe tanta demanda por esse tipo de ferramenta. Quem só trabalhou com B2C pode se surpreender, mas essa é a parte submersa do iceberg da indústria de tecnologia
É verdade que um blog estático não precisa de uma configuração complexa de Next.js nem de uma toolchain Vite. Mas quem discute essas ferramentas a sério não está falando de fazer um site de blog simples. O exemplo reduzido do tutorial pode até ser um blog, mas o problema real é outro
Então eu queria que esse ódio a frameworks diminuísse um pouco. Se alguém tem uma boa ideia para fazer sites de forma simples, pode publicar um tutorial, e, se for atraente, as pessoas vão usar essa abordagem nos contextos apropriados. Só queria evitar esse hábito de argumentar contra um inimigo vago tipo “toolchains apimentadas e frameworks da moda”
Ou então pode achar que sabe tudo porque passou anos fazendo app interno de trabalho com duas dezenas de usuários e sem exigências de UX. Esse tipo de julgamento com pouca informação acaba empobrecendo a discussão
Só que, dessa vez, quem herdar esse código não vai receber atualizações e nem vai conseguir ajuda no Stack Overflow com facilidade
Não entendo por que as pessoas acham que não se pode usar ferramentas diferentes para trabalhos diferentes. Há momentos em que framework não é necessário, mas, pela minha experiência, isso é raro a menos que você esteja fazendo algo extremamente simples e que quase não vai mudar
Num cenário com equipe e cliente, é difícil imaginar como um site de “ferramentas simples” funcionaria na prática; não estou criticando, realmente só não consigo visualizar bem
Para mim, isso aí já soa complexo demais
Eu escrevo os textos em Gemtext, ou seja, markdown para Gemini, e fiz um script em Python que converte isso para HTML e gera páginas de índice
O CSS tem só 42 linhas, então coloquei em cada página, e até calculei que o custo de adicionar 42 linhas por arquivo nunca seria maior que o de uma segunda requisição HTTP
Foi muito mais simples do que eu esperava, sem bibliotecas Python nem templates. A parte mais difícil foi gerar os emails para enviar à mailing list. Passei meses analisando vários frameworks e geradores de site estático, e semanas procurando um CSS decente
Pelo histórico do git, levei 2 semanas hackeando tudo até concluir, incluindo importar 18 anos de histórico do WordPress. Como é Python puro, não precisei aprender nada novo, e, se houver bug, posso corrigir ou mudar facilmente. Afinal, o código é meu
Os cientistas da computação esqueceram completamente que dá para simplesmente codificar uma solução ad hoc em vez de tentar reutilizar tudo. O tempo gasto para aprender e adaptar é maior do que o tempo de fazer você mesmo
Código: https://git.sr.ht/~lioploum/ploum.net
Site: https://ploum.net
Meu site é servido por um processador 6502 esculpido em madeira balsa em 2003 e colado com epóxi num cabo Ethernet. Quando quero mudar algo, aqueço a EPROM com um secador de cabelo para inverter os bits desejados. Sem templates, sem código, sem bloat
A sensação de revisitar a história da tecnologia enquanto descia a página trouxe uma nostalgia enorme
A menos que eu tenha entendido errado, isso não parece muito diferente de um gerador de site estático comum. Parece a diferença entre gerar arquivos HTML com templates Jinja baseados em Python e o Jekyll, que gera arquivos HTML/Markdown com templates Liquid baseados em Ruby
Um site em PHP com
includeou um gerador de site estático pronto faria muito mais sentidoNão entendo. No fim, ele não queria um gerador de site estático, então escreveu um gerador de site estático por conta própria