Límites de Importación
Las reglas de límites de importación imponen una arquitectura en capas para que las rutas no accedan a los internos de la base de datos y las aplicaciones no importen desplegables hermanos.
Receta
Tarjeta de receta de referencia rápida - lista para copiar y pegar.
npm install -D eslint-plugin-import-x{
rules: {
"import-x/no-restricted-paths": [
"error",
{
zones: [
{
target: "./src/routes",
from: "./src/db",
message: "Las rutas deben llamar a los servicios, no directamente a la capa de la base de datos",
},
],
},
],
},
}Cuándo usarlo:
- Monorepos con
apps/ypackages/. - Carpetas en capas:
routes→services→repositories. - Necesitas una aplicación automatizada, no solo diagramas en el README.
Ejemplo de Funcionamiento
apps/orders-api/src/
routes/
services/
repositories/
db/
// eslint.config.js
import importX from "eslint-plugin-import-x";
export default [
{
plugins: { "import-x": importX },
files: ["apps/orders-api/src/**/*.ts"],
rules: {
"import-x/no-restricted-paths": [
"error",
{
zones: [
{
target: "./src/routes/**",
from: "./src/db/**",
},
{
target: "./src/routes/**",
from: "./src/repositories/**",
message: "Usa servicios desde las rutas",
},
{
target: "./src/services/**",
from: "./src/routes/**",
message: "Los servicios no deben importar rutas",
},
],
},
],
"import-x/no-extraneous-dependencies": [
"error",
{ devDependencies: ["**/*.test.ts", "eslint.config.js"] },
],
},
},
];// MAL: src/routes/orders.ts
import { pool } from "../db/pool.js"; // Error de ESLint
// BIEN: src/routes/orders.ts
import { createOrder } from "../services/orders.js";Lo que esto demuestra:
no-restricted-pathsbloquea importaciones específicas de carpeta a carpeta.no-extraneous-dependenciesevita que dependencias fantasma se eleven.- Los mensajes documentan la arquitectura prevista en fallos de CI.
Inmersión Profunda
Cómo Funciona
- ESLint resuelve las rutas de importación relativas al archivo que se está linting.
- Las zonas definen
target(glob del importador) yfrom(glob de la fuente prohibida). - Los monorepos añaden zonas que impiden que
apps/aimporteapps/b. - Nx utiliza
@nx/enforce-module-boundariescon etiquetas para una aplicación similar.
Ejemplo de Zona de Monorepo
{
zones: [
{
target: "./apps/**",
from: "./apps/**",
except: ["./apps/shared-config"],
message: "Las aplicaciones importan packages/, no otras aplicaciones",
},
],
}Notas de TypeScript
- Usa extensiones
.jsen los especificadores de importación cuando"moduleResolution": "NodeNext". - Las reglas de límites complementan los
exportsdepackage.json- ambos deben estar de acuerdo.
Errores comunes
- Las importaciones relativas eluden los límites del paquete -
../../packages/foo/src. Solución: importa solo el nombre del paquete@acme/foo. - Zonas demasiado amplias - Bloqueando utilidades de prueba compartidas legítimas. Solución: globs
exceptpara**/*.test.ts. - Los archivos barril reexportan todo -
index.tsse convierte en una laguna. Solución: restringe los barriles o lint la superficie de la API pública con knip. - Falsos positivos en alias de ruta - El resolvedor de ESLint no está configurado. Solución:
import-x/resolver-typescriptconprojectService. - Reglas sin CI - Los desarrolladores se saltan localmente. Solución:
npm run lintrequerido en PR.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Límites de módulo de Nx | Monorepo de Nx con etiquetas | API de un solo paquete |
| dependency-cruiser | Informes de gráficos y puertas de CI | Solo necesitas ESLint en la configuración existente |
| Solo revisión de código | Prototipo de equipo de 2 personas | Escalar más allá de un servicio |
Preguntas Frecuentes
¿import-x vs plugin de importación?
eslint-plugin-import-x es el fork mantenido con soporte de configuración plana. Prefiere import-x para nuevos proyectos.
¿Cómo funcionan los límites con los módulos de NestJS?
Restringe las importaciones entre módulos a través de zonas personalizadas o límites de módulos documentados de Nest; evita que los módulos de dominio importen infraestructura hacia atrás.
¿Pueden los paquetes importar devDependencies en las pruebas?
Configura no-extraneous-dependencies con patrones de archivo devDependencies que incluyan **/*.test.ts.
¿Cómo permito que los scripts importen cualquier cosa?
Bloque de configuración de ESLint separado para scripts/** con reglas desactivadas o relajadas.
¿Los límites reemplazan la revisión de código?
No. Atrapan errores estructurales; la revisión aún juzga el diseño de la API.
¿Cómo se manejan las importaciones dinámicas?
El análisis estático puede pasar por alto await import(variable). Los límites cubren principalmente las importaciones estáticas.
¿Qué pasa con el paquete de tipos compartidos?
packages/contracts no debe depender de nada interno; todas las aplicaciones pueden importarlo.
¿Cómo pruebo las reglas de límites?
Añade un archivo fixture que viole intencionalmente una zona en test/fixtures excluido de producción o espera pruebas de reglas de ESLint.
¿La carga automática de Fastify afecta las zonas?
La carga automática aún resuelve a archivos bajo src/routes; las zonas se aplican de la misma manera.
¿Puedo aplicar solo la API pública?
Combina no-restricted-paths con package.json exports y knip exportaciones no utilizadas.
Relacionado
- Conceptos básicos de Linting - configuración plana
- Nx para Backends de Node - límites basados en etiquetas
- Monorepo de Múltiples Servicios - reglas de aplicación vs paquete
Versiones de la pila: Esta página fue escrita para Node.js 24.18.0 (LTS Activo), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 y NestJS 11.