Receita para front-end rápido
Meu maior defeito como programador sempre foi ser lerdo no front-end. Apesar de no meu cargo estar escrito Programador Fullstack o desenvolvimento no back-end sempre foi o meu “forte” enquanto no front sempre “empurrei com a barriga”.
Após meses estudando o tempo que eu demoro para construir aplicações front-end, cheguei em um monte de conclusões que podem te ajudar a entender como você mesmo(a) pode estar sofrendo dos mesmos males e como se tornar um(a) desenvolvedor(a) mais ágil sem sacrificar os seus valores.
Vou listar todos os passos que me fizeram deixar de ser um desenvolvedor lento e no final eu vou postar uma receita e um link para acessar o meu repositório modelo, onde eu tomo como base para todas as aplicações front-end que eu desenvolvo.
Primeiro passo.
1. Utilize só o NPM
Não perca tempo usando outros gerenciadores de pacotes como yarn, bun,
pnpm e deno, pois o ecossistema Javascript é muito bagunçado e muitos
pacotes que dependem do React podem falhar quando o gestor não é o npm. Dois
exemplos são vite e react-router.
Eu já cansei de ver projetos parando de funcionar devido a alguma diferença no
ambiente de execução. Desde que voltei a usar npm eu nunca mais tive dor de
cabeça.
Jamais utilize deno para projetos front-end, o repositório de pacotes deles
carece de muitas dependências em cima do ReactJS e o deno só serve para projetos
que rodam no lado do servidor. Além disso, as dependências do repositório do NPM
não são compatíveis com o deno, pois todas esperam compatibilidade com o
node. Já tentei fazer projetos front-end com o deno e só ganhei dor de
cabeça.
2. Repositório modelo
Não perca tempo rodando create-react-app toda vez que você começa um projeto
novo. Crie um projeto do jeito que você gosta uma única vez e coloque-o num
repositório no GitHub como modelo, assim toda vez que você quiser começar um
projeto novo basta clonar o repositório modelo e desenvolver. Você quase sempre
precisa:
- Instalar dependências adicionais
- Configurar um linter
- Configurar um formatador de código
- Configurar hooks do git
- Instalar clientes HTTP (axios, fetch e afins)
- Instalar bibliotecas de UI
- Configurar o Build do projeto
- Configurar o sistema de rotas
- Instalar as fontes
Então, por que não pular essas etapas e colocar tudo num repositório? Pegue as bibliotecas que você está mais familiarizado e coloque-as no seu projeto base.
Dica: Lembre-se de atualizar o seu repositório modelo periodicamente para manter as dependências e práticas atualizadas.
3. Configurações de rotas
Sempre utilize frameworks com configurações de rotas implícitas como o NextJS
ou o React Router.
Um exemplo de convenção que facilita muito a minha vida é a configuração por meio do sistema de arquivos do React Router.
Muito mais fácil do que desenvolver minha própria lógica de renderização. Um exemplo de projeto que segue essa convenção é o front-end do Zetsu:
routes
├── admin.file-new.tsx
├── admin.files-listing.$sha1.edit.tsx
├── admin.files-listing.$sha1.tsx
├── admin.files-listing.$sha1.view.tsx
├── admin.files-listing.tsx
├── admin.images-listing.tsx
├── admin.tsx
├── auth.tsx
├── _index.tsx
└── logout.tsx
Não precisei criar:
- Nenhum React suspense.
- Nenhum arquivo de configuração.
- Nenhuma convenção de rotas.
Não preciso olhar a fundo no código para saber como e onde novas telas são criadas.
Eu simplesmente estou velho demais para esse tipo de coisa:
<Routes>
<Route index element={<Home />} />
<Route path="about" element={<About />} />
<Route element={<AuthLayout />}>
<Route path="login" element={<Login />} />
<Route path="register" element={<Register />} />
</Route>
<Route path="concerts">
<Route index element={<ConcertsHome />} />
<Route path=":city" element={<City />} />
<Route path="trending" element={<Trending />} />
</Route>
</Routes>
Rotas declarativas como essas fazem com que projetos fiquem bagunçados e difíceis de acompanhar, pois vai do bom senso de cada desenvolvedor as pastas onde cada configuração é feita. Sem falar que é difícil localizar a rota que você quer dar manutenção porque as rotas podem ser configuradas em diversos lugares diferentes e podem não seguir nenhuma hierarquia.
4. Cliente OpenAPI
Não perca mais o seu precioso tempo criando interfaces typescript a partir de documentações do Swagger ou configurando o seu axios, pois existem bibliotecas que já fazem isso por você.
Mas, e se as tipagens estiverem erradas?
Problema do back-end!
Todo desenvolvedor back-end sabe onde o sapato aperta, se ele sabe que uma propriedade pode ser nula, então ele deveria deixar isso documentado na API, o mesmo vale para propriedades obrigatórias. O desenvolvedor front-end não tem bola de cristal para adivinhar quais dados são obrigatórios e quais podem ser omitidos. Eu tenho muita raiva de gente que trabalha no back-end e não deixa essas coisas documentadas, é tão simples! É só colocar a tipagem na linguagem que você estiver usando:
<?php
class SimpleDTO {
public function __construct(
public ?int $id,
public readonly \DateTimeImmutable $createdAt,
public string $description,
) {}
}
Qualquer biblioteca de OpenAPI documenta isso para você! Você só precisa se preocupar com a tua linguagem. Deixe tudo “redondinho” no back-end que as tipagens na documentação vão aparecer corretas!
Dado que o back-end esteja devidamente documentado com OpenAPI (o que é padrão nos dias de hoje), você não precisa mais perder o seu tempo copiando as interfaces de respostas uma por uma. Basta usar um gerador de tipos para Typescript e importá-los para dentro do seu projeto, você poupa tempo e discussões com os colegas sobre “onde vão deixar as interfaces” e “como vão documentar as interfaces”.
5. Telas prontas
Não perca seu tempo criando telas do zero! Prefira bibliotecas com telas prontas no estilo “é só pegar e usar”. O Toolpad do Material-UI é um exemplo:
Vai desenvolvedor um CRUD? Um dashboard? Uma tela de login? Tudo isso já está pronto, é só você usar. Precisa de uma identidade visual com as cores e logos da empresa? É só você alterar o tema do Material-UI. Você não precisa provar para ninguém que sabe programar em React, você só precisa entregar um produto que funcione!
Existem várias bibliotecas parecidas que seguem o mesmo princípio:
Algumas são pagas enquanto outras gratuitas, mas o ponto é: construir telas para a maioria das aplicações é o mesmo que reinventar a roda. Toda empresa quer fazer diferente, mas vai de você oferecer um produto sob medida com componentes prontos.
Essas telas vêm com componentes onde a tua única preocupação é preencher as
props react delas. Você não precisa se incomodar com responsividade,
funcionalidade, cores, lógica de implementação e afins, só a regra de negócio em
si.
Conclusão
Sempre que puder, utilize frameworks opinativos1 e convenções prontas, não perca seu tempo reinventando a roda em projetos novos, pois você vai perder tempo demais com coisas que não dão retorno ao invés de simplesmente produzir. Utilize projetos não sérios se você está a fim de brincar com as tuas habilidades. Procure por convenções porque elas existem por algum motivo.
Com essas práticas você pode economizar várias horas de configuração inicial em cada projeto e também horas no tempo total de desenvolvimento ao reutilizar componentes e padrões testados.
Eu só sei que estou velho demais para este tipo de coisa: escrever tudo do zero, desenvolver meus próprios padrões, eu não aguento mais. Eu quero que você aprenda de alguma maneira com esse artigo e não cometa os mesmos erros que eu.
Se você quiser, aqui está o modelo de repositório que eu utilizo em projetos novos de front-end:
Eu posso atualizar esse modelo conforme as minhas preferências forem mudando e você também pode fazer o mesmo. Crie o seu modelo e deixe-o pronto para novos projetos, se você juntar todas essas práticas você vai eliminar um monte de barreiras e vai começar a produzir logo de cara. Boa sorte e um grande abraço!
do inglês opinionated que significa dogmático, com convenções próprias, com opiniões definidas. ↩︎