BlazorSeniorExperience

Как понять, что проблема в проекте связана с Blazor, а не с API, сетью, дизайном состояния или плохой архитектурой?

Изолируй слой проблемы: сначала проверь API через curl, затем сеть в DevTools, потом DI-жизненный цикл и стейт — большинство «багов Blazor» оказываются проблемами архитектуры или конфигурации.

Диагностика: Blazor или что-то другое

Когда в Blazor-проекте появляется проблема, первый вопрос — чья это зона ответственности. Ошибка может быть в рантайме Blazor, в архитектуре компонентов, в API-слое, в сети, в дизайне состояния или просто в бизнес-логике. Правильная изоляция экономит дни отладки.

Шаг 1: Локализовать симптом

Задайте конкретные вопросы о симптоме:

  • Проблема воспроизводится без Blazor? Если API возвращает неверные данные при прямом вызове через curl — это не Blazor.
  • Проблема только в Blazor Server или только в WASM? Если только в Server — вероятно, SignalR, circuit или DI-жизненный цикл.
  • Проблема в конкретном компоненте или во всём приложении? Изолированная проблема — скорее дизайн компонента.

Шаг 2: Проверить API независимо

Открыть DevTools → Network и посмотреть на реальные HTTP-запросы. Если статус 200, но данные неверные — проблема в API или маппинге. Blazor здесь ни при чём.

# Проверка API напрямую
curl -s https://api.example.com/jobs | jq '.total'

# Или через Postman/Scalar без фронтенда

Шаг 3: Проверить сеть

  • Blazor Server: в DevTools перейти на вкладку WS (WebSocket) и посмотреть сообщения SignalR. Разрывы, таймауты, большие frames — сетевая проблема.
  • Blazor WASM: большие JS-файлы могут блокировать парсинг. Проверить Lighthouse или Performance-таб.
  • Долгое TTFB (Time to First Byte) — проблема на сервере или CDN, не в Blazor.

Шаг 4: Проверить дизайн состояния

Типичные симптомы плохого дизайна состояния, которые выглядят как «баги Blazor»:

  • Компонент не обновляется — забыли вызвать StateHasChanged() после асинхронного обновления.
  • Данные «протекают» между пользователями в Blazor Server — сервис зарегистрирован как Singleton вместо Scoped.
  • Форма не сбрасывается — EditContext не пересоздаётся при смене модели.
// Распространённая ошибка: данные не обновляются в UI
private async void WrongHandler()
{
    await LoadDataAsync(); // UI не перерисуется!
}

// Правильно:
private async Task CorrectHandler()
{
    await LoadDataAsync();
    StateHasChanged(); // явный сигнал если нужен
}

Шаг 5: Исключить плохую архитектуру компонентов

  • Слишком большие компоненты с десятками параметров — проблема декомпозиции, не Blazor.
  • Избыточные @bind цепочки через 5 уровней — стейт-менеджмент должен быть на уровне сервиса.
  • N+1 запросы в OnParametersSetAsync — архитектурная проблема загрузки данных.

Шаг 6: Что реально является проблемой Blazor

  • Лишние перерисовки из-за некорректной реализации ShouldRender().
  • Утечки памяти при неправильной реализации IDisposable в компонентах.
  • Баги с JS Interop — неправильный вызов JavaScript до завершения инициализации DOM (OnAfterRenderAsync нужен).
  • Circuit disconnect в Blazor Server при долгих операциях — нужен heartbeat или CircuitOptions.DisconnectedCircuitRetentionPeriod.

Подводные камни

  • Симптом «компонент не обновляется» в 80% случаев — не баг Blazor, а пропущенный StateHasChanged() или неправильная структура async void.
  • Утечки памяти в Blazor Server выглядят как «тормоза» — сервер накапливает мёртвые circuits если IDisposable не реализован.
  • «Blazor Server лагает» часто означает медленный SQL-запрос в обработчике события, не проблему SignalR.
  • Ошибки CORS и 401 выглядят как «Blazor не работает», хотя это конфигурация ASP.NET Core и браузерная политика.
  • JS Interop-ошибки типа "Cannot read property of null" — DOM ещё не готов, нужно ждать OnAfterRenderAsync(firstRender: true).
  • DI Singleton vs Scoped путаница в Blazor Server — данные одного пользователя видят другие. Это архитектурная ошибка, не баг Blazor.
  • Медленный первый рендер WASM — не баг, а фундаментальная особенность платформы. Решается pre-rendering, а не рефакторингом кода.

What hurts your answer

  • Сразу обвинять Blazor, не проверив соседние слои системы
  • Чинить симптом без минимального воспроизведения и evidence
  • Не учитывать версии, конфигурацию, окружение и recent changes

What they're listening for

  • Умеет локализовать проблему вокруг Blazor
  • Двигается от симптома к гипотезам и проверкам
  • Отличает баг инструмента от ошибки использования или окружения

Related topics