Boas Práticas de Módulos
Os limites dos módulos moldam a capacidade de implantação e os refators - padronize em ESM, exports explícitos e dependências honestas no package.json, a menos que um ADR documente uma exceção de módulo duplo.
Busque em todas as páginas da documentação
Os limites dos módulos moldam a capacidade de implantação e os refators - padronize em ESM, exports explícitos e dependências honestas no package.json, a menos que um ADR documente uma exceção de módulo duplo.
"type": "module" em novos pacotes de aplicação. CJS apenas para configurações .cjs e shims legados..mjs / .cjs ao misturar sistemas em um pacote. Nunca confie na análise ambígua de .js.node: em importações built-in. Evite sombreamento e esclareça a intenção."exports" para bibliotecas e pacotes compartilhados de monorepo. Bloqueie importações profundas em src/.dependencies. Não confie em dependências fantasmas elevadas.exports para dist/ compilado, não para o código-fonte TypeScript. Consumidores executam JS que corresponde à resolução do Node."./package.json" apenas quando a ferramenta exigir. Mantenha a superfície mínima caso contrário.workspace:*) consistentemente em monorepos. Trave versões na publicação.import type para importações apenas de tipos. Habilita verbatimModuleSyntax e bundles mais limpos..js em caminhos de importação ESM relativos. Corresponde à emissão e tempo de execução do NodeNext.import() dinâmico a plugins e caminhos de código opcionais. Mantenha o grafo principal estático e analisável."module": "NodeNext" e "moduleResolution": "NodeNext". Corresponde ao resolvedor ESM do Node 24.tsconfig corrigem o tempo de execução. Emita caminhos corretos ou use ferramentas de build.verbatimModuleSyntax para novos projetos. Separa explicitamente as importações de tipo.node dist/main.js no CI, não apenas tsx src. Captura erros de extensão e exportação..d.ts ao lado do JS emitido com a condição exports de tipos correspondente.npm pack --dry-run antes de publicar. Verifique se files e exports incluem apenas os artefatos pretendidos.import quanto require se estiver publicando em modo duplo. Evite regressões de perigos de pacotes duplos.#internal para módulos privados do pacote. Nunca exponha caminhos # via exports.ERR_PACKAGE_PATH_NOT_EXPORTED em aplicativos consumidores após o aperto das exportações. Comunique alterações que quebram a compatibilidade.Não - aplicações implantam um sistema de módulos. Publicação dupla é para bibliotecas com consumidores CJS externos.
Dependências fantasmas de hoisting - a importação funciona até um npm ci limpo no Docker.
Entrada CLI com função única, ou convenção de framework - não para bibliotecas de domínio compartilhadas.
Raramente em tempo de execução - prefira subpaths de exports para API pública. Aliases são OK dentro de aplicativos se o build os impor.
Erros de compilação do ESLint import/extensions ou TypeScript moduleResolution: NodeNext.
Sim com configurações modernas do compilador - verifique se os módulos Nest de terceiros suportam ESM.
readFile + validação Zod é explícito - ou atributos de importação JSON conforme documentação do Node 24.
Não - exporte apenas a API pública curada. Barrels grandes prejudicam os tempos de compilação e as dependências circulares.
Utilitários folha primeiro, pontes createRequire temporariamente, .cjs apenas para bordas não migradas.
Mesmos princípios - pnpm é mais rigoroso sobre dependências declaradas, o que ajuda a impor esta lista.
Knip, dependency-cruiser e npm ls <pkg> no CI para importações não declaradas.
Interoperabilidade CJS ↔ ESM para pontes e perigos de pacotes duplos.
Versões da Stack: Esta página foi escrita para Node.js 24.18.0 (Active LTS), npm 10+, TypeScript 5.6+, Express 5, Fastify 5, e NestJS 11.
Revisado por Chris St. John·Última atualização: 19 de jul. de 2026