Un cookbook para aplicación de guía de estilo RN/Expo - ESLint, Prettier, TypeScript, revisión de PR, y CODEOWNERS conectados para que los estándares sobrevivan a la rotación sin un guardia de estilo en cada hilo.
Card de receta de referencia rápida - lista para copiar y pegar.
// package.json - los cuatro scripts que cada puerta llama{ "scripts": { "lint": "expo lint", "lint:ci": "expo lint -- --max-warnings 0", "typecheck": "tsc --noEmit", "format:check": "prettier --check .", "test": "jest" }}
# Pre-push local (secuencia idéntica a CI)npm run format:check && npm run lint:ci && npm run typecheck && npm run test
Stack de aplicación Prettier - formato (comillas, comas, orden de imports) ESLint - patrones RN/React, hooks, imports restringidos TypeScript - tipos strict - sin any implícito en src/ Template PR - puertas humanas que ESLint no puede cubrir CODEOWNERS - rutas de configuración native-touch y release
Cuándo usar esto:
El tamaño del equipo cruzó dos ingenieros y los PRs debaten formato semanalmente.
Incorporar contrataciones de React web que importan hábitos de div a RN.
# .github/workflows/quality.ymlname: Quality Gateson: pull_request: branches: [main]jobs: quality: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 20 cache: npm - run: npm ci - run: npm run format:check - run: npm run lint:ci - run: npm run typecheck - run: npm run test -- --ci
Protección de rama requiere chequeo de quality - lint rojo no puede fusionarse
Monorepo: turbo run lint typecheck test expande a través de paquetes
Paso 6 - Puertas humanas del template PR
## Estilo y estándares- [ ] Los imports usan barrels de características solamente (`@/features/<name>`)- [ ] Sin nuevo `any` sin `// eslint-disable-next-line` + comentario de ticket- [ ] Las listas usan FlashList/FlatList - sin ScrollView para feeds dinámicos- [ ] Archivos native-touch: diff de prebuild adjunto (si aplica)## Evidencia- [ ] iOS probado - build_id o captura de pantalla- [ ] Android probado - build_id o captura de pantalla
import { useState } from "react";import { View, Text } from "react-native";import { useRouter } from "expo-router";import { Button } from "@/shared/ui";import { useOrders } from "@/features/orders";import { styles } from "./styles";
Elige uno. Este cookbook usa Prettier + @ianvs/prettier-plugin-sort-imports. No habilites también reglas de orden de eslint-plugin-import - luchan en cada guardado.
¿Advertencias en CI - fallar o permitir?
Falla en main y release/* con --max-warnings 0. Las ramas de características pueden tolerar advertencias durante sprints de migración - pero la puerta de fusión es cero advertencias.
¿Cómo se relacionan las guías de estilo con expo-rules?
expo-rules son innegociables de producto/arquitectura (secretos, OTA, navegación). Las guías de estilo son higiene de código. Ambas aparecen en template de PR; las violaciones de expo-rules siempre son bloqueadores.