Библиотека Ajv распространяется через npm и предназначена для использования в Node.js и браузерных сборках. Установка выполняется стандартными средствами менеджеров пакетов.
npm install ajv
yarn add ajv
pnpm add ajv
После установки пакет становится доступным для импорта в проекте, при этом поддерживаются как CommonJS, так и ES Modules в зависимости от конфигурации среды.
const Ajv = require("ajv");
import Ajv from "ajv";
В современных проектах предпочтительным считается ESM-формат, особенно при использовании сборщиков вроде Vite, Rollup или Webpack с соответствующей конфигурацией.
Основная точка входа — создание экземпляра Ajv. Именно через него выполняется компиляция схем и проверка данных.
import Ajv from "ajv";
const ajv = new Ajv();
Экземпляр может быть настроен через параметры конструктора. Наиболее часто используемые опции:
allErrors — сбор всех ошибок, а не остановка на
первойstrict — включение строгого режима проверки схемcoerceTypes — автоматическое приведение типовremoveAdditional — удаление лишних свойств из
объектаПример конфигурации:
const ajv = new Ajv({
allErrors: true,
coerceTypes: true,
removeAdditional: true
});
Основная концепция работы основана на JSON Schema. Сначала определяется схема, затем компилируется функция валидации.
const schema = {
type: "object",
properties: {
name: { type: "string" },
age: { type: "number" }
},
required: ["name", "age"],
additionalProperties: false
};
const validate = ajv.compile(schema);
const data = {
name: "Ivan",
age: 30
};
const valid = validate(data);
if (!valid) {
console.log(validate.errors);
}
Метод compile преобразует JSON Schema в оптимизированную
функцию проверки, что обеспечивает высокую производительность при
повторных вызовах.
После вызова функции проверки доступны два ключевых элемента:
boolean результат выполненияerrors при наличии ошибокПример структуры ошибки:
[
{
"instancePath": "/age",
"message": "must be number",
"keyword": "type",
"params": {
"type": "number"
}
}
]
Каждая ошибка содержит путь до проблемного поля и описание нарушения правила схемы.
Скомпилированная функция может использоваться многократно без повторной обработки схемы, что критично для производительности.
const validate = ajv.compile(schema);
validate({ name: "Anna", age: 25 });
validate({ name: "John", age: 40 });
Такой подход исключает необходимость повторного парсинга JSON Schema.
В проектах часто используется набор схем. Ajv поддерживает регистрацию и повторное использование через идентификаторы.
const schema = {
$id: "userSchema",
type: "object",
properties: {
id: { type: "string" }
},
required: ["id"]
};
ajv.addSchema(schema);
const validate = ajv.getSchema("userSchema");
Это позволяет централизованно управлять схемами и использовать их в разных частях приложения.
Ajv позволяет расширять стандартную валидацию через форматы:
const schema = {
type: "string",
format: "email"
};
Для включения форматов требуется подключение дополнительных модулей:
import addFormats from "ajv-formats";
addFormats(ajv);
После этого становятся доступны проверки email, URI, date-time и другие стандартные форматы.
Для анализа ошибок используется массив errors, который
содержит детализированную информацию о нарушениях схемы.
Пример обработки:
if (!validate(data)) {
for (const err of validate.errors) {
console.log(err.instancePath, err.message);
}
}
Дополнительно можно включить строгий режим, который помогает выявлять некорректные схемы на этапе разработки.
const ajv = new Ajv({ strict: true });
При использовании в больших проектах важно учитывать стоимость компиляции схем. Практикуется предварительная подготовка валидаторов на этапе инициализации приложения.
const validators = {
user: ajv.compile(userSchema),
product: ajv.compile(productSchema)
};
Дальнейшая работа выполняется через готовые функции без дополнительной нагрузки.
Ajv может использоваться и в браузере при сборке через Webpack или Vite:
import Ajv from "ajv";
const ajv = new Ajv();
При этом рекомендуется минимизировать размер бандла, подключая только необходимые расширения и форматы.
Строгий режим влияет на обработку схем:
const ajv = new Ajv({ strict: true });
В крупных проектах это снижает количество скрытых ошибок валидации и повышает предсказуемость поведения схем.