Skip to content

Buenas Prácticas y Reglas

Reglas críticas (rompen el build o el commit)

Section titled “Reglas críticas (rompen el build o el commit)”

Enforced por ESLint + pre-commit hooks. Si las violas, git commit falla:

ProhibidoUsar en su lugarMotivo
varconst / letBlock scoping, evita hoisting
console.log()EliminarPerformance y seguridad en producción
SVGs inline en template<Icon name="..." />Consistencia, mantenibilidad
import { ref } from 'vue'Usar ref() directoAuto-imports de Nuxt
any en TypeScriptTipo específico o unknownType safety
Colores hardcodeadosCSS variables o clases TailwindTheming por vertical
$route / $routeruseRoute() / useRouter()Composable pattern, testeable
Mutar propsEmitir evento al padreFlujo unidireccional
Comentarios HTML <!-- -->EliminarNo code comentado en producción
Magic strings/numbersExtraer a constants/Single source of truth

PrácticaDetalle
Tipar propsdefineProps<{ title: string }>() — siempre con interface
Tipar emitsdefineEmits<{ close: [] }>() — siempre explícito
Imports no usadosEliminar (ESLint los detecta)
Lógica duplicadaExtraer a composable si se repite 2+ veces
Error handlingTry-catch en toda llamada a API
AccesibilidadARIA attributes en elementos interactivos
BEM en SCSS.block__element--modifier
Mobile-firstEstilos base para móvil, luego md:, lg:

Sigue este orden para consistencia entre componentes:

// 1. Interfaces/Types locales
interface Props { ... }
// 2. Props y Emits
const props = defineProps<Props>()
const emit = defineEmits<{ ... }>()
// 3. Composables y stores
const route = useRoute()
const { showAlert } = useShowAlert()
const authStore = useAuthStore()
// 4. Estado reactivo (refs)
const isLoading = ref(false)
const items = ref<Item[]>([])
// 5. Computeds
const filteredItems = computed(() => ...)
// 6. Watchers
watch(() => props.id, (newId) => { ... })
// 7. Funciones/métodos
async function fetchData() { ... }
function handleClick() { ... }
// 8. Lifecycle hooks
onMounted(fetchData)

Convenciones de commit (Conventional Commits)

Section titled “Convenciones de commit (Conventional Commits)”

Enforced por CommitLint. Formato:

tipo(scope): descripción imperativa en minúsculas
TipoCuándo usar
featNueva funcionalidad para el usuario
fixCorrección de bug
refactorReestructuración sin cambio funcional
styleCambios de formato (no CSS — eso es refactor)
testTests nuevos o modificados
docsDocumentación
choreDependencias, configuración, build
ciPipeline CI/CD
Terminal window
feat(checkout): add discount code validation
fix(auth): resolve infinite loop on token refresh
refactor(services): extract common query builder
chore(deps): update ecom-components to latest
test(buyflow): add unit tests for subscription popup logic
  • Todo en minúsculas (no empezar con mayúscula)
  • Sin punto final
  • Verbo en imperativo: “add” no “added” ni “adding”
  • Máximo ~72 caracteres en primera línea
  • Scope es opcional pero recomendado

Formato: [número-issue]-[descripción-corta-en-kebab-case]

302-typing-refactorization
330-implement-pdf-download
343-add-discount-connection

Al ejecutar git commit, Husky lanza automáticamente:

  1. ESLint → auto-fix en archivos .ts, .vue
  2. Stylelint → auto-fix en archivos .css, .scss, .vue
  3. Prettier → formateo general
  4. CommitLint → valida formato del mensaje

Si cualquiera falla → commit abortado. Corrige el error y reintenta.

Tip: Si el hook corrige archivos automáticamente, necesitarás hacer git add . de nuevo antes de reintentar el commit.


1. Actualiza main: git checkout main && git pull
2. Crea branch: git checkout -b 999-mi-feature
3. Desarrolla con commits frecuentes (conventional commits)
4. Pre-commit: pnpm lint:fix && pnpm styles:fix && pnpm format
5. Push: git push -u origin 999-mi-feature
6. Crea PR en GitHub con template:
- Issue vinculado (#999)
- Tipo de cambio (feature/fix/refactor)
- Descripción de lo implementado
- Screenshots si hay cambios de UI
7. GitHub Copilot hace auto-review
8. Corrige feedback del review
9. Merge a main → deploy automático a producción
10. Elimina la branch

PrácticaCuándo aplicar
shallowRefObjetos grandes que no necesitan reactividad profunda en propiedades internas
v-memoListas largas con renders costosos que raramente cambian
defineAsyncComponentComponentes pesados (modales, PDFs, widgets)
Lazy-load de rutasNuxt lo hace automático por cada página
v-if vs v-showv-if si se muestra rara vez; v-show si alterna frecuentemente

ErrorCausa probableSolución
”Cannot read property of undefined”Dato no cargado aúnv-if="data" guard antes de acceder
ESLint falla en commitCódigo con issuespnpm lint:fix manual
Componente AE no renderizaNo instaladopnpm install + verificar nuxt.config
Estilos no aplicanEspecificidad o scopedVerificar con DevTools
useServices retorna nullNombre incorrectoVerificar que existe en visibleVertical.services
Ruta 404Archivo mal ubicadoVerificar path en pages/
Alert no apareceLlamado fuera de setupuseShowAlert() debe estar en setup del componente
Build falla con type errorTipo incorrectovue-tsc --noEmit para ver todos los errores