Привет! На работе пишу npm-модуль для общего использования. Модуль использует async/await. Также в модуле лежит, как принято, собранный и транспилированный babel'ем бандл в /dist. То есть, в этом бандле async/await переводятся в regeneratorRuntime.wrap/mark
Вопрос — включать ли regeneratorRuntime в бандл?
Есть три варианта, которые я знаю и которые мне не нравятся:
- Включить regeneratorRuntime в бандл.
Плюсы:
- Подключил и работает
- Чистый конфиг вебпака
Минусы:
- Оверхэд по занимаемому месту +7кб на каждый модуль. Common Chunks не работают, потому что это уже собраный бандл. Итого, если модулей будет 20, будет 140кб регенераторов, хотя достаточно одного.
- Забота перекладывается на программиста. В документации мы пишем, что для работы нужен регенератор. Программист сам ставит регенератор любым способом, как ему больше нравится
Плюсы:
- Чистая архитектура
- Нет оверхэда
Минусы:
- Возможная сложность настройки
- Выбрасываем dist из пакета, компилируем пакет при сборке проекта
Плюсы:
- Архитектурно ещё чище (нет dist, скомпиленного именно babel'ем)
- babel или его аналог, или даже его отсутствие (вдруг target — es6) сам понимает, когда надо включать регенератор, а когда нет
Минусы:
- Ещё сложнее настройка. Например, в webpack нужно будет указать исключения из node_modules, которые надо прогонять babel'ем. А к babel'ю подключать плагин transform-runtime
На самом деле, есть четвёрвый вариант — переписать в модуле все async/await на промисы, но он мне нравится ещё меньше.
Повторяя свой вопрос: какой способ (возможно, не из перечисленных) является лучшим?