Библиотека Axe-core предоставляет мощные инструменты для автоматической проверки доступности веб-приложений. В среде React её использование осуществляется через пакет @axe-core/react, который позволяет интегрировать анализ прямо в жизненный цикл компонентов.
Установка производится через npm или yarn:
npm install @axe-core/react axe-core
или
yarn add @axe-core/react axe-core
После установки библиотека подключается к приложению следующим образом:
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import axe from '@axe-core/react';
if (process.env.NODE_ENV !== 'production') {
axe(React, ReactDOM, 1000); // Параметр 1000 — интервал проверок в миллисекундах
}
ReactDOM.render(<App />, document.getElementById('root'));
Проверка активна только в development режиме, чтобы не влиять на производительность в продакшене.
Axe-core позволяет тонко настраивать правила, которые будут проверяться. Каждый запуск анализа можно кастомизировать через объект конфигурации:
axe(React, ReactDOM, 1000, {
rules: [
{ id: 'color-contrast', enabled: true },
{ id: 'label', enabled: false }
],
reporter: 'v2'
});
rules — массив объектов с указанием id
правила и состояния enabled.reporter — формат вывода результатов (v2,
v3, no-passes).selectors и
исключать определённые участки страницы.Для тестирования отдельных компонентов используется комбинация Jest и React Testing Library. Инструменты Axe позволяют интегрироваться в unit-тесты:
import React from 'react';
import { render } from '@testing-library/react';
import { axe, toHaveNoViolations } from 'jest-axe';
import MyButton from './MyButton';
expect.extend(toHaveNoViolations);
test('Проверка доступности MyButton', async () => {
const { container } = render(<MyButton />);
const results = await axe(container);
expect(results).toHaveNoViolations();
});
Ключевые моменты:
axe(container) запускает анализ доступности конкретного
элемента или компонента.toHaveNoViolations из jest-axe
облегчает интеграцию с тестами.React-приложения часто содержат динамически изменяемый контент, создаваемый через состояние или эффекты. Axe-core позволяет отслеживать изменения через повторный запуск анализа:
import { useEffect } from 'react';
import axe from '@axe-core/react';
function useAxeOnUpdate(ref) {
useEffect(() => {
if (ref.current) {
axe.run(ref.current, {}, (err, results) => {
if (err) throw err;
console.log(results.violations);
});
}
});
}
ref указывает на DOM-узел компонента.axe.run принимает селектор или узел, объект настроек и
callback.Для более удобного анализа можно интегрировать результаты Axe в консоль или GUI:
axe.run(document, {}, (err, results) => {
if (err) throw err;
results.violations.forEach(v => {
console.group(`Ошибка: ${v.id}`);
console.log('Описание:', v.description);
console.log('Элементы:', v.nodes.map(node => node.html));
console.groupEnd();
});
});
id, description,
helpUrl и список nodes.container.innerHTML для точного указания проблемного
элемента.setTimeout или дебаунса при динамическом
контенте уменьшает нагрузку.Включение Axe в pipeline позволяет автоматизировать проверку доступности:
npm install --save-dev jest-axe
В тестах проверяются ключевые страницы и компоненты, нарушения блокируют сборку:
describe('Главная страница', () => {
it('должна быть доступной', async () => {
const { container } = render(<HomePage />);
const results = await axe(container);
expect(results).toHaveNoViolations();
});
});
При использовании TypeScript доступны типы для
@axe-core/react:
import * as React from 'react';
import * as ReactDOM from 'react-dom';
import axe from '@axe-core/react';
axe(React, ReactDOM, 1000, {
rules: [{ id: 'color-contrast', enabled: true }]
});
Использование Axe-core в React позволяет поддерживать высокий уровень доступности интерфейсов, автоматизировать тестирование и интегрировать анализ доступности как в процесс разработки, так и в CI/CD.