React
Solo componentes funcionales
Siempre usa componentes funcionales TSX con exportaciones con nombre.”Props”
Crea un tipo llamado{ComponentName}Props. Usa la desestructuración. No uses React.FC.
Sin propagación de props de una sola variable
Gestión del Estado
Átomos de Jotai para estado global
- Prefiere átomos en lugar de prop drilling
- No uses
useRefpara estado — usauseStateo átomos - Usa familias de átomos y selectores para listas
Evita renderizados innecesarios
- Extrae
useEffecty la obtención de datos en componentes sidecar hermanos - Prefiere los manejadores de eventos (
handleClick,handleChange) en lugar deuseEffect - No uses
React.memo()— en su lugar, corrige la causa raíz - Limita el uso de
useCallback/useMemo
TypeScript
typemejor queinterface— más flexible, más fácil de componer- Literales de cadena mejor que enums — excepto para los enums de codegen de GraphQL y las APIs internas de la biblioteca
- Sin
any— TypeScript estricto obligatorio - Sin importaciones de tipos — usa importaciones normales (aplicado por Oxlint
typescript/consistent-type-imports) - Usa Zod para la validación en tiempo de ejecución de objetos no tipados
JavaScript
Nomenclatura
- Variables: camelCase, descriptivas (
emailnovalue,fieldMetadatanofm) - Constantes: SCREAMING_SNAKE_CASE
- Tipos/Clases: PascalCase
- Archivos/directorios: kebab-case (
.component.tsx,.service.ts,.entity.ts) - Manejadores de eventos:
handleClick(noonClickpara la función manejadora) - Props de componentes: anteponer el nombre del componente (
ButtonProps) - Componentes con estilo: anteponer
Styled(StyledTitle)
Estilo
Usa componentes con estilo de Linaria. Usa valores del tema — evitapx, rem o colores fijos.
Importar
Usa alias en lugar de rutas relativas:Estructura de carpetas
- Los módulos pueden importar desde otros módulos, pero
ui/debe permanecer sin dependencias - Usa subcarpetas
internal/para código privado del módulo - Componentes de menos de 300 líneas, servicios de menos de 500 líneas