Landing Builders Radar
Landing Builders Radar
@landing_builders_radar

<b>ESM ломается не в коде, а в границах: 4 места, где проект начинает «плыть»</b>

<b>ESM ломается не в коде, а в границах: 4 места, где проект начинает «плыть»</b>



В проектах на ESM чаще всего ломается не импорт как таковой, а соглашения вокруг него. Если модули живут в одном формате, а сборка — в другом, ошибки появляются в самых скучных местах: в CLI, тестах и на границе пакетов.

— Проверь, что у тебя один формат на уровне репы: либо <code>type: "module"</code>, либо явные расширения <code>.mjs</code>/<code>.cjs</code> там, где это нужно. Смешение без правил почти всегда даёт сюрпризы.

— Не полагайся на «магический» импорт без расширения. В ESM Node и часть рантаймов ждут точное имя файла. <code>./utils.js</code> и <code>./utils</code> — это не одно и то же.

— Если есть shared-пакеты в монорепе, проверь <code>exports</code> и <code>main</code>. Без явных точек входа потребитель начинает тянуть внутренности пакета, а потом ломается на рефакторинге.

— Для TypeScript отдельно смотри <code>moduleResolution</code> и <code>tsconfig-paths</code>. Алиасы в IDE могут работать, а в рантайме — нет. Это классическая ловушка при миграции.

Ещё одно правило: тестируй запуск не только через сборщик, но и напрямую через Node или тот рантайм, где код реально живёт. Так быстрее ловятся несовпадения форматов и импортов.

Если проект уже вырос, ESM лучше внедрять через границы пакетов, а не переписывать всё сразу.
Этот пост опубликован в Telegram-канале Landing Builders Radar. Подписаться можно по ссылке: @landing_builders_radar.
start

Готовы запустить рекламу через сеть public.tg?

Новый оффер, продукт, GEO, кейс, событие или партнёрский запуск — соберём маршрут под задачу и отдадим медиаплан.

Telegram для медиаплана: @dumay. Быстрый тест: $20 за канал, $1000 за пакет по сети.