Debugging в Deno

Fresh работает поверх Deno и напрямую использует его инструменты отладки. Это означает отсутствие скрытых абстракций: все механизмы диагностики, трассировки и анализа поведения приложения основаны на стандартных возможностях Deno и JavaScript-платформы.

Ключевые инструменты:

  • встроенный отладчик Deno
  • Chrome DevTools (через V8 Inspector Protocol)
  • логирование и трассировка
  • анализ ошибок рендеринга серверных компонентов
  • диагностика island-компонентов на клиенте

Запуск Fresh в режиме отладки

Отладка начинается на этапе запуска сервера разработки. Для этого используется стандартный флаг Deno:

deno run --inspect-brk dev.ts

или, если используется скрипт:

deno task dev --inspect

Параметр --inspect открывает WebSocket для подключения DevTools, а --inspect-brk дополнительно останавливает выполнение на первой строке, что удобно для анализа начальной инициализации приложения.

После запуска Deno выводит адрес для подключения, например:

Debugger listening on ws://127.0.0.1:9229

Этот адрес используется в Chrome DevTools или совместимых IDE.

Использование Chrome DevTools

Fresh-приложение отлаживается как серверный JavaScript-код. Подключение выполняется через:

  • chrome://inspect
  • пункт Open dedicated DevTools for Node

После подключения доступны:

  • точки останова
  • пошаговое выполнение
  • просмотр call stack
  • анализ scope и переменных
  • профилирование

Особенность Fresh заключается в том, что серверный рендеринг JSX происходит в реальном времени, и стек вызовов отражает весь путь от HTTP-запроса до рендера компонента.

Отладка серверного рендеринга

Fresh использует серверный рендеринг по умолчанию. Ошибки на этом этапе проявляются:

  • как HTTP 500
  • как сообщение в консоли сервера
  • как стек-трейс в терминале

Типичная ошибка рендера:

TypeError: Cannot read properties of undefined
    at Component (routes/index.tsx:14:23)

Для детального анализа:

  • ставятся breakpoints непосредственно в .tsx файлах маршрутов
  • проверяются входные props, передаваемые из обработчика маршрута
  • анализируется контекст ctx.state

Fresh не скрывает стек вызовов, что позволяет точно определить источник проблемы.

Логирование как базовый метод диагностики

В Fresh логирование остаётся одним из основных способов быстрой диагностики. Используются стандартные средства:

console.log()
console.debug()
console.error()

Для серверного кода лог выводится в терминал, для island-компонентов — в браузерную консоль.

Практика структурированного логирования:

console.log({
  route: ctx.url.pathname,
  params: ctx.params,
  state: ctx.state,
});

Такой подход облегчает анализ сложных сценариев с несколькими middleware и состояниями.

Отладка middleware и маршрутов

Middleware в Fresh выполняются последовательно и часто являются источником логических ошибок.

Типичные проблемы:

  • не возвращён Response
  • изменён ctx.state в неожиданном месте
  • ошибка в асинхронной логике

Пример точки останова:

export async function handler(req: Request, ctx: Context) {
  debugger;
  return await ctx.next();
}

Ключевые моменты для анализа:

  • порядок выполнения middleware
  • состояние ctx.state на каждом этапе
  • корректность передачи управления через ctx.next()

Работа с island-компонентами

Island-компоненты выполняются на клиенте и отлаживаются отдельно от серверного кода.

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

  • код исполняется в браузере
  • ошибки не отображаются в серверной консоли
  • требуется использование DevTools браузера

Типичная ошибка:

Uncaught ReferenceError: window is not defined

Она возникает, если код island-компонента ошибочно использует браузерные API вне клиента. Для диагностики:

  • проверяется, что код действительно находится в island
  • используется useEffect для обращения к DOM и window
  • анализируется граница между серверным и клиентским кодом

Source Maps и читаемые стек-трейсы

Deno по умолчанию поддерживает source maps, что критично для Fresh, активно использующего JSX и TypeScript.

При ошибках:

  • стек-трейс указывает на исходный .tsx файл
  • строки и колонки соответствуют оригинальному коду
  • отсутствует необходимость в ручной трансляции ошибок

При необходимости можно принудительно включить подробные трассировки:

deno run --trace-ops dev.ts

Отладка асинхронного кода

Fresh активно использует асинхронные операции: загрузку данных, fetch-запросы, работу с KV и базами данных.

Для отладки:

  • анализируется цепочка await
  • используется вкладка Async Stack Traces в DevTools
  • ставятся breakpoints внутри async функций

Пример типичной ошибки:

const data = fetch(url); // забыто await

В результате в компонент передаётся Promise, что приводит к ошибке рендера.

Диагностика сетевых запросов

Fresh-приложения часто выступают как прокси или API-шлюзы. Для анализа HTTP-трафика используются:

  • вкладка Network в браузере
  • логирование req.method, req.url, req.headers
  • временные замеры

Пример замера:

const start = performance.now();
// операция
const duration = performance.now() - start;

Это позволяет выявлять узкие места в серверной логике.

Работа с ошибками и Error Boundary

Fresh поддерживает централизованную обработку ошибок через специальные маршруты и middleware.

Практика:

  • выбрасывать реальные Error
  • не подавлять исключения
  • логировать ошибку до возврата ответа

Пример:

throw new Error("User not found");

В режиме разработки Fresh отображает подробную страницу ошибки со стек-трейсом, что существенно ускоряет отладку.

Использование IDE для отладки

Большинство современных IDE (VS Code, WebStorm) поддерживают Deno Debugger.

Типичная конфигурация:

  • запуск deno task dev --inspect
  • подключение debugger через launch configuration
  • возможность ставить breakpoints прямо в редакторе

Это позволяет отлаживать Fresh-приложение так же комфортно, как классические backend-приложения.

Типичные ошибки и подходы к их поиску

Часто встречающиеся проблемы:

  • использование браузерных API на сервере
  • мутация ctx.state без контроля
  • несоответствие типов данных
  • забытые await
  • побочные эффекты в серверных компонентах

Эффективная отладка строится на сочетании:

  • точек останова
  • детального логирования
  • анализа стек-трейсов
  • чёткого понимания границы сервер/клиент

Fresh и Deno предоставляют прозрачную среду выполнения, где ошибки не маскируются, а путь их возникновения легко прослеживается при грамотном использовании инструментов отладки.