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
- Двигается от симптома к гипотезам и проверкам
- Отличает баг инструмента от ошибки использования или окружения