NestJS 12. ESM.

It’s happening.

Вышел долгожданный релиз.(Я и правда ждал, после поста от Камиля на LinkedIn). Было очень интересно, как реализуют перенос на ESM, насколько это повлияет на фреймворк, у которого довольно больным местом была совместимость с ESM и существенно ушедшей вперед экосистемой JS.

Что изменилось?

Главное изменением является переход на ESM. Core пакеты теперь публикуются как ES Modules, а при создании нового проекта можно выбрать ESM сразу.

При этом существующие проекты на CJS никто мигрировать не заставляет. Благодаря require(esm) в современных версиях Node.js они продолжают работать и с NestJS 12.

Для новых ESM-проектов стек теперь выглядит заметно современнее:

  • ESM
  • Vitest
  • Oxlint
  • Rspack
  • Standard Schema вместо ClassValidator/ClassTransformer

Минимальная версия Node.js тоже поднялась: нужен Node 20.19+ или 22.12+.

Сам переход на ESM давно назрел. Особенно на фоне библиотек, которые всё чаще выпускаются только в ESM, и современного тулинга в Node.js, который уже давно развивается именно в эту сторону. Очень многие пакеты из экосистемы становятся доступны прямо из коробки - и это здорово.

Для старых проектов мигрировать с CJS на ESM прямо сейчас необязательно, в то время как для новых - выбор CJS кажется сомнительным.

Что можно попробовать?

Я бы в первую очередь обратил внимание на новый подход к валидации через Standart Schema. Он позволяет использовать Zod, ArkType и другие библиотеки для валидации. С их использованием валидируемые запросы станут существенно быстрее чем при Class Validator и это здорово!

После этого можно попробовать Drizzle напрямую. Один из лучших инструментов как-никак.

А после этого использовать Vitest. Он, кстати, теперь является пакетом для тестирования по умолчанию в проектах, выбравших ESM.

Источники: