Сравнение режимов работы

Режимы работы Ajv формируют поведение валидатора на трёх уровнях: этап компиляции схемы, этап выполнения валидации и этап формирования ошибок. Разница между режимами влияет на производительность, строгость проверки и предсказуемость результата.

Одним из ключевых механизмов является строгий режим, который управляет тем, насколько жёстко библиотека относится к некорректным или неоднозначным схемам.

Строгий режим (strict)

В строгом режиме Ajv анализирует схему на этапе компиляции и выбрасывает ошибки при обнаружении:

  • неизвестных ключевых слов;
  • некорректных типов значений;
  • устаревших или конфликтующих конструкций;
  • неоднозначных правил валидации.

Основная цель — выявить ошибки схемы до выполнения валидации данных.

Особенности поведения:

  • повышенная надёжность схем;
  • раннее обнаружение ошибок;
  • более строгая совместимость с JSON Schema спецификацией;
  • потенциальная необходимость адаптации старых схем.

Пример эффекта строгого режима — ошибка при использовании несуществующего keyword:

const Ajv = require("ajv");
const ajv = new Ajv({ strict: true });

В таком режиме даже небольшие отклонения от стандарта приводят к исключениям.

Нестрогий режим

В нестрогом режиме Ajv допускает:

  • неизвестные ключи в схемах;
  • устаревшие конструкции;
  • потенциально неоднозначные определения.

Такой режим используется для совместимости со старыми проектами, где схемы могли быть написаны под ранние версии спецификации.

Особенности:

  • гибкость при миграции;
  • снижение количества ошибок на этапе компиляции;
  • риск скрытых логических проблем.

Режим обработки ошибок: fail-fast и накопление

Ajv может работать в двух стратегиях обработки ошибок валидации.

Fail-fast режим

В этом режиме проверка прекращается при первой найденной ошибке.

Характеристики:

  • высокая скорость валидации;
  • минимальная нагрузка;
  • отсутствие полного списка проблем.

Используется, когда важна производительность и достаточно знать факт невалидности данных.

Режим накопления ошибок (allErrors)

При включении параметра allErrors валидатор продолжает проверку всех правил, собирая полный список нарушений.

const ajv = new Ajv({ allErrors: true });

Особенности:

  • полный отчёт о несоответствиях;
  • полезен в формах и UI-валидации;
  • увеличивает время выполнения.

Разница между режимами особенно заметна на сложных вложенных схемах.

Режим компиляции схем

Ajv разделяет работу на два этапа: компиляция схемы и её выполнение.

Режим компилированных валидаторов

При использовании compile схема преобразуется в оптимизированную функцию:

const validate = ajv.compile(schema);
validate(data);

Особенности:

  • высокая производительность;
  • повторное использование скомпилированной функции;
  • минимальные накладные расходы при многократных проверках.

Этот режим считается основным в высоконагруженных системах.

Режим прямой валидации

Альтернативный подход:

ajv.validate(schema, data);

Здесь схема компилируется автоматически при каждом использовании или берётся из кеша.

Особенности:

  • удобство использования;
  • меньшая производительность при частых вызовах;
  • полезен для разовых проверок.

Режимы генерации кода

Ajv использует генерацию JavaScript-кода для ускорения валидации.

Интерпретируемый режим

В этом режиме логика проверки выполняется через универсальный валидатор.

Характеристики:

  • меньшая скорость;
  • гибкость;
  • упрощённая отладка.

Используется редко, в основном для диагностики.

Режим компиляции в код

Основной режим Ajv основан на генерации специализированной функции под каждую схему.

Особенности:

  • максимальная производительность;
  • отсутствие интерпретации на этапе выполнения;
  • возможность кеширования функций.

Это фундаментальная оптимизация библиотеки.

Режимы обработки типов данных

Ajv может автоматически преобразовывать входные данные.

coerceTypes

При включении этого режима значения приводятся к нужному типу:

const ajv = new Ajv({ coerceTypes: true });

Примеры преобразований:

  • строка "123" → число 123
  • "true"true

Особенности:

  • удобство при работе с API;
  • снижение количества ошибок ввода;
  • риск неявных преобразований.

Без преобразования типов

В стандартном режиме типы проверяются строго:

  • "123" не равно числу 123;
  • несоответствие приводит к ошибке.

Такой режим обеспечивает предсказуемость данных.

Режим установки значений по умолчанию

useDefaults

Позволяет автоматически заполнять отсутствующие поля:

const ajv = new Ajv({ useDefaults: true });

Особенности:

  • модификация входного объекта;
  • заполнение undefined значений;
  • зависимость от схемы.

Различают два варианта:

  • runtime-дополнение — значения подставляются при валидации;
  • compile-time оптимизация — значения встраиваются в сгенерированный код.

Режимы работы с дополнительными полями

removeAdditional

Управляет удалением лишних свойств:

  • false — игнорирование дополнительных полей;
  • true — удаление всех лишних полей;
  • "all" — удаление рекурсивно на всех уровнях.

Особенности:

  • контроль структуры данных;
  • защита от неожиданных полей;
  • потенциальная мутация входного объекта.

Режимы совместимости со стандартами JSON Schema

Ajv поддерживает разные версии спецификации:

  • Draft 7;
  • Draft 2019-09;
  • Draft 2020-12.

Каждая версия вводит различия в:

  • ключевых словах;
  • логике объединения схем;
  • обработке ссылок $ref.

Влияние режима стандарта

Выбор версии влияет на:

  • поведение валидатора;
  • набор допустимых конструкций;
  • совместимость с внешними схемами.

Режим строгой типизации схем

strictTypes

Контролирует соответствие типов внутри схем:

  • предотвращает неоднозначные типы;
  • требует явного описания;
  • выявляет логические ошибки.

strictTuples

Отдельный режим для массивов-кортежей:

  • проверка фиксированной длины;
  • контроль позиции элементов;
  • запрет лишних значений.

Режим асинхронной валидации

Ajv поддерживает асинхронные ключевые слова, например проверку через внешние источники.

Особенности async-режима

  • возвращает Promise;
  • поддерживает сетевые проверки;
  • увеличивает задержку выполнения.

Пример поведения:

  • синхронная схема → мгновенный результат;
  • асинхронная схема → отложенная проверка.

Режим производительности и кеширования

Ajv активно использует кеш компиляции схем.

Кеширование валидаторов

  • повторное использование функций;
  • снижение времени компиляции;
  • оптимизация при массовых проверках.

Standalone режим

Позволяет генерировать независимый код валидатора:

  • исключение runtime зависимости Ajv;
  • максимальная производительность;
  • использование в production-сборках.

Сравнение режимов по характеристикам

Производительность

  • максимальная: скомпилированные валидаторы, code generation;
  • средняя: прямой вызов validate;
  • низкая: интерпретируемая валидация.

Строгость

  • высокая: strict mode, strictTypes;
  • средняя: стандартная конфигурация;
  • низкая: нестрогий режим.

Подробность ошибок

  • максимальная: allErrors;
  • минимальная: fail-fast режим.

Гибкость

  • высокая: coerceTypes, useDefaults;
  • низкая: строгая типизация без преобразований.

Итоговое сопоставление режимов

Различные режимы Ajv образуют систему компромиссов между:

  • скоростью выполнения;
  • точностью диагностики;
  • предсказуемостью данных;
  • совместимостью со стандартами;
  • удобством разработки.

Комбинация параметров определяет итоговое поведение валидатора и его применимость в конкретной архитектуре приложения.