advanced
Package exports
Проектируйте public APIs packages через exports maps, conditional exports, subpath exports, types и backwards compatibility.
Поле `exports` в `package.json` задаёт публичную поверхность — импортировать можно только перечисленные пути; это блокирует случайные deep imports и даёт условные точки входа.
{
"name": "my-lib",
"type": "module",
"exports": {
".": {
"import": "./dist/index.js",
"require": "./dist/index.cjs",
"types": "./dist/index.d.ts"
},
"./utils": "./dist/utils.js"
}
}
Условия: `import`, `require`, `node`, `default` и кастомные. Subpath patterns (`./features/*`) масштабируют API без экспорта всего дерева.
Публикация ESM и CJS — отдельные файлы или dual build; `exports` фиксирует, что получит consumer.
На интервью: как `exports` блокирует `pkg/src/internal`; обратно совместимые subpath; условие `types` и резолв TS 4.7+.
Типовые ошибки: нет `types` в exports; ломаете недокументированные пути; несовпадение `import`/`require`.
Компромисс — между простотой, производительностью, безопасностью и эксплуатацией: назовите, что оптимизировали и какую цену приняли.
Чеклист:
- Явный `exports` для библиотек.
- Subpath вместо deep src.
- Тесты для ESM и CJS при dual.
- Публичный API в changelog.