Генерация нескольких модульных форматов с tsc

Генерация нескольких модульных форматов с tsc

Никита Балихин

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

Несколько конфигов

Самым простым способом будет создание нескольких конфигураций tsc.

Несколько tsconfig

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

Конфигурация для каждого типа артефактов

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

Команды сборки в package.json

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

Выходные артефакты

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

Входные точки в package.json

Несмотря на то, что сборка всех типов артефактов происходит параллельно, это всё ещё не максимально эффективный вариант, поскольку исходный код для всех трёх сборок один и тот же и парсить его tsc будет 3 раза. На эту тему в репозитории TypeScript давно заведён issue, но кажется ожидать прогресса по этой фиче пока не стоит.

@rushstack/heft

Чтобы вместо создания тонны однотипных конфигов в библиотеках переиспользовать пайплайн сборки Microsoft сделали утилиту Heft.

Эта утилита решает большинство задач, возникающих в процессе разработки библиотеки:

  • сборка в несколько модульных форматов;
  • запуск api-extractor;
  • проверка кодстайла с ESLint;
  • тестирование кода с Jest;
  • сборка приложения с помощью Webpack.

Heft позволяет вместо создания отдельного tsconfig для CommonJS указать дополнительные модульные форматы в typescript.json.

typescript.json

Для переиспользования пайплайна сборки Heft предлагает механизм "риггинга" конфигов.

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

Report Page