Вышел NestJS v12: ESM, схемы и Rspack

NestJS выпустил мажорную версию 12. Все официальные пакеты переведены на ESM, но приложения могут оставаться на CommonJS благодаря require(esm). В ядре появилась нативная поддержка Standard Schema для валидации, а Rspack стал стандартным бандлером для монорепозиториев.

NestJS выпустил мажорную версию 12. Все официальные пакеты переведены на ESM, но приложения могут оставаться на CommonJS благодаря require(esm). В ядре появилась нативная поддержка Standard Schema для валидации, а Rspack стал стандартным бандлером для монорепозиториев.

Все официальные пакеты NestJS теперь распространяются как ESM-модули. Это не ломает существующие проекты на CommonJS — Node.js умеет загружать ESM через require(esm), поэтому прикладной код может оставаться без изменений. Разработчики получили возможность постепенно переходить на ESM, когда будут готовы.

Главное преимущество такого подхода — совместимость с современным JavaScript-окружением и более простая интеграция с инструментами, которые ожидают ESM. Если вы решите мигрировать приложение, потребуется добавить "type": "module" в package.json, переключить moduleResolution на nodenext в tsconfig.json, указывать расширения .js в импортах и заменить __dirname на import.meta.dirname. Команда nest upgrade эти изменения не вносит — она выполняет только механические правки, специфичные для NestJS.

Standard Schema: единый интерфейс валидации

В ядро фреймворка добавлена нативная поддержка спецификации Standard Schema. Это общий интерфейс для библиоек валидации и сериализации, который уже реализован в Zod, Valibot и ArkType. Теперь в декораторах @Body(), @Query(), @Param() и других можно напрямую использовать схемы этих библиотек без дополнительных адаптеров.


import { Body, Controller, Post } from '@nestjs/common';

import { z } from 'zod';

const createCatSchema = z.object({

  name: z.string(),

  age: z.number(),

  breed: z.string(),

});

@Controller('cats')

export class CatsController {

  @Post()

  create(@Body() body: z.infer<typeof createCatSchema>) {

    // body уже провалидирован и типизирован

  }

}

Для включения валидации достаточно зарегистрировать StandardSchemaValidationPipe глобально или на уровне контроллера. Аналогично работает StandardSchemaSerializerInterceptor — он сериализует ответ, используя ту же схему. Это устраняет необходимость в отдельных пакетах вроде @nestjs/zod и унифицирует работу с разными библиотеками.

Новый CLI и автоматический апгрейд

Инструмент командной строки NestJS полностью переписан. Появилась команда nest upgrade, которая автоматически применяет изменения, необходимые для перехода с 11-й версии на 12-ю: обновляет зависимости, корректирует конфигурационные файлы и выполняет другие механические правки. При этом исходный код приложения не переводится в ESM — разработчик сам решает, когда и нужно ли это делать.

При создании нового проекта через nest new теперь можно выбрать модульную систему: CommonJS или ESM. Для ESM-проектов по умолчанию предлагается Vitest вместо Jest и oxlint вместо ESLint, что заметно ускоряет линтинг и тестирование.

Rspack — стандартный бандлер для монорепозиториев

Для монорепозиториев, создаваемых с помощью NestJS, стандартным сборщиком стал Rspack — быстрая альтернатива webpack, написанный на Rust. Он полностью совместим с конфигурацией webpack, но обеспечивает значительно более высокую скорость сборки. Разработчики, которые используют одиночные приложения, по-прежнему могут выбирать любой бандлер.

Другие улучшения

  • Добавлен новый модуль @nestjs/observe для интеграции с OpenTelemetry.
  • Минимальная версия Node.js повышена до 20.19 или 22.12 — это необходимо для корректной работы ESM-пакетов.
  • Пакет @nestjs/config обновлён и теперь требует явного вызова ConfigModule.forRoot() с указанием путей к файлам конфигурации.

Как обновиться

Если вы используете NestJS 11, выполните:


nest upgrade

Команда обновит зависимости и применит все необходимые изменения. Для ручного обновления изучите официальный гайд по миграции. Проекты на CommonJS продолжат работать без дополнительных действий.

Источники и материалы

Ответить