package.json "type" & exports
Os campos "type" e "exports" do package.json definem como o Node resolve seu pacote - eles substituem campos main ambíguos e bloqueiam arquivos internos contra importações profundas.
Busque em todas as páginas da documentação
"type" & exportsOs campos "type" e "exports" do package.json definem como o Node resolve seu pacote - eles substituem campos main ambíguos e bloqueiam arquivos internos contra importações profundas.
{
"name": "@acme/billing-sdk",
"type": "module",
"exports": {
".": {
"import": "./dist/index.js",
"require": "./dist/index.cjs"
},
"./package.json": "./package.json"
},
"files": ["dist"]
}Quando usar isso:
import '@acme/pkg/src/internal/foo.js'exports (TypeScript 5.6+, webpack 5, Node 24){
"name": "@acme/shared-types",
"type": "module",
"exports": {
".": "./dist/index.js",
"./users": "./dist/users.js",
"./package.json": "./package.json"
},
"imports": {
"#internal/*": "./src/internal/*.js"
}
}// consumer.ts
import { UserDto } from '@acme/shared-types/users';// dentro do pacote @acme/shared-types apenas
import { helper } from '#internal/helper.js';O que isso demonstra:
"exports" é a única superfície importável - caminhos profundos falham sem uma correspondência./users) publicam pontos de entrada focados sem inchaço de barril"imports" mapeia aliases internos (#internal/*) para atalhos privados do pacote"./package.json" quando as ferramentas precisam ler metadados"type": "module" - Arquivos .js são ESM; use .cjs para CommonJS intencional."exports" - As chaves do objeto são subcaminhos públicos; os valores são arquivos de destino ou objetos condicionais."import", "require", "node", "default" escolhem variantes por resolvedor.ERR_PACKAGE_PATH_NOT_EXPORTED.| Chave | Significado |
|---|---|
"." | Importação raiz do pacote |
"./feature" | Ponto de entrada de recurso de subcaminho |
"./package.json" | Exportação explícita de metadados |
"#alias" | Mapa de importação interna (imports field) |
{
"exports": {
".": {
"types": "./dist/index.d.ts",
"import": "./dist/index.js"
}
}
}Combine a condição "types" (ou typesVersions) para que os consumidores recebam tipagens que correspondam à exportação.
main sem exports - ferramentas modernas ainda podem permitir importações profundas. Correção: adicione "exports" para encapsular..js nos destinos de exportação - deve apontar para arquivos que existem após a compilação. Correção: verificação de CI de que dist corresponde a exports.import e require quebram instanceof. Correção: prefira apenas ESM para pacotes de aplicativos; documente para bibliotecas."./src/*" expõe internos. Correção: exporte apenas artefatos de dist.exports aponta para dist compilado em pacotes publicados.| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
Apenas campos main + module | Bibliotecas legadas não mantidas | Novos pacotes em 2026 |
| Apenas aliases de caminho do TypeScript | Atalhos internos do aplicativo | Pacotes npm publicados |
publishConfig.exports | Sobrescrita específica do npm | Publicação em um único registro |
| Nenhuma API pública (aplicativo não é biblioteca) | Serviço implantável privado | Pacote de monorepo compartilhado |
Trata arquivos .js como ESM. Use .cjs para arquivos CommonJS no mesmo pacote.
Desencorajado para bibliotecas - exporte JS compilado mais .d.ts para resolução estável do consumidor.
O consumidor importou um caminho não listado em exports - encapsulamento intencional funcionando.
O resolvedor corresponde às condições em ordem - import vs require vs default de acordo com o algoritmo do Node.
Mapa de importação privado do pacote para #aliases - não para consumidores externos.
Sim - "./features/*": "./dist/features/*.js" mapeia muitas entradas com um padrão.
Os executores de teste devem respeitar exports - podem precisar de moduleNameMapper ou condições de importação padrão.
Opcional para aplicativos privados, recomendado para pacotes de monorepo consumidos por serviços irmãos.
Forneça condições import e require apontando para compilações .js e .cjs - teste ambos os caminhos.
O array files ainda controla o conteúdo do tarball - exports controla a importabilidade em tempo de execução.
Comece com ".": "./dist/index.js" equivalente ao antigo main, depois remova os caminhos de importação profunda que os consumidores usavam.
O "types" de nível superior aponta para tipagens raiz; a condição "types" por exportação é mais precisa para subcaminhos.
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: 16 de jul. de 2026