Conceptos básicos de estándares
10 ejemplos de convenciones de equipo más allá de ESLint - reglas de nombres, carpetas y toque nativo que sobreviven a los cambios de SDK y nuevos miembros. Siete básicos y tres intermedios.
Busca en todas las páginas de la documentación
10 ejemplos de convenciones de equipo más allá de ESLint - reglas de nombres, carpetas y toque nativo que sobreviven a los cambios de SDK y nuevos miembros. Siete básicos y tres intermedios.
Comienza desde un proyecto Expo SDK 57 con TypeScript y Expo Router. Los estándares viven en docs/CONTRIBUTING.md (o docs/standards.md) y se aplican en la revisión de PR - no solo en el 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"
}
}Herramientas: Estos ejemplos están dirigidos a Expo SDK 57 (
expo~57.0.4), React Native 0.86.0, y React 19.2.3. La configuración de ESLint está en Conceptos básicos de lint; las reglas del proyecto están en Lista de verificación de reglas del proyecto Expo.
Publica una tabla - debate una vez, consulta para siempre.
| Artefacto | Convención | Ejemplo | Evita |
|---|---|---|---|
| Componentes React | PascalCase | OrderSummaryCard.tsx | orderSummary.tsx |
| Hooks | use + camelCase | useOrders.ts | OrdersHook.ts |
| Carpetas de ruta (Expo Router) | kebab-case | app/order-history/ | app/orderHistory/ |
| Carpetas de características | kebab-case | src/features/order-history/ | src/features/OrderHistory/ |
| Constantes (alcance del módulo) | SCREAMING_SNAKE | MAX_RETRY_COUNT | maxRetry |
| Archivos de prueba | sufijo .test.ts(x) | useOrders.test.ts | useOrders.spec.js |
| Config específica del entorno | development, preview, production | nombres de perfil EAS | dev, prod2 |
// src/features/order-history/components/OrderSummaryCard.tsx
export function OrderSummaryCard({ orderId }: { orderId: string }) {
return null;
}hooks/ dentro de la característica o en src/shared/hooks/ cuando es entre característicasorderId) incluso cuando el segmento de URL está en kebab-caseRelacionado: Prettier y clasificación de importaciones - el formato no es nomenclatura | Estándares de codificación y guías de estilo - libro de recetas de aplicación
Alinéate con Conceptos básicos de arquitectura móvil: app/ delgado, src/features/ grueso.
MyApp/
├── app/ # solo rutas - sin lógica de negocios
│ ├── (tabs)/
│ │ ├── index.tsx
│ │ └── orders/
│ │ └── [id].tsx
│ └── _layout.tsx
├── src/
│ ├── shared/ # api, primitivas de ui, asistentes de config
│ ├── entities/ # User, Order - sustantivos de dominio
│ └── features/
│ ├── auth/
│ │ ├── index.ts # API pública
│ │ ├── screens/
│ │ ├── components/
│ │ ├── hooks/
│ │ └── model/
│ └── orders/
├── plugins/ # config plugins - zona de toque nativo
├── app.config.ts
├── eas.json
└── docs/
├── CONTRIBUTING.md # los estándares viven aquí
└── adr/app/ deben re-exportar pantallas de características - una línea cuando sea posiblesrc/features/<name>/index.ts es la única ruta de importación que usan otros módulosplugins/ y app.config.ts desencadenan revisión nativa - ver reglas de toque nativo a continuaciónsrc/utils/ - promueve a shared/ con un propósito nombradoRelacionado: Lista de verificación de reglas del proyecto Expo - Reglas de carpetas de nivel 2
// ✅ Correcto - el consumidor importa del barril de características
import { OrdersScreen, type Order } from "@/features/orders";
// ❌ Incorrecto - se acopla a refactor interno
import { OrderRow } from "@/features/orders/components/OrderRow";// src/features/orders/index.ts
export { OrdersScreen } from "./screens/OrdersScreen";
export type { Order } from "./model/types";
// No exportes OrderRow a menos que otra característica realmente lo necesiteno-restricted-imports puede forzar rutas @/features/*/* - ver Reglas de ESLint personalizadas para RNsrc/shared/ui/ - no exportes interiores hermanos// app/(tabs)/orders/index.tsx
export { OrdersScreen as default } from "@/features/orders";// app/orders/[id].tsx - el análisis de parámetros se mantiene en la capa de ruta
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) poseen proveedores y configuración de stack/tab - no reglas de negocios de características| Ruta / acción | Propietario predeterminado | Requisito de PR |
|---|---|---|
ios/, android/ (CNG gitignored) | EAS Build / expo prebuild | Sin confirmaciones manuales - regenerar |
ios/, android/ (checked in) | Equipo de plataforma móvil | Dos revisores + device build_id |
plugins/*.ts | Líder de plataforma + característica | Diferencia de expo prebuild --clean adjunta |
app.config.ts plugins array | Igual que plugins | Salida de npx expo config --type public en PR |
eas.json credentials | Gerente de lanzamiento | Sin ediciones de perfil de paso |
metro.config.js, babel.config.js | Infra / móvil senior | Explica el impacto del bundle |
# Después de cambio de plugin o SDK - obligatorio en equipos CNG
npx expo prebuild --clean
git diff ios/ android/Info.plist garantiza la sobrescritura de EASdocs/adr/ - "temporal" sin ADR se convierte en años de desviaciónRelacionado: Reglas de módulo nativo - cuando JS no es 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 se fusiona a main sin resultado de ADR - ver Spikes, PoCs y nueva arquitecturachore/upgrade-* - no se mezclan con trabajo de característicasRelacionado: Conceptos básicos de Git para equipos móviles
EAS environment: development | preview | production
.env files: .env.local (gitignored), .env.example (committed)
Public runtime vars: EXPO_PUBLIC_* only - never secrets
Config: app.config.ts reads process.env at build time// app.config.ts - pattern
const IS_DEV = process.env.APP_ENV === "development";
export default {
expo: {
extra: {
apiUrl: process.env.EXPO_PUBLIC_API_URL,
},
},
};EXPO_PUBLIC_* se incrusta en tiempo de compilación - trátalas como visibles para los usuarios; ver Reglas de seguridad para móviles.env.example documenta cada clave requerida con valores de marcador de posición - la incorporación copia a .env.localeas.json coinciden con development / preview / production - no staging2apps/
mobile/ # Aplicación Expo - consumidor principal
packages/
ui/ # @myorg/ui - componentes RN compartidos
api-client/ # @myorg/api-client - capa de búsqueda
tsconfig/ # @myorg/tsconfig - bases compartidas{
"name": "@myorg/ui",
"main": "src/index.ts",
"peerDependencies": {
"react": "19.2.3",
"react-native": "0.86.0"
}
}src/index.ts - la misma regla de barril que las característicaslint / typecheck - Puertas de calidad de CIAl agregar un complemento de configuración o módulo nativo personalizado:
plugins/
withMySdk.ts # complemento de configuración
src/modules/
my-sdk/ # módulo Expo local opcional
expo-module.config.json
ios/
android/# Lista de verificación de PR para PR de toque nativo
npx expo prebuild --clean
npx expo-doctor
eas build --profile preview --platform allwith* - un complemento por archivoexpo prebuildConfirma docs/CONTRIBUTING.md con viñetas aplicables - enlaza desde la plantilla de PR.
# Estándares móviles (SDK 57)
## Nombres
- Componentes: Archivos PascalCase que coinciden con la exportación
- Rutas: carpetas kebab-case bajo app/
## Importaciones
- Características: importar solo desde @/features/<name>
- Sin exportaciones predeterminadas en hooks/utils - solo exportaciones nombradas
## Toque nativo
- Sin ediciones manuales de ios/ android/ bajo CNG
- Los cambios de plugins/ requieren diferencia de prebuild --clean en PR
## Revisión
- PR de UI: captura de pantalla de iOS + Android o build_id
- PR de toque nativo: revisor de plataforma requerido
## Excepciones
- Registra en docs/adr/NNNN-title.md - enlaza en PRESLint detecta la sintaxis y patrones anti seleccionados. No conoce tus límites de características, propiedad nativa, o política de fusión de spike. El documento de estándares arquitectura y proceso que ESLint no puede expresar sin reglas personalizadas no mantenibles.
Las formas de API externas pueden usar snake_case en adaptadores (mapOrderFromApi). La capa TypeScript/React se mantiene en camelCase - transforma en el límite shared/api, no en componentes.
Personal o ingeniero móvil líder + ADR escrito. El hotfix de emergencia puede fusionarse con ADR retroactivo dentro de un sprint - no "documentaremos más tarde" indefinidamente.
Versiones de stack: Esta página fue escrita para React 19.2.3, React Native 0.86.0, y Expo SDK 57 (
expo~57.0.4).
Revisado por Chris St. John·Última actualización: 19 jul 2026