Zod Compiler: схемы Zod на этапе сборки — до 75x быстрее
TypeScript · Июнь 2026

Zod Compiler: валидация на этапе сборки
в 2–75 раз быстрее

zod-compiler — новый плагин для сборщиков, который компилирует схемы Zod в валидаторы с нулевыми накладными расходами. Установите плагин, оставьте существующий код на Zod и получите ускорение валидации в 2–75 раз.

Олег Максимов 18 июня 2026 12 мин чтения

Что такое zod-compiler?

zod-compiler — это плагин времени сборки от Гайюса Куизинаса (автора Slonik и многих других TypeScript-инструментов), который компилирует схемы Zod в оптимизированные валидаторы. Он работает с Vite, webpack, esbuild, Rollup, Rolldown, rspack, Bun и Farm — то есть с любым современным сборщиком.

Ключевая идея в том, что runtime-валидация Zod обходит дерево схемы при каждом вызове: для каждого z.string(), z.object() и z.union() Zod проходит по внутреннему представлению и проверяет типы узел за узлом. Скомпилированный валидатор сворачивает этот обход в единственное булево выражение — или switch-диспетчеризацию для объединений — устраняя все накладные расходы на обход узлов.

Версия 1.13.1 опубликована в npm 17 июня 2026 года, проект набрал более 322 звёзд на GitHub и активно развивается. Протестирован в продакшен-проектах с десятками тысяч схем Zod.

Краткие факты

Установка и настройка

1. Установка пакета

npm install --save-dev zod-compiler
# или
pnpm add -D zod-compiler
# или
yarn add -D zod-compiler

2. Подключение плагина

Для Vite (самый распространённый вариант):

// vite.config.ts
import { defineConfig } from "vite";
import zodCompiler from "zod-compiler/vite";

export default defineConfig({
  plugins: [zodCompiler()],
});

Для других сборщиков путь импорта меняется:

Сборщик Импорт
VitezodCompiler from "zod-compiler/vite"
webpackzodCompiler from "zod-compiler/webpack"
esbuildzodCompiler from "zod-compiler/esbuild"
RollupzodCompiler from "zod-compiler/rollup"
RolldownzodCompiler from "zod-compiler/rolldown"
rspackzodCompiler from "zod-compiler/rspack"
BunzodCompiler from "zod-compiler/bun"
FarmzodCompiler from "zod-compiler/farm"

3. Готово

В автоматическом режиме (по умолчанию) плагин сканирует все файлы, импортирующие из "zod", находит экспортированные схемы Zod и компилирует их на этапе сборки. Ваши файлы со схемами остаются чистым Zod:

// src/schemas/user.ts — без изменений, чистый Zod
import { z } from "zod";

export const CreateUserSchema = z.object({
  name: z.string().min(1).max(100),
  email: z.email(),
  age: z.number().int().min(0).max(150),
  role: z.enum(["admin", "editor", "viewer"]),
});

export const UpdateUserSchema = z.object({
  name: z.string().min(1).max(100).optional(),
  email: z.email().optional(),
});

Код использования тоже остаётся прежним:

import { CreateUserSchema } from "./schemas/user";

const user = CreateUserSchema.parse(data);  // компилируется в оптимизированный валидатор
const result = CreateUserSchema.safeParse(data);  // { success, data/error }

Ноль конфигурации, ноль изменений кода

Смысл zod-compiler в том, что вам не нужно о нём думать. Установите плагин, настройте один раз в конфиге сборки, и каждая схема Zod в проекте автоматически скомпилируется. API — .parse(), .safeParse(), .parseAsync(), .safeParseAsync() — остаётся идентичным.

Три способа использования

Автоматический режим (рекомендуется)

Как показано выше: добавьте плагин, и каждая экспортированная схема Zod в проекте скомпилируется автоматически. Статический предфильтр пропускает файлы, чьи экспорты заведомо не могут быть схемами (функции, компоненты, константы), без их выполнения.

Автоматический режим также включает поднятие схем (schema hoisting) — схемы, определённые внутри функций (компоненты React, обработчики запросов, хелперы), перемещаются на уровень модуля:

// До: схема пересоздаётся при каждом вызове
function getSchema() {
  return z.object({ name: z.string() });
}

// После (результат сборки): схема создаётся один раз при загрузке модуля
const _zh_schema = z.object({ name: z.string() });
function getSchema() {
  return _zh_schema;
}

Это значит, что схема внутри React-компонента, проверяющая пропсы, или внутри обработчика запроса, создаётся один раз при загрузке модуля, а не при каждом вызове. Компилятор также дедуплицирует идентичные схемы в единую привязку.

Явный режим с compile()

