Константы и enum

Константы

В Lighthouse константы используются для хранения фиксированных значений, которые применяются во многих местах кода, обеспечивая единообразие и удобство поддержки. Обычно они объявляются через const или через объект, замороженный методом Object.freeze(), чтобы предотвратить случайное изменение значений.

Пример объявления констант:

const NETWORK_TIMEOUTS = Object.freeze({
  DEFAULT: 30000,
  LONG: 60000,
  SHORT: 10000
});

Ключевые особенности констант:

  • Неподвижность значений: Object.freeze делает объект неизменяемым, что снижает вероятность ошибок при использовании этих значений в различных частях проекта.
  • Централизованное управление: Изменение значения константы в одном месте отражается во всех компонентах, где она используется.
  • Повышение читаемости: Вместо использования “магических чисел” и строк, код становится более понятным.

В Lighthouse константы широко применяются для настройки сетевых запросов, определения уровней логирования, идентификации категорий аудита и типовых сценариев тестирования.

Применение констант

Константы в Lighthouse используются в таких контекстах:

  • Категории аудита:
const CATEGORIES = Object.freeze({
  PERFORMANCE: 'performance',
  ACCESSIBILITY: 'accessibility',
  BEST_PRACTICES: 'best-practices',
  SEO: 'seo',
  PWA: 'pwa'
});

Использование констант для категорий позволяет избежать ошибок при написании строк вручную в коде анализа.

  • Типы ресурсов:
const RESOURCE_TYPES = Object.freeze({
  DOCUMENT: 'document',
  SCRIPT: 'script',
  IMAGE: 'image',
  STYLESHEET: 'stylesheet',
  OTHER: 'other'
});

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

Enum

В Lighthouse enum реализуются через объекты с замороженными значениями (Object.freeze) или через TypeScript enum, если проект использует строгую типизацию. Enum позволяет определить набор возможных значений, которые можно использовать вместо строк или чисел, что предотвращает ошибки и упрощает рефакторинг.

Пример enum через объект:

const THROTTLING_METHOD = Object.freeze({
  DEVTOOLS: 'devtools',
  SIMULATED: 'simulated'
});

Пример enum через TypeScript:

enum ThrottlingMethod {
  DevTools = 'devtools',
  Simulated = 'simulated'
}

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

  • Гарантия корректности значений: при попытке присвоить переменной значение, отсутствующее в enum, TypeScript выдаст ошибку.
  • Удобство поддержки кода: добавление нового значения в enum автоматически делает его доступным везде, где используется этот тип.
  • Совместимость с объектной моделью Lighthouse: объекты-енумы легко сериализуются и могут передаваться между модулями.

Использование enum в Lighthouse

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

  • Методы троттлинга сети и процессора:
const throttling = THROTTLING_METHOD.SIMULATED;
  • Уровни аудитории отчетов:
const AUDIT_SEVERITY = Object.freeze({
  INFO: 'info',
  WARNING: 'warning',
  CRITICAL: 'critical'
});
  • Статусы загрузки и выполнения:
const LOAD_STATUS = Object.freeze({
  PENDING: 'pending',
  SUCCESS: 'success',
  FAILURE: 'failure'
});

Практические рекомендации

  • Использовать Object.freeze для неизменяемых объектов, чтобы защитить константы и enum от изменений.
  • Предпочитать enum или константы вместо “магических строк” или чисел в логике аудита и генерации отчетов.
  • Организовать константы по категориям (например, сетевые настройки, категории аудита, типы ресурсов), чтобы улучшить читаемость и поддерживаемость кода.
  • В TypeScript использовать enum для строгой типизации, что уменьшает вероятность ошибок на этапе компиляции.

Итоговая структура констант и enum в проекте Lighthouse

// Категории аудита
const CATEGORIES = Object.freeze({
  PERFORMANCE: 'performance',
  ACCESSIBILITY: 'accessibility',
  BEST_PRACTICES: 'best-practices',
  SEO: 'seo',
  PWA: 'pwa'
});

// Типы ресурсов
const RESOURCE_TYPES = Object.freeze({
  DOCUMENT: 'document',
  SCRIPT: 'script',
  IMAGE: 'image',
  STYLESHEET: 'stylesheet',
  OTHER: 'other'
});

// Методы троттлинга
const THROTTLING_METHOD = Object.freeze({
  DEVTOOLS: 'devtools',
  SIMULATED: 'simulated'
});

// Уровни аудита
const AUDIT_SEVERITY = Object.freeze({
  INFO: 'info',
  WARNING: 'warning',
  CRITICAL: 'critical'
});

Эта структура обеспечивает согласованность, предотвращает ошибки и упрощает расширение функционала Lighthouse.