Modern package development in Node.js has evolved significantly with the introduction of export maps and TypeScript integration. This guide covers everything you need to know about configuring exports in your package.json.
To use these features, you'll need:
typeExports
and proper module resolution)The exports field in package.json defines entry points for your package:
{
"name": "my-package",
"exports": {
".": {
"types": "./dist/index.d.ts",
"import": "./dist/index.mjs",
"require": "./dist/index.cjs"
}
}
}
You can expose multiple entry points with specific conditions:
{
"name": "my-package",
"exports": {
".": {
"types": "./dist/index.d.ts",
"import": "./dist/index.mjs",
"require": "./dist/index.cjs"
},
"./utils": {
"types": "./dist/utils/index.d.ts",
"import": "./dist/utils/index.mjs",
"require": "./dist/utils/index.cjs"
},
"./components/*": {
"types": "./dist/components/*.d.ts",
"import": "./dist/components/*.mjs",
"require": "./dist/components/*.cjs"
}
}
}
TypeScript 4.7+ introduced enhanced support for package exports:
{
"name": "my-package",
"exports": {
".": {
"types": "./types/index.d.ts",
"import": {
"types": "./types/index.d.mts",
"default": "./dist/index.mjs"
},
"require": {
"types": "./types/index.d.cts",
"default": "./dist/index.cjs"
}
}
}
}
Modern export maps enable better tree shaking:
// Before (potentially includes all utils)
import { specific } from 'my-package/utils';
// After (with proper exports)
import { specific } from 'my-package/utils/specific';
Example of a tree-shakeable configuration:
{
"exports": {
"./utils/*": {
"types": "./dist/utils/*.d.ts",
"import": "./dist/utils/*.mjs"
}
}
}
For backward compatibility with older Node.js versions, maintain the traditional fields:
{
"name": "my-package",
"main": "./dist/index.cjs",
"module": "./dist/index.mjs",
"types": "./dist/index.d.ts",
"exports": {
// ... modern exports configuration
}
}
Export maps are powerful but require careful consideration of your user base's environment. When implementing these features, always ensure proper testing across different Node.js and TypeScript versions.