Um modelo(Boilerplate) de projeto React pronto para produção com TypeScript, apresentando uma arquitetura modular baseada em recursos (Feature-Based Modular Architecture).
- ⚡️ React com TypeScript
- 📦 pnpm - Gerenciador de pacotes rápido e com uso eficiente de espaço em disco
- 🎨 Tailwind CSS & shadcn/ui
- 🔍 ESLint & Prettier
- 🪝 Husky para Git hooks
- 📡 @tanstack/react-query para gerenciamento de dados de API e caches
- 🛣️ React Router para roteamento
- 📝 React Hook Form & Zod para validação de formulário
- 🔄 Axios para requisição de API
- 🎲 Zustand Para gerenciamento de estado global
- 🧪 React Testing Library Utilitários de teste simples e completos que incentivam boas práticas de teste
- 🧪 Jest Para testes unitários
- 🧪 Cypress Para testes E2E
src/
|__ assets/ # Ficheiros estáticos como imagens, icones svg, etc...
├── components/ # Componentes compartilhados/comuns
├── config/ # Configuração do aplicativo (i18n.ts, theme.ts, etc..)
├── features/ # Módulos baseados em recursos
│ ├── auth/ # Recurso de autenticação
│ │ ├── api/ # Integração de API
│ │ ├── componentes/
│ │ ├── hooks/
│ │ ├── routes/
│ │ ├── types/
│ │ └── validators/
│ └── usuários/ # Recurso de usuários
├── hooks / # Hooks compartilhados
├── lib/ # Funções utilitárias
├── providers/ # Provedores de contexto
├── routes/ # Configurações de rota global
├── services/ # Serviços de API
├── types/ # Tipos TypeScript compartilhados e os enums
|__ constants/ # Para valores constantes que são usados globalmente no aplicativo (como configurações fixas, limites de tamanho de ficheiros, limites de validação, etc.).
|__ data/ # Dados estáticos ou pré-definidos usados no app, como listas de países, categorias, etc.
|__ mocks/ # Arquivos de mock de dados para testes ou desenvolvimento, frequentemente usados para simular respostas da API.
|
|__ test/ # Para realização dos testes
| |__ unit/ # Testes de unidades para as funcionalidades e componentes do app.
| |__ integration/ # Testes que verificam a integração entre diferentes partes do sistema.
| |__ e2e/ # Testes que simulam o fluxo completo do usuário e verificam se o aplicativo funciona como esperado.
| |__ components/ # Testes específicos para componentes, utilizando bibliotecas como react-testing-library ou enzyme
└── validators/ # Validações compartilhados
# Criar um novo projeto
pnpm create vite nome-do-app --template react-ts
# Navegar até o projeto
cd nome-do-app
# Instalar dependências
pnpm i
pnpm add -D eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin eslint-plugin-react eslint-plugin-react-hooks eslint-plugin-import
pnpm add -D prettier eslint-config-prettier eslint-plugin-prettier
# Crie o arquivo .prettierrc
{
"semi": true,
"singleQuote": false,
"trailingComma": "all",
"printWidth": 100,
"tabWidth": 2
}
# 1 - Opção
pnpm add -D husky lint-staged @commitlint/{cli,config-conventional}
# OU
# 2 - Opção
pnpm add -D husky lint-staged @commitlint/config-conventional @commitlint/cli
# Inicializar Husky
pnpm exec husky init
# Criar arquivo de configuração do commitlint
echo "module.exports = { extends: ['@commitlint/config-conventional'] }" > commitlint.config.js
# Alternativa CommonJS commitlint.config.js
export default {
extends: ["@commitlint/config-conventional"],
};
# Alternativa ES Module commitlint.config.cjs
module.exports = {extends: ['@commitlint/config-conventional']}
# 📄 Adicione no package.json:
"lint-staged": {
"**/*.{ts,tsx,js,jsx}": [
"eslint --fix",
"prettier --write"
],
"**/*.{json,md,css,scss}": [
"prettier --write"
]
}
# Criar o Hook pre-commit
mkdir -p .husky
touch .husky/pre-commit
chmod +x .husky/pre-commit
# 📄 Conteúdo do .husky/pre-commit:
#!/bin/sh
pnpm exec lint-staged
# Criar o Hook commit-msg
touch .husky/commit-msg
chmod +x .husky/commit-msg
#📄 Conteúdo do .husky/commit-msg:
#!/bin/sh
pnpm exec commitlint --edit "$1"
# Testar a Configuração
git add .
git commit -m "feat: teste de husky"
git commit -m "feat: adiciona novo componente de botão" git commit -m "fix: corrige bug no formulário de login" git commit -m "docs: atualiza README" git commit -m "style: ajusta espaçamento do header" git commit -m "refactor: melhora performance da listagem" git commit -m "test: adiciona testes para o componente Card" git commit -m "chore: atualiza dependências"
- build: Mudanças no sistema de build ou dependências externas
- chore: Mudanças em arquivos de configuração, etc
- ci: Mudanças nos arquivos de CI
- docs: Mudanças apenas na documentação
- feat: Adição de nova funcionalidade
- fix: Correção de bug
- perf: Mudanças relacionadas a performance
- refactor: Refatoração de código
- revert: Reverte um commit anterior
- style: Mudanças que não afetam o significado do código
- test: Adição ou correção de testes
# Instalar Tailwind
pnpm add -D tailwindcss postcss autoprefixer
pnpm dlx tailwindcss init -p
# Instalar shadcn/ui
pnpm dlx shadcn-ui@latest init
pnpm add @tanstack/react-query @tanstack/react-query-devtools
pnpm add react-router-dom
pnpm add react-hook-form @hookform/resolvers zod
pnpm add axios
O projeto inclui um sistema de autenticação completo com:
- Funcionalidades de Login/Logout
- Rotas protegidas
- Authentication context
- Gerenciamento de Token
- Refresh Token Automático
- Persistência de sessões
- Rotas Públicas: Acessíveis a todos os usuários
- Rotas Privadas: Requerem autenticação
- Rotas Não Autorizadas: Para usuários autenticados sem permissões adequadas
- Página Não Encontrada: Manipulador da página 404
Os formulários são validados usando esquemas Zod e React Hook Form:
// Exemplo de esquema de validação
const loginSchema = z.object({
email: z.string().email(),
password: z.string().min(8),
});
As chamadas de API são organizadas usando React Query e Axios:
// Example API hook
export const useUsers = () => {
return useQuery({
queryKey: ["users"],
queryFn: () => api.get("/users"),
});
};
O projeto inclui uma implementação completa de modo escuro utilizando Tailwind CSS e shadcn/ui.
- Siga a Arquitetura Modular Baseada em Funcionalidades (Feature-Based Modular Architecture)
- Escreva código limpo e fácil de manter
- Adicione os tipos adequados em TypeScript
- Inclua testes unitários para funcionalidades críticas
- Siga as regras do ESLint e Prettier
- Use mensagens de commit Git adequadas
A autenticação verifica a identidade do usuário, geralmente usando JWTs. Tokens devem ser armazenados com segurança:
- Cookies com HttpOnly são mais seguros contra XSS.
- localStorage é mais prático, mas vulnerável a XSS.
- sessionStorage é útil para sessões curtas e menos críticas.
A autorização regula o acesso a recursos:
RBAC (baseado em papéis) define permissões gerais, como ADMIN e USER. PBAC (baseado em permissões) é mais específico, como permitir apenas ao autor excluir um recurso.
Recomenda-se proteger entradas de usuário contra ataques XSS e usar ferramentas como react-query-auth para gerenciar o estado do usuário.
Para mais informações Clique aqui
-
Boas práticas para componentes
- Mantenha componentes, funções, estilos e estados próximos de onde são usados para melhorar a legibilidade e desempenho.
- Evite componentes grandes com muitas funções de renderização aninhadas; extraia trechos em componentes menores.
- Garanta consistência no estilo de código com linters e formatadores.
- Limite o número de props de um componente, dividindo-o em partes menores ou usando composição.
- Abstraia componentes compartilhados em uma biblioteca para maior consistência e manutenção.
-
Bibliotecas de componentes
- Completas: Oferecem componentes já estilizados, como Chakra UI, MUI, AntD e Mantine.
- Headless: Componentes não estilizados, ideais para design personalizado, como Radix UI e Headless UI.
-
Soluções de estilização
- Opções incluem Tailwind, CSS Modules, styled-components, e Emotion.
- ShadCN UI e Park UI oferecem componentes estilizados como código customizável. Considere soluções leves para componentes de servidor no React.
4 - Storybook
- Ferramenta útil para desenvolver, testar e catalogar componentes isoladamente.
- Clone o repositório
- Instale as dependências:
pnpm install
- Inicie o servidor de desenvolvimento:
pnpm dev
- Construa para produção:
pnpm build
email: admin@example.com password: password123
email: manager@example.com password: password123
email: user@example.com password: password123
BaziotaBeans