Noções Básicas de Padrões
10 exemplos de convenções de equipe além do ESLint - nomenclatura, pastas e regras de toque nativo que sobrevivem a mudanças de SDK e a novos contratados. Sete básicos e três intermediários.
Busque em todas as páginas da documentação
10 exemplos de convenções de equipe além do ESLint - nomenclatura, pastas e regras de toque nativo que sobrevivem a mudanças de SDK e a novos contratados. Sete básicos e três intermediários.
Comece com um projeto Expo SDK 57 com TypeScript e Expo Router. Os padrões vivem em docs/CONTRIBUTING.md (ou docs/standards.md) e são aplicados na revisão de PR - não apenas no chat.
npx create-expo-app@latest MyApp --template default@sdk-57
cd MyApp
npx expo lint{
"dependencies": {
"expo": "~57.0.4",
"react": "19.2.3",
"react-native": "0.86.0"
}
}Ferramentas: Estes exemplos visam Expo SDK 57 (
expo~57.0.4), React Native 0.86.0 e React 19.2.3. A configuração do ESLint está em Noções Básicas de Linting; as regras do projeto estão em Checklist de Regras do Projeto Expo.
Publique uma tabela - debata uma vez, referencie para sempre.
| Artefato | Convenção | Exemplo | Evitar |
|---|---|---|---|
| Componentes React | PascalCase | OrderSummaryCard.tsx | orderSummary.tsx |
| Hooks | use + camelCase | useOrders.ts | OrdersHook.ts |
| Pastas de rotas (Expo Router) | kebab-case | app/order-history/ | app/orderHistory/ |
| Pastas de features | kebab-case | src/features/order-history/ | src/features/OrderHistory/ |
| Constantes (escopo de módulo) | SCREAMING_SNAKE | MAX_RETRY_COUNT | maxRetry |
| Arquivos de teste | Sufixo .test.ts(x) | useOrders.test.ts | useOrders.spec.js |
| Configuração específica do ambiente | development, preview, production | Nomes de perfil EAS | dev, prod2 |
// src/features/order-history/components/OrderSummaryCard.tsx
export function OrderSummaryCard({ orderId }: { orderId: string }) {
return null;
}grep e jump-to-definition do IDE permanecem previsíveishooks/ dentro da feature ou em src/shared/hooks/ quando entre featuresorderId) mesmo quando o segmento da URL é kebab-caseRelacionado: Prettier & Ordenação de Importações - formatação não é nomenclatura | Padrões de Código e Guias de Estilo - manual de aplicação
Alinhe com Noções Básicas de Arquitetura Mobile: app/ fina, src/features/ gorda.
MyApp/
├── app/ # apenas rotas - sem lógica de negócio
│ ├── (tabs)/
│ │ ├── index.tsx
│ │ └── orders/
│ │ └── [id].tsx
│ └── _layout.tsx
├── src/
│ ├── shared/ # api, primitivos de ui, helpers de configuração
│ ├── entities/ # User, Order - substantivos do domínio
│ └── features/
│ ├── auth/
│ │ ├── index.ts # api pública
│ │ ├── screens/
│ │ ├── components/
│ │ ├── hooks/
│ │ └── model/
│ └── orders/
├── plugins/ # plugins de configuração - zona de toque nativo
├── app.config.ts
├── eas.json
└── docs/
├── CONTRIBUTING.md # padrões vivem aqui
└── adr/app/ devem reexportar telas de features - uma linha quando possívelsrc/features/<nome>/index.ts é o único caminho de importação que outros módulos usamplugins/ e app.config.ts disparam revisão nativa - veja regras de toque nativo abaixosrc/utils/ - promova para shared/ com um propósito nomeadoRelacionado: Checklist de Regras do Projeto Expo - Regras de pasta Nível 2
// ✅ Correto - o consumidor importa do barrel da feature
import { OrdersScreen, type Order } from "@/features/orders";
// ❌ Errado - acopla a refatoração interna
import { OrderRow } from "@/features/orders/components/OrderRow";// src/features/orders/index.ts
export { OrdersScreen } from "./screens/OrdersScreen";
export type { Order } from "./model/types";
// Não exporte OrderRow a menos que outra feature realmente precise delano-restricted-imports pode impor caminhos @/features/*/* - veja Regras Personalizadas do ESLint para RNsrc/shared/ui/ - não exporte internos irmãos// app/(tabs)/orders/index.tsx
export { OrdersScreen as default } from "@/features/orders";// app/orders/[id].tsx - o parsing de parâmetros permanece na camada de rota
import { useLocalSearchParams } from "expo-router";
import { OrderDetailScreen } from "@/features/orders";
export default function OrderDetailRoute() {
const { id } = useLocalSearchParams<{ id: string }>();
if (!id) return null;
return <OrderDetailScreen orderId={id} />;
}_layout.tsx) possuem provedores e configuração de stack/tab - não regras de negócio de feature| Caminho / ação | Proprietário padrão | Requisito de PR |
|---|---|---|
ios/, android/ (CNG gitignored) | EAS Build / expo prebuild | Sem commits manuais - regenere |
ios/, android/ (commitado) | Esquadrão de plataforma mobile | Dois revisores + build_id do dispositivo |
plugins/*.ts | Líder de plataforma + feature | Diff expo prebuild --clean anexado |
Array de plugins app.config.ts | O mesmo que plugins | Saída npx expo config --type public no PR |
Credenciais eas.json | Gerente de lançamento | Sem edições de perfil "de passagem" |
metro.config.js, babel.config.js | Infra / mobile sênior | Explique o impacto no bundle |
# Após mudança de plugin ou SDK - obrigatório em equipes CNG
npx expo prebuild --clean
git diff ios/ android/Info.plist garante a sobrescrita pelo EASdocs/adr/ - "temporário" sem ADR se torna anos de desvioRelacionado: Regras de Módulos Nativos - quando JS não é suficiente
feat/SHIP-412-order-summary-sheet
fix/SHIP-419-crash-on-logout
chore/upgrade-expo-sdk-57
spike/expo-ui-tab-bar
release/2.6.0
hotfix/2.5.1feat, fix, chore, spikespike/* nunca faz merge em main sem resultado de ADR - veja Spikes, PoCs e Nova Arquiteturachore/upgrade-* - não misturados com trabalho de featureRelacionado: Noções Básicas de Git para Equipes Mobile
Ambiente EAS: development | preview | production
Arquivos .env: .env.local (gitignored), .env.example (commitado)
Variáveis públicas em tempo de execução: Apenas EXPO_PUBLIC_* - nunca segredos
Configuração: app.config.ts lê process.env no tempo de build// app.config.ts - padrão
const IS_DEV = process.env.APP_ENV === "development";
export default {
expo: {
extra: {
apiUrl: process.env.EXPO_PUBLIC_API_URL,
},
},
};EXPO_PUBLIC_* são embutidos no tempo de bundle - trate como visíveis para usuários; veja Regras de Segurança para Mobile.env.example documenta cada chave necessária com valores de placeholder - o onboarding copia para .env.localeas.json correspondem a development / preview / production - sem staging2apps/
mobile/ # App Expo - consumidor principal
packages/
ui/ # @myorg/ui - componentes RN compartilhados
api-client/ # @myorg/api-client - camada de fetch
tsconfig/ # @myorg/tsconfig - bases compartilhadas{
"name": "@myorg/ui",
"main": "src/index.ts",
"peerDependencies": {
"react": "19.2.3",
"react-native": "0.86.0"
}
}src/index.ts - mesma regra de barrel que featureslint / typecheck - Portões de Qualidade de CIAo adicionar um plugin de configuração ou módulo nativo personalizado:
plugins/
withMySdk.ts # plugin de configuração
src/modules/
my-sdk/ # módulo Expo local opcional
expo-module.config.json
ios/
android/# Checklist de PR para PRs de toque nativo
npx expo prebuild --clean
npx expo-doctor
eas build --profile preview --platform allwith* - um plugin por arquivoexpo prebuildCommit docs/CONTRIBUTING.md com marcadores aplicáveis - link a partir do template de PR.
# Padrões Mobile (SDK 57)
## Nomenclatura
- Componentes: Arquivos PascalCase correspondendo à exportação
- Rotas: Pastas kebab-case sob app/
## Importações
- Features: importar apenas de @/features/<nome>
- Sem exportações padrão em hooks/utils - apenas exportações nomeadas
## Toque Nativo
- Sem edições manuais de ios/ android/ sob CNG
- Mudanças em plugins/ exigem diff de prebuild --clean no PR
## Revisão
- PRs de UI: Screenshot iOS + Android ou build_id
- PRs de Toque Nativo: Revisor de plataforma exigido
## Exceções
- Registrar em docs/adr/NNNN-titulo.md - link no PRESLint pega sintaxe e anti-padrões selecionados. Ele não conhece seus limites de feature, propriedade nativa ou política de merge de spikes. Padrões documentam arquitetura e processo que ESLint não pode expressar sem regras personalizadas de difícil manutenção.
Formas de API externas podem usar snake_case em adaptadores (mapOrderFromApi). A camada TypeScript/React permanece camelCase - transforme na fronteira shared/api, não em componentes.
Engenheiro de software ou líder mobile + ADR escrito. Um hotfix de emergência pode fazer merge com ADR retroativo dentro de um sprint - não "documentaremos depois" indefinidamente.
Versões da Stack: Esta página foi escrita para React 19.2.3, React Native 0.86.0 e Expo SDK 57 (
expo~57.0.4).
Revisado por Chris St. John·Última atualização: 19 de jul. de 2026