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.