Если вы предпочитаете явное включение, оберните отдельные схемы в compile():

import { z } from "zod";
import { compile } from "zod-compiler";

const UserSchema = z.object({
  name: z.string().min(3),
  email: z.email(),
});

export const validateUser = compile(UserSchema);

// В dev: использует runtime Zod
// После сборки: AOT-скомпилированный валидатор
validateUser.parse(data);

В паре с schemas: "explicit" в опциях плагина compile() становится единственным путём компиляции — автоматическое сканирование отключается. Это идеально для постепенного внедрения в больших кодовых базах.

CLI-режим (без сборщика)

Для проектов без сборщика или для разовой компиляции:

# Один файл
npx zod-compiler generate src/schemas.ts -o src/schemas.compiled.ts

# Директория
npx zod-compiler generate src/ -o src/compiled/

# Режим отслеживания
npx zod-compiler generate src/ --watch

# Удаление неизвестных ключей из вывода z.object()
npx zod-compiler generate src/ --strip-unknown-keys

Сравнение производительности

Бенчмарк сравнивает zod-compiler с Zod v3, Zod v4, Typia и AJV. Результаты в ops/s (выше — лучше), измерено на Apple M4 Max.

Сценарий Zod v4 zod-compiler vs Zod v4
Простая строка 14.4M 16.2M 1.1x
Строка (min/max) 8.0M 17.2M 2.2x
Enum 12.3M 16.9M 1.4x
Кортеж [string, int, bool] 6.5M 17.0M 2.6x
Set<string> (20 эл.) 695K 12.1M 17x
Map<string, number> (20 эл.) 361K 8.6M 24x
Discriminated union (3 варианта) 4.0M 16.1M 4.0x
Объект среднего размера (валидный) 2.4M 10.3M 4.3x
Объект среднего размера (невалидный) 80K 15.5M 194x
Большой объект (100 полей) 19K 1.4M 73x
Глубоко вложенный объект (243 листа) 19K 1.2M 64x
Рекурсивное дерево (121 узел) 142K 2.3M 16x

Наибольший прирост дают вложенные объекты, большие схемы и некорректные данные (где Zod строит дорогие объекты ошибок, а скомпилированный валидатор откладывает материализацию ошибок). Случай с невалидным объектом достигает 194x, потому что быстрый путь отклоняет некорректный ввод одной булевой проверкой — дорогое дерево ошибок никогда не создаётся.

Архитектура производительности

zod-compiler использует двухфазный валидатор:

  1. Быстрый путь — цепочка булевых выражений через &&, проверяющая весь ввод с нулевым выделением памяти. Корректный ввод возвращается мгновенно.
  2. Медленный путь — валидация со сбором ошибок, запускается только если быстрый путь не прошёл. Объект ошибки строится лениво — при обращении к .error.

Дополнительные оптимизации: порядок проверок (сначала дешёвые), предварительно скомпилированные регулярные выражения, Set-поиск для enum, инлайнинг маленьких enum (≤5 значений через ===), O(1) switch-диспетчеризация для discriminated unions и автоопределение обычных z.union размеченных объектов.

Типовой охранник .is()

Скомпилированные схемы предоставляют дополнительный метод: .is(input): input is T. Для большинства схем (объекты, примитивы, массивы, enum без coerce, default, catch или transform) это самая дешёвая проверка «совпадает ли?»:

// Вместо safeParse().success:
if (UserSchema.is(data)) {
  data.email; // сужение до типа вывода схемы
}

// Фильтрация невалидных элементов:
const valid = items.filter((x) => UserSchema.is(x));

Охранник .is() возвращает булево значение без единого выделения памяти — никакого SafeParseResult, никакого массива ошибок, никакого дерева. Он сопоставим с Typia is<T>() и является чистой заменой schema.safeParse(x).success.

Размер бандла и tree-shaking

zod-compiler спроектирован для минимального влияния на размер бандла:

Совместимость и интеграция

Скомпилированная схема сохраняет полную совместимость с API Zod. Оптимизированные методы parse/safeParse/parseAsync/ safeParseAsync устанавливаются непосредственно на исходный объект схемы:

Библиотеки, принимающие схемы Zod, работают без изменений:

Практические соображения

Побочные эффекты в файлах схем

В автоматическом режиме плагин выполняет файлы для проверки экспортов. Если файл схемы имеет побочные эффекты (запускает сервер, подключается к БД), они выполнятся на этапе сборки. zod-compiler защищает от этого:

Простейший способ избежать проблем — использовать include:

zodCompiler({
  include: ["src/schemas", "src/validators"],
});

Интеграция с CI

