После увиденного меня никак не покидает мысль о том, что мир куда-то повернул не туда с этим ESM. Посмотри сам:
* В TS проектах мы пользуемся ESM-like, но в 99% случаев проект коспилируется в CJS.
* Webpack и Vite позволяют нам импортить что угодно и это отбило необходимоть задумываться "а что происходит при импорте?". CJS, ESM, CSS, картинки? Пиши import и не думай. Бандлер сам всё сделает. Ну или хотя бы попытается.
* У нас нет скрипта миграции с CJS на ESM. Мы должны всё делать руками для конвертации проекта в новый стандарт. А делать там дофига чего надо:
-
require синхронный, из-за чего сделать автозамену на динамический импорт попросту невозможно. Нельзя () => require('lib') превратить в () => await import('lib'). Ты получаешь попросту сломанный код.- module.exports - это объект, а export {} - это кусок синтаксиса. Мы не можем динамику превратить в статику
- module.exports мутабелен. Ты из одной зависимости можешь изменить состояние в другой.
- jest.mock не умеет нормально в ESM. Тут я бы порекомендовал конвертить тесты в Vitest. Там всё ок.
И это только то, что сразу пришло в голову.
Но даже с этим можно было взять стратегию ESLint'a: исправляем то, что можем, об остальном сообщаем. Но и этого нет.
В итоге я прихожу к тому, что sindresorhus сделал всё правильно(https://t.me/xavescor_code/18), а текущий мир - это помойка, в котором никто не понимает как работают импорты в его проекте. И это прямо неприятно. В итоге мы походу будем всегда жить в мире, где мы пишем не на js/ts, а на Вебпаке, Роллапе или Витесте. Как минимум пока не появится герой, который сможет автоматизировать переход на ESM.