Назад

Вышел Zod 4.5: Предварительная компиляция схем и сокращение памяти почти в 10 раз 🚀

Zod 4.5: новые API, ускорение safeParse, ленивое связывание методов и JIT-компиляция схем через z.compile().

Вышел Zod 4.5: Предварительная компиляция схем и сокращение памяти почти в 10 раз 🚀

Команда Zod выкатила минорный, но фундаментальный релиз 4.5. Под капотом проделали большую работу над оптимизацией рантайма и потреблением ресурсов.

Вот главные новинки и избавление от лишнего балласта:

  1. Новые API и утилиты: Добавили нативную валидацию z.creditCard(), методы z.deepPartial() / .exactPartial(), а также быстрый флаг z.validate(): boolean (простая проверка валидности без полного парсинга объекта, работает до 16 раз быстрее на битых данных).
  2. Ускорение safeParse при ошибках: Раньше при сбое валидации Zod создавал полноценный JavaScript Error со сборкой stack trace. В safeParse сборку стек-трейса отключили — ошибочный путь парсинга ускорился в ~7.5 раз.
  3. Сокращение heap-памяти в 9 раз: Изменили внутреннюю архитектуру вызова методов. Вместо привязки (.bind()) всех методов схемы при её создании, Zod 4.5 использует ленивую мемоизацию (lazy method binding). В итоге объем удерживаемой памяти на один экземпляр схемы упал с ~7.5 КБ до 784 байт.

🔥 Главная фича — z.compile()

Зачем она нужна и почему это круто?

Раньше Zod работал исключительно в интерпретируемом режиме: каждый раз при вызове .parse(data) он динамически обходил дерево вашей схемы, на каждом узле проверял типы, рекурсивно спускался по вложенным объектам, применял трансформации и формировал массив ошибок. Это удобно и гибко, но на высоких нагрузках (API-серверы, парсинг тяжелых JSON-стримов, форма с сотнями полей) динамический обход дерева становился бутылочным горлышком CPU.

Что делает z.compile()?

Функция z.compile(schema) берёт декларативную структуру Zod и генерирует из неё JIT-скомпилированную валидационную функцию (через динамическую сборку кода под капотом).

Например следующая схема:

const Point = z.object({
  x: z.number(),
  y: z.number(),
});

Компилируется в следующую функцию:

const isPoint = new Function(
  "input",
  `
  if (typeof input !== "object" || input === null) return false;
  if (typeof input.x !== "number") return false;
  if (typeof input.y !== "number") return false;
  return true;
`,
);

Также можно включить автокомпиляцию глобально для всех схем в проекте, просто импортировав "zod/compile" в точке входа.

Почему это круто?

  1. Прирост скорости в 3–9 раз: Компилятор убирает оверхед на динамический обход AST-дерева Zod. Вызов parse() сразу выполняет прямолинейный, максимально оптимизированный код проверки полей. Чем сложнее и глубже схема (объекты, массивы, union-типы), тем выше буст.
  2. Нулевые изменения в API: Скомпилированная схема CompiledUser полностью сохраняет интерфейс обычной Zod-схемы — не нужно переписывать методы или менять архитектуру приложения.
  3. Ответ конкурентам (Ajv, TypeBox): Исторически Zod проигрывал в бенчмарках решениям вроде Ajv (которые валидируют JSON Schema через Ahead-of-Time / JIT компиляцию). С появлением z.compile() Zod нивелирует этот отставание по перформансу, сохраняя при этом привычный DX и строгий TypeScript-first подход.

Читать полный чейнджлог

Скопировано