Limites de Importação
Regras de limite de importação aplicam arquitetura em camadas para que rotas não alcancem os internos do banco de dados e aplicativos não importem implantáveis irmãos.
Receita
Cartão de receita de referência rápida - pronto para copiar e colar.
npm install -D eslint-plugin-import-x{
rules: {
"import-x/no-restricted-paths": [
"error",
{
zones: [
{
target: "./src/routes",
from: "./src/db",
message: "Rotas devem chamar serviços, não a camada de db diretamente",
},
],
},
],
},
}Quando usar isso:
- Monorepos com
apps/epackages/. - Pastas em camadas:
routes→services→repositories. - Você precisa de aplicação automatizada, não apenas diagramas no README.
Exemplo de Trabalho
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: "Use serviços a partir das rotas",
},
{
target: "./src/services/**",
from: "./src/routes/**",
message: "Serviços não devem importar rotas",
},
],
},
],
"import-x/no-extraneous-dependencies": [
"error",
{ devDependencies: ["**/*.test.ts", "eslint.config.js"] },
],
},
},
];// RUIM: src/routes/orders.ts
import { pool } from "../db/pool.js"; // Erro do ESLint
// BOM: src/routes/orders.ts
import { createOrder } from "../services/orders.js";O que isso demonstra:
no-restricted-pathsbloqueia importações específicas de pasta para pasta.no-extraneous-dependenciesimpede que dependências fantasmas sejam elevadas.- Mensagens documentam a arquitetura pretendida em falhas de CI.
Mergulho Profundo
Como Funciona
- O ESLint resolve caminhos de importação relativos ao arquivo que está sendo verificado.
- Zonas definem
target(glob do importador) efrom(glob da origem proibida). - Monorepos adicionam zonas impedindo que
apps/aimporteapps/b. - Nx usa
@nx/enforce-module-boundariescom tags para aplicação semelhante.
Exemplo de Zona de Monorepo
{
zones: [
{
target: "./apps/**",
from: "./apps/**",
except: ["./apps/shared-config"],
message: "Apps importam packages/, não outros apps",
},
],
}Notas de TypeScript
- Use extensões
.jsem especificadores de importação quando"moduleResolution": "NodeNext". - Regras de limite complementam
exportsdopackage.json- ambos devem concordar.
Armadilhas
- Importações relativas ignoram limites de pacotes -
../../packages/foo/src. Correção: importe apenas o nome do pacote@acme/foo. - Zonas excessivamente amplas - Bloqueando utilitários de teste compartilhados legítimos. Correção: globs
exceptpara**/*.test.ts. - Arquivos Barrel reexportam tudo -
index.tsse torna uma brecha. Correção: restrinja barrels ou verifique a superfície da API pública com knip. - Falsos positivos em aliases de caminho - Resolução do ESLint não configurada. Correção:
import-x/resolver-typescriptcomprojectService. - Regras sem CI - Desenvolvedores pulam localmente. Correção:
npm run lintexigido no PR.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Limites de módulo Nx | Monorepo Nx com tags | API de pacote único |
| dependency-cruiser | Relatórios de gráfico e portões de CI | Você só precisa de ESLint na configuração existente |
| Apenas revisão de código | Protótipo de equipe de 2 pessoas | Escala além de um serviço |
FAQs
import-x vs plugin import?
eslint-plugin-import-x é o fork mantido com suporte a configuração plana. Prefira import-x para novos projetos.
Como os limites funcionam com módulos NestJS?
Restrinja importações entre módulos através de zonas personalizadas ou limites de módulo documentados pelo Nest; impeça que módulos de domínio importem infraestrutura ao contrário.
Pacotes podem importar devDependencies em testes?
Configure no-extraneous-dependencies com padrões de arquivo devDependencies incluindo **/*.test.ts.
Como permitir que scripts importem qualquer coisa?
Bloco de configuração ESLint separado para scripts/** com regras desativadas ou relaxadas.
Os limites substituem a revisão de código?
Não. Eles capturam erros estruturais; a revisão ainda julga o design da API.
Como importações dinâmicas são tratadas?
A análise estática pode perder await import(variable). Os limites cobrem principalmente importações estáticas.
E o pacote de tipos compartilhados?
packages/contracts não deve depender de nada interno; todos os aplicativos podem importá-lo.
Como testar regras de limite?
Adicione um arquivo de fixture que viola intencionalmente uma zona em test/fixtures excluído da produção ou espere testes de regra ESLint.
O autoload do Fastify afeta as zonas?
Autoload ainda resolve para arquivos em src/routes; as zonas se aplicam da mesma forma.
Posso impor apenas a API pública?
Combine no-restricted-paths com exports do package.json e exportações não utilizadas do knip.
Relacionado
- Noções Básicas de Linting - configuração plana
- Nx para Backends Node - limites baseados em tags
- Monorepo Multi-Serviço - regras de app vs pacote
Versões da Stack: Esta página foi escrita para Node.js 24.18.0 (LTS Ativo), npm 10+, TypeScript 5.6+, Express 5, Fastify 5, e NestJS 11.