zod-compiler имеет постоянный кэш трансформаций в node_modules/.cache/zod-compiler. Записи кэша самопроверяются по хешам содержимого зависимостей — восстановление устаревшего кэша вызывает перекомпиляцию, но никогда не выдаёт устаревший вывод:

- uses: actions/cache@v4
  with:
    path: node_modules/.cache/zod-compiler
    key: zod-compiler-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}

Постепенное внедрение

Для больших существующих кодовых баз начните с schemas: "explicit" и оберните только самые горячие пути — схемы, валидируемые чаще всего или на самых больших объёмах данных. Валидация API-запросов, проверка строк БД и обработчики форм — цели с наибольшим эффектом.

FAQ

Что такое zod-compiler?
zod-compiler — это плагин сборки от Гайюса Куизинаса, который компилирует схемы Zod в оптимизированные валидаторы. Работает с Vite, webpack, esbuild, Rollup, Rolldown, rspack, Bun и Farm. Не требует изменений в исходном коде — сохраните существующие схемы Zod и получите ускорение валидации в 2–75 раз.
Нужно ли менять существующий код Zod?
Нет. В автоматическом режиме (по умолчанию) zod-compiler сам находит все экспортированные схемы Zod в вашем проекте и компилирует их. Просто добавьте плагин в конфиг сборки. Также есть явный режим через compile() для постепенного внедрения и CLI для проектов без бандлера.
Насколько быстрее zod-compiler по сравнению с обычным Zod?
Бенчмарки показывают ускорение от 2 до 75 раз. Простые строки — около 1.1x, глубоко вложенные объекты из 100 полей — 73x, валидация некорректных данных — 194x, map с 20 записями — 24x. Компилятор использует двухфазную валидацию: быстрый путь с нулевым выделением памяти для корректных данных и ленивое построение ошибок.
Совместим ли zod-compiler с tRPC, Hono и React Hook Form?
Да. zod-compiler сохраняет полный API Zod на скомпилированных схемах — identity, .shape, ._zod, Standard Schema (~standard), instanceof, .meta(), z.globalRegistry и z.toJSONSchema(). Библиотеки, принимающие схемы Zod, работают без изменений.
Может ли zod-compiler компилировать схемы внутри функций?
Да. Поднятие схем включено по умолчанию. Схемы внутри функций (React-компоненты, обработчики запросов) автоматически перемещаются на уровень модуля — схема создаётся один раз при загрузке модуля, а не при каждом вызове функции. Поднимаются только выражения из импортов и литералов.
Как zod-compiler обрабатывает побочные эффекты?
zod-compiler перехватывает process.exit во время сборки и устанавливает process.env.ZOD_COMPILER для оповещения модулей. Используйте опции include/exclude чтобы ограничить сканируемые файлы и защитите валидацию окружения маркером ZOD_COMPILER.
Готов ли zod-compiler к продакшену?
zod-compiler v1.13.1 опубликован 17 июня 2026. Протестирован в проектах с десятками тысяч схем Zod. Более 322 звёзд на GitHub. Поддерживает 8 инструментов сборки, включает CI-кэширование и обрабатывает discriminated unions, рекурсивные типы и трансформеры.
Чем zod-compiler отличается от React Compiler?
Оба инструмента работают на этапе компиляции, но решают разные задачи. React Компилятор автоматически мемоизирует React-компоненты, устраняя лишние ререндеры. zod-compiler компилирует схемы валидации Zod в валидаторы с нулевыми накладными расходами. Если React Компилятор оптимизирует производительность рендеринга, то zod-compiler — производительность валидации данных. Они могут использоваться вместе в одном проекте: React Компилятор для UI, zod-compiler для целостности данных.

Заключение

zod-compiler — один из тех редких инструментов, который даёт драматический прирост производительности с нулевыми усилиями разработчика. Установите плагин, оставьте все существующие схемы Zod, и ваша валидация станет в 2–75 раз быстрее. Никаких изменений API, никакой миграции, никаких runtime-зависимостей.

Двухфазная архитектура — быстрый путь для корректных данных, ленивая материализация ошибок для невалидных — означает, что типичный случай (большинство данных проходит валидацию) работает так же быстро, как ручной типовой охранник. А функция поднятия схем устраняет целый класс багов производительности, когда схемы пересоздаются при каждом рендере React или каждом вызове обработчика.

Если ваш проект использует Zod — попробуйте zod-compiler. Запустите pnpm benchmark локально, чтобы увидеть улучшение на вашем железе. Цифры говорят сами за себя.

Контакты

Нужна помощь с TypeScript или валидацией данных?

Строите приложение, интенсивно работающее с данными, которому нужна эффективная валидация? Могу помочь с архитектурой и реализацией. Бесплатная первичная консультация.