Генерация нескольких модульных форматов с tsc
Никита БалихинВ предыдущем посте я предлагал поставлять библиотеки пользователям в нескольких модульных форматах одновременно. На этот раз поговорим о том, как сделать это наиболее удобным и эффективным образом.
Несколько конфигов
Самым простым способом будет создание нескольких конфигураций tsc.

Каждый из этих конфигов будет наследовать параметры из корневого tsconfig и отвечать за отдельный тип выходных артефактов: CommonJS, ESM и типы.

Сборку в таком случае можно осуществлять просто путём запуска tsc несколько раз с разными конфигами. Все три запуска tsc независимы, поэтому их можно осуществить параллельно, например с помощью команды run-p из пакета npm-run-all.

В результате сборки, как и ожидалось, получим три разных артефакта.

Остаётся только указать в package.json входные точки пакета, чтобы инструментарий пользователя библиотеки понимал, как с ней работать.

Несмотря на то, что сборка всех типов артефактов происходит параллельно, это всё ещё не максимально эффективный вариант, поскольку исходный код для всех трёх сборок один и тот же и парсить его tsc будет 3 раза. На эту тему в репозитории TypeScript давно заведён issue, но кажется ожидать прогресса по этой фиче пока не стоит.
@rushstack/heft
Чтобы вместо создания тонны однотипных конфигов в библиотеках переиспользовать пайплайн сборки Microsoft сделали утилиту Heft.
Эта утилита решает большинство задач, возникающих в процессе разработки библиотеки:
- сборка в несколько модульных форматов;
- запуск api-extractor;
- проверка кодстайла с ESLint;
- тестирование кода с Jest;
- сборка приложения с помощью Webpack.
Heft позволяет вместо создания отдельного tsconfig для CommonJS указать дополнительные модульные форматы в typescript.json.

Для переиспользования пайплайна сборки Heft предлагает механизм "риггинга" конфигов.
Я сделал небольшую демку, демонстрирующую основные возможности Heft, в том числе "риггинг".