Conheça o Rocketseat Para Empresas
Oferecemos soluções personalizadas para empresas de todos os portes.
Faaaaala, Dev! Se você está começando a sua jornada em React e já se deparou com aquela bagunça de pastas e arquivos, segura firme, porque este artigo vai te ajudar a transformar essa confusão em uma estrutura organizada e escalável. Aqui, vamos explorar, de forma prática e direta, como organizar a estrutura de pastas no React para deixar seu código mais limpo e fácil de manter. Preparado? Bora codar!
Por que a estrutura de pastas é importante no React?
Imagine que você está construindo uma aplicação simples e tudo parece estar sob controle. Mas conforme a aplicação cresce, o número de arquivos aumenta e, sem uma organização adequada, você acaba perdendo tempo procurando componentes, estilos, hooks e contextos. Uma estrutura de pastas bem planejada é como uma “mão amiga” que te guia e mantém o projeto sustentável ao longo do tempo. E isso, meu amigo dev, faz uma diferença e tanto!
Passo 1: o básico do básico
A primeira estrutura que encontramos em projetos pequenos é bem minimalista. Normalmente, você inicia com uma pasta
src e um único arquivo App.js que contém o componente principal.src/ └── App.js
Essa é uma ótima forma de começar, principalmente se você está apenas explorando os primeiros conceitos de React. Porém, se a sua aplicação cresce e você continua colocando tudo em
App.js, a experiência de manutenção vai ficar muito complicada.Passo 2: evoluindo para múltiplos arquivos
Logo, você perceberá que ter tudo em um único arquivo é insustentável. A primeira melhoria é separar os componentes em arquivos diferentes, criando uma estrutura modular e mais fácil de entender. Suponha que você tenha uma lista e cada item seja um componente individual. Aqui está uma estrutura de exemplo para isso:
src/ ├── App.js ├── List.js └── ListItem.js
Essa abordagem é prática e suficiente para pequenos projetos, onde cada componente pode ser mantido em seu próprio arquivo. Com essa estrutura, a manutenção fica mais fácil e o código mais legível.
Exemplo prático
Imagine que
App.js seja a lista principal e List.js e ListItem.js representem uma lista e seus itens. Isso pode ajudar a ter uma visão clara da função de cada arquivo:// ListItem.js const ListItem = ({ item }) => ( <li>{item.name}</li> ); export default ListItem;
// List.js import ListItem from './ListItem'; const List = ({ items }) => ( <ul> {items.map((item) => ( <ListItem key={item.id} item={item} /> ))} </ul> ); export default List;
// App.js import List from './List'; const items = [{ id: 1, name: 'Item 1' }, { id: 2, name: 'Item 2' }]; function App() { return ( <div> <h1>Minha Lista</h1> <List items={items} /> </div> ); } export default App;
Passo 3: separando componentes em pastas próprias
Conforme o projeto evolui, separar os componentes em pastas próprias faz todo sentido. Cada pasta pode conter o componente em si e arquivos relacionados, como estilos e testes. Isso facilita na organização e torna os arquivos fáceis de encontrar.
src/ ├── components/ │ ├── App/ │ │ ├── App.js │ │ ├── App.test.js │ │ └── App.css │ └── List/ │ ├── List.js │ ├── ListItem.js │ └── List.css
Assim, cada pasta é uma “cápsula” de funcionalidade e responsabilidade, contendo apenas os arquivos necessários para aquele componente.
Passo 4: componentes genéricos e específicos
Para projetos maiores, separar componentes genéricos e reutilizáveis dos componentes específicos faz toda a diferença. Componentes como botões, inputs e modais podem ficar em uma pasta
components, enquanto componentes específicos, como formulários de autenticação, ficam em features.src/ ├── components/ │ ├── Button/ │ └── Input/ ├── features/ │ ├── Auth/ │ │ ├── Login.js │ │ └── Register.js └── services/ └── api.js
Essa estrutura permite que componentes e funções reutilizáveis sejam facilmente acessados, enquanto os específicos permanecem organizados em suas funcionalidades.
Exemplo: componente de botão e formulário de login
Com a estrutura acima, você pode ter um botão reutilizável para várias partes da aplicação e um formulário de login específico para a funcionalidade de autenticação.
// Button.js const Button = ({ children, onClick }) => ( <button onClick={onClick}>{children}</button> ); export default Button;
// Login.js import Button from '../../components/Button'; const Login = () => { return ( <form> <input type="text" placeholder="Usuário" /> <input type="password" placeholder="Senha" /> <Button>Entrar</Button> </form> ); }; export default Login;
Passo 5: estrutura para contextos, hooks e serviços
Conforme o projeto cresce ainda mais, você começa a usar Context API e hooks customizados para lidar com estados e lógicas específicas. É importante separar esses recursos em pastas próprias para manter o código mais organizado.
src/ ├── components/ │ └── Button/ ├── context/ │ └── AuthContext.js ├── features/ │ └── Auth/ │ ├── Login.js │ └── Register.js ├── hooks/ │ ├── useAuth.js │ └── useFetch.js └── services/ └── api.js
Essa estrutura oferece uma separação clara:
context/mantém os contextos para estados globais, comoAuthContext.js.
hooks/mantém a lógica customizada reutilizável.
services/centraliza as chamadas API.
Explicação:
- Contextos globais: armazene contextos que gerenciam estados compartilhados em toda a aplicação na pasta
src/context/. Isso facilita o acesso e a manutenção desses estados.
- Contextos específicos: se um contexto for muito específico de uma funcionalidade e não for usado em outras partes da aplicação, você pode optar por mantê-lo dentro da pasta da
featurecorrespondente. No entanto, para fins de clareza e padronização, recomendamos centralizar os contextos emsrc/context/.
Passo 6: usando arquivos index.js para facilitar importações
Um truque prático para melhorar a legibilidade do código e organizar as importações é o uso de arquivos
index.js dentro de cada pasta de componentes e também na pasta components/. Eles funcionam como pontos de exportação, simplificando as importações em outros arquivos.Dentro do componente:
// src/components/Button/index.js export { default as Button } from './Button';
Na pasta
components/:// src/components/index.js export { Button } from './Button'; // Exporte outros componentes conforme necessário
Assim, ao importar o componente em outro arquivo, você pode fazer de forma mais direta:
import { Button } from './components';
Isso torna suas importações mais organizadas e o código mais limpo, especialmente em projetos com muitos componentes. O uso de arquivos
index.js centraliza as exportações, facilitando o acesso aos componentes sem precisar especificar caminhos complexos.Passo 7: simplificando importações com caminhos absolutos
Conforme seu projeto cresce, lidar com importações relativas pode se tornar um desafio. Felizmente, podemos configurar nosso projeto para usar caminhos absolutos, facilitando as importações e evitando confusões.
Configurando o jsconfig.json (para JavaScript) ou tsconfig.json (para TypeScript)
Para projetos em JavaScript, crie um arquivo
jsconfig.json na raiz do seu projeto com o seguinte conteúdo:{ "compilerOptions": { "baseUrl": "src" }, "include": ["src"] }
Para projetos em TypeScript, ajuste seu
tsconfig.json para incluir o baseUrl:// tsconfig.json { "compilerOptions": { "baseUrl": "src", // outras configurações }, // outras configurações }
Essa configuração define a pasta
src como o diretório base para as importações. Agora, você pode importar módulos usando caminhos absolutos a partir de src, em vez de caminhos relativos.Exemplo prático de importação com caminho absoluto
Antes (com caminho relativo):
// src/features/Auth/Login.js import Button from '../../components/Button';
Depois (com caminho absoluto):
// src/features/Auth/Login.js import Button from 'components/Button';
Isso torna suas importações mais diretas e o código mais legível, especialmente quando você tem uma estrutura de pastas profunda.
Observações importantes
- Certifique-se de que seu bundler ou ferramenta de construção (como Webpack, Vite ou Create React App) suporta a configuração de
baseUrl. No Create React App, a configuração dojsconfig.jsonoutsconfig.jsonjá é suportada nativamente.
- Após configurar o
baseUrl, reinicie seu servidor de desenvolvimento para que as mudanças entrem em vigor.
Benefícios de usar caminhos absolutos
- Legibilidade: importações mais curtas e claras.
- Manutenção: facilita a refatoração e a movimentação de arquivos sem quebrar importações.
- Produtividade: reduz erros causados por caminhos relativos complexos.
Passo 8: gerenciando estilos com CSS Modules ou Styled Components
A maneira como você lida com os estilos em um projeto React pode influenciar significativamente a organização das pastas e a escalabilidade do seu código.
CSS Modules
Os CSS Modules permitem que você escreva estilos em arquivos
.module.css, que são escopados localmente por padrão. Isso significa que as classes CSS definidas em um componente não afetarão outros componentes, evitando conflitos de nomenclatura.Estrutura de pastas com CSS Modules:
src/ ├── components/ │ ├── Button/ │ │ ├── Button.js │ │ └── Button.module.css
Exemplo de uso:
// Button.js import styles from './Button.module.css'; const Button = ({ children, onClick }) => ( <button className={styles.button} onClick={onClick}> {children} </button> ); export default Button;
Button.module.css
.button { background-color: #6200ee; color: white; padding: 8px 16px; border: none; border-radius: 4px; }
Styled Components
Styled Components é uma biblioteca que permite escrever estilos CSS dentro do JavaScript usando o conceito de CSS-in-JS. Os estilos são vinculados diretamente aos componentes, promovendo encapsulamento e facilitando a manutenção.
Instalação:
npm install styled-components
Estrutura de pastas com Styled Components:
src/ ├── components/ │ └── Button.js
Exemplo de uso:
// Button.js import styled from 'styled-components'; const StyledButton = styled.button` background-color: #6200ee; color: white; padding: 8px 16px; border: none; border-radius: 4px; &:hover { background-color: #3700b3; } `; const Button = ({ children, onClick }) => ( <StyledButton onClick={onClick}>{children}</StyledButton> ); export default Button;
Impacto na organização das pastas e arquivos
- Com CSS Modules:
- Os arquivos de estilo (
.module.css) ficam próximos aos componentes, mantendo a coesão. - Evita conflitos de nomes de classes, já que os estilos são escopados localmente.
- Com Styled Components:
- Os estilos são escritos no mesmo arquivo do componente, reduzindo a quantidade de arquivos.
- Facilita a reutilização de componentes estilizados e a aplicação de temas.
Vantagens dessas abordagens
- Escopo local de estilos: previne que estilos vazem para outros componentes.
- Melhor manutenção: estilos e componentes juntos facilitam a leitura e atualização do código.
- Reutilização e composição: fácil criação de componentes estilizados reutilizáveis.
Escolhendo a abordagem certa
A escolha entre CSS Modules e Styled Components depende das necessidades do seu projeto e preferências da equipe. Ambas as abordagens são amplamente adotadas e têm suporte ativo na comunidade.
Estrutura de um projeto React (exemplo)
Aqui está um exemplo de estrutura de pastas para um projeto React completo, incluindo pastas para componentes, hooks, contextos, serviços, testes e muito mais. Vamos detalhar cada seção para que você saiba exatamente onde colocar cada tipo de arquivo.
my-rocketseat-app/ ├── public/ │ └── index.html ├── src/ │ ├── assets/ # Imagens e arquivos estáticos │ ├── components/ # Componentes reutilizáveis │ │ ├── Button/ │ │ │ ├── Button.js │ │ │ ├── Button.test.js │ │ │ └── Button.css │ │ └── Modal/ │ │ ├── Modal.js │ │ ├── Modal.test.js │ │ └── Modal.css │ ├── context/ # Contextos para estado global │ │ └── AuthContext.js │ ├── features/ # Funcionalidades específicas da aplicação │ │ ├── Auth/ │ │ │ ├── Login.js │ │ │ ├── Register.js │ │ │ └── authSlice.js │ │ └── Dashboard/ │ │ ├── Dashboard.js │ │ ├── Dashboard.css │ │ └── Dashboard.test.js │ ├── hooks/ # Hooks personalizados │ │ ├── useAuth.js │ │ └── useFetch.js │ ├── pages/ # Páginas principais da aplicação │ │ ├── Home.js │ │ └── Profile.js │ ├── services/ # Serviços de API e outras integrações externas │ │ ├── api.js │ │ └── authService.js │ ├── styles/ # Estilos globais │ │ ├── variables.css │ │ └── main.css │ ├── utils/ # Utilitários e funções auxiliares │ │ ├── formatDate.js │ │ └── slugify.js │ ├── App.js │ ├── index.js │ └── setupTests.js # Configurações globais para testes ├── .env # Variáveis de ambiente ├── package.json └── README.md
Explicação de cada pasta
assets/: Armazena imagens, ícones e outros arquivos estáticos. Ideal para manter esses arquivos organizados fora do código principal.
Conheça o Rocketseat Para Empresas
Oferecemos soluções personalizadas para empresas de todos os portes.
Artigos_
Explore conteúdos relacionados
Descubra mais artigos que complementam seu aprendizado e expandem seu conhecimento.
NewsletterReceba conteúdos inéditos e novidades gratuitamente

