Перейти к содержимому

Как это работает

На этой странице кратко описано, что tsdown делает из коробки и какие опции меняют это поведение. Подробности по каждой теме см. в соответствующих разделах по ссылкам.

Умные значения по умолчанию

tsdown анализирует package.json и tsconfig.json и подбирает разумные значения. Вот что происходит автоматически:

Когда tsdown обнаруживает...Он...
dependencies / peerDependencies в package.jsonВыносит их наружу (не включает в бандл)
Импорт из devDependency в кодеВключает пакет в выходной бандл
Поле types или typings в package.jsonВключает генерацию .d.ts
isolatedDeclarations в tsconfig.jsonИспользует быстрый путь oxc-transform для dts
engines.node в package.jsonОпределяет целевое окружение (target) по нему
type: "module" в package.jsonИспользует расширение .js для ESM (вместо .mjs)
entry не задан, но есть src/index.tsБерёт его как точку входа по умолчанию
platform: "node" (по умолчанию)Включает fixedExtension (.mjs/.cjs)
Сборка в двух форматах с exports: trueЗаполняет поля main/module в package.json
Изменения конфига в режиме наблюденияПерезапускает сборку

Ниже каждая область описана подробнее.

Зависимости

При публикации библиотеки у пользователей устанавливаются её dependencies и peerDependencies. Нет смысла включать их в бандл — в рантайме они уже будут доступны.

Поведение по умолчанию:

  • dependencies и peerDependencies выносятся наружу — в выводе остаются import / require, пакеты в бандл не попадают.
  • devDependencies попадают в бандл, если импортированы. У пользователей они не ставятся, поэтому код из dev-зависимости автоматически встраивается в вывод.
  • Фантомные зависимости (есть в node_modules, но не указаны в package.json) обрабатываются как devDependencies — в бандл только если используются.

Основные опции:

ОпцияНазначение
deps.onlyAllowBundleСписок зависимостей, которые разрешено включать в бандл. Любая другая зависимость в бандле приведёт к ошибке. Помогает отловить случайное встраивание в больших проектах.
deps.neverBundleДополнительные пакеты, которые всегда выносить наружу (никогда не бандлить).
deps.alwaysBundleПринудительно включать указанные пакеты в бандл, даже если они в dependencies.
deps.skipNodeModulesBundleНе разрешать и не бандлить ничего из node_modules.

Подробнее: Зависимости.

Формат вывода

По умолчанию tsdown выдаёт ESM. Можно собрать несколько форматов за один запуск и задать свои опции для каждого формата.

Основные опции:

ОпцияНазначение
formatЗначения: esm, cjs, iife, umd. Несколько форматов: format: ['esm', 'cjs'].
shimsПодставлять прослойки совместимости (например, __dirname для ESM, import.meta для CJS).

Подробнее: Формат вывода.

Файлы деклараций (dts)

tsdown генерирует .d.ts, чтобы у пользователей библиотеки была полная поддержка TypeScript.

Поведение по умолчанию:

  • Если в package.json есть поле types или typings, генерация dts включается сама.
  • При включённом isolatedDeclarations в tsconfig.json tsdown использует быстрый путь oxc-transform. Иначе — компилятор TypeScript.

Основные опции:

ОпцияНазначение
dtsВключить/выключить dts или передать объект с настройками (resolver, sourcemap и др.).

Подробнее: Файлы деклараций.

Экспорты пакета

Поле exports в package.json указывает, как разрешать точки входа вашего пакета — для пользователей и бандлеров.

Поведение по умолчанию:

  • Автогенерация exports выключена. Поле exports вы заполняете сами.

При exports: true:

  • tsdown анализирует точки входа и выходные файлы и сам заполняет в package.json поля exports, main, module и types.
  • Для сборки в двух форматах (ESM + CJS) создаются условные экспорты с условиями import и require.

Основные опции:

ОпцияНазначение
exportstrue — включить автогенерацию; объект — тонкая настройка.
exports.allЭкспортировать все выходные файлы, не только точки входа.
exports.devExportsВ разработке указывать экспорты на исходники для лучшей поддержки в редакторе.
exports.customExportsФункция для изменения или дополнения сгенерированных экспортов.

Подробнее: Экспорты пакета.

Валидация пакета

tsdown интегрирован с publint и attw, чтобы находить ошибки перед публикацией в npm.

Поведение по умолчанию:

  • Оба инструмента выключены по умолчанию и являются опциональными зависимостями.

Что проверяют:

  • publint проверяет конфигурацию package.json: что exports, main, module и types указывают на существующие файлы, форматы модулей корректны, типичные ошибки подсвечиваются.
  • attw (Are the types wrong?) проверяет, что TypeScript-декларации корректно разрешаются при разных стратегиях (node10, node16, bundler), в том числе находит неверные ESM/CJS декларации.

Основные опции:

ОпцияНазначение
publintВключить: true или 'ci-only'.
attwВключить: true или объект с profile, level, ignoreRules.

Подробнее: Валидация пакета.

Остальные значения по умолчанию

Ещё несколько вещей, которые tsdown настраивает сам:

  • Директория вывода — по умолчанию dist/. Перед каждой сборкой она очищается. Чтобы не очищать, используйте --no-clean. См. Очистка.
  • Tree-shaking — включён по умолчанию, мёртвый код удаляется из вывода. См. Tree-shaking.
  • Платформа — по умолчанию node. См. Платформа.
  • Целевое окружение — берётся из поля engines в package.json или по умолчанию соответствует последней стабильной версии Node.js. См. Целевое окружение (target).

Распространяется под лицензией MIT.