aria-query — это библиотека для JavaScript,
предназначенная для проверки соответствия элементов HTML стандартам
доступности (ARIA). Она предоставляет структурированные данные о ролях,
свойствах и состояниях ARIA, позволяя создавать инструменты и утилиты,
которые автоматически проверяют корректность использования ARIA в
веб-приложениях.
Основные экспортируемые сущности:
Пример использования базовых экспортов:
import { roles, roleKeys, elementRoles, aria } from 'aria-query';
console.log(roleKeys.includes('button')); // true
console.log(roles.get('button').props); // { disabled: undefined, expanded: undefined, ... }
Библиотека aria-query достаточно объемная, поэтому при
включении в клиентский бандл важно избегать импорта всего пакета, если
нужны лишь отдельные части. Основной подход — импорт конкретных
сущностей вместо всего модуля.
import * as ariaQuery from 'aria-query';
Этот способ приводит к включению всего набора ролей и свойств в бандл, что увеличивает его размер на десятки килобайт.
import { roles, aria } from 'aria-query';
Если нужны только роли или свойства ARIA, другие части не будут включены в бандл. Для сборщиков, поддерживающих tree-shaking (Webpack, Rollup, Vite), это снижает конечный размер бандла.
roles и aria представлены как
Map, что позволяет использовать эффективный доступ к данным
без копирования всего объекта. При минимизации бандла важно:
Map или
Set.get,
has и keys.Пример:
import { roles } from 'aria-query';
const buttonProps = roles.get('button')?.props;
if (buttonProps?.disabled !== undefined) {
console.log('Свойство disabled доступно для кнопки');
}
Такой подход не приводит к загрузке всех ролей и их свойств в память, а только нужных.
Для эффективной минимизации бандла с aria-query нужно
учитывать возможности сборщика:
aria-query экспортирует
сущности как ES6 модули, что позволяет tree-shaking.require() — CommonJS импорт
делает невозможным удаление неиспользуемого кода при сборке.Пример динамического импорта:
async function loadRoles() {
const { roles } = await import('aria-query');
return roles.get('menuitem');
}
loadRoles().then(role => console.log(role));
1. Проверка наличия роли для элемента:
import { elementRoles } from 'aria-query';
const divRoles = elementRoles.get('div');
console.log(divRoles.has('main')); // true или false
2. Получение допустимых значений ARIA-свойства:
import { aria } from 'aria-query';
const expandedValues = aria.get('aria-expanded');
console.log(expandedValues); // Set { 'true', 'false', undefined }
3. Выборка только ролей с конкретными свойствами:
import { roles } from 'aria-query';
const rolesWithDisabled = Array.from(roles)
.filter(([name, details]) => 'disabled' in details.props)
.map(([name]) => name);
console.log(rolesWithDisabled);
Этот способ позволяет использовать только необходимую информацию, не захватывая весь объем библиотеки.
roles,
aria, elementRoles).webpack-bundle-analyzer или аналогичных инструментов.Эти методы позволяют включить aria-query в клиентский
код без значительного увеличения веса бандла, сохраняя высокую
производительность и корректную поддержку ARIA.