package.json "type" y exports
Los campos "type" y "exports" de package.json definen cómo Node resuelve tu paquete; reemplazan los campos main ambiguos y bloquean los archivos internos de las importaciones profundas.
Busca en todas las páginas de la documentación
"type" y exportsLos campos "type" y "exports" de package.json definen cómo Node resuelve tu paquete; reemplazan los campos main ambiguos y bloquean los archivos internos de las importaciones profundas.
{
"name": "@acme/billing-sdk",
"type": "module",
"exports": {
".": {
"import": "./dist/index.js",
"require": "./dist/index.cjs"
},
"./package.json": "./package.json"
},
"files": ["dist"]
}Cuándo usar esto:
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';// solo dentro del paquete @acme/shared-types
import { helper } from '#internal/helper.js';Lo que esto demuestra:
"exports" es la única superficie importable; las rutas profundas fallan sin una coincidencia./users) publican puntos de entrada enfocados sin la sobrecarga de los barrel files"imports" mapea alias internos (#internal/*) para atajos privados del paquete"./package.json" cuando las herramientas necesitan leer metadatos"type": "module" - Los archivos .js son ESM; usa .cjs para CommonJS intencional."exports" - Las claves del objeto son subrutas públicas; los valores son archivos de destino u objetos condicionales."import", "require", "node", "default" seleccionan variantes por cada resolvedor.ERR_PACKAGE_PATH_NOT_EXPORTED.| Clave | Significado |
|---|---|
"." | Importación de la raíz del paquete |
"./feature" | Entrada de característica de subruta |
"./package.json" | Exportación explícita de metadatos |
"#alias" | Mapa de importación interno (campo imports) |
{
"exports": {
".": {
"types": "./dist/index.d.ts",
"import": "./dist/index.js"
}
}
}Empareja la condición "types" (o typesVersions) para que los consumidores obtengan las tipificaciones que coincidan con la exportación.
main sin exports - las herramientas modernas aún pueden permitir importaciones profundas. Solución: añade "exports" para encapsular..js en los destinos de exportación - debe apuntar a archivos que existan después de la compilación. Solución: comprueba en CI que dist coincida con exports.import y require rompen instanceof. Solución: prefiere solo ESM para paquetes de aplicaciones; documenta para librerías."./src/*" expone internos. Solución: exporta solo artefactos de dist.exports apuntan a dist compilado en paquetes publicados.| Alternativa | Cuándo usar | Cuándo NO usar |
|---|---|---|
Solo campos main + module | Librerías heredadas sin mantenimiento | Paquetes nuevos en 2026 |
| Solo alias de ruta de TypeScript | Atajos internos de la aplicación | Paquetes npm publicados |
publishConfig.exports | Anulación específica de npm | Publicación de un solo registro |
| Sin API pública (aplicación, no librería) | Servicio desplegable privado | Paquete de monorepo compartido |
Trata los archivos .js como ESM. Usa .cjs para archivos CommonJS en el mismo paquete.
No se recomienda para librerías; exporta JS compilado más .d.ts para una resolución estable del consumidor.
El consumidor importó una ruta no listada en exports; es una encapsulación intencional funcionando.
El resolvedor coincide las condiciones en orden: import vs require vs default según el algoritmo de Node.
Mapa de importación privado del paquete para #aliases; no para consumidores externos.
Sí, "./features/*": "./dist/features/*.js" mapea muchas entradas con un solo patrón.
Los ejecutores de pruebas deben respetar exports; pueden necesitar moduleNameMapper o condiciones de importación predeterminadas.
Opcional para aplicaciones privadas, recomendado para paquetes de monorepo consumidos por servicios hermanos.
Proporciona ambas condiciones import y require apuntando a compilaciones .js y .cjs; prueba ambas rutas.
El array files aún controla el contenido del tarball; exports controla la importabilidad en tiempo de ejecución.
Comienza con ".": "./dist/index.js" equivalente al antiguo main, luego elimina las rutas de importación profunda que usaban los consumidores.
"types" de nivel superior apunta a las tipificaciones raíz; la condición "types" por exportación es más precisa para las subrutas.
Versiones de la pila: Esta página fue escrita para Node.js 24.18.0 (LTS activa), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 y NestJS 11.
Revisado por Chris St. John·Última actualización: 16 jul 2026