Spec-Zone.ru › Deno 2

Горячая замена модулей

Доступно в Deno 2.9

deno desktop доступен начиная с Deno v2.9.0. Если у вас более ранняя версия, обновите Deno, чтобы использовать его.

›_
deno desktop --hmr .

--hmr включает горячую замену модулей во время разработки. Режим выбирается автоматически в зависимости от типа вашего проекта:

Тип проекта Механизм HMR
Обнаруженный фреймворк (Next.js и т. д.) Собственный сервер разработки фреймворка.
Обычный скрипт Deno.serve() Наблюдатель за файлами + Debugger.setScriptSource.

В обоих режимах среда выполнения Deno и бэкенд отрисовки (CEF, WebView, …) продолжают работать при внесении изменений. Полная перезагрузка не выполняется, webview не закрывается, повторное подключение не требуется.

HMR фреймворка

Когда система обнаружения фреймворков определяет ваш проект (см. Фреймворки), --hmr запускает собственный сервер разработки фреймворка вместо его производственного сервера. Webview подключается непосредственно к этому серверу разработки: быстрое обновление, сохранение состояния и наложение ошибок работают так же, как во вкладке браузера.

›_
deno desktop --hmr .       # in a Next.js / Astro / Fresh / … project

Точное поведение сервера разработки определяется фреймворком. Если next dev сохраняет состояние компонентов при редактировании в браузере, оно сохранится и в вашем настольном приложении. Если astro dev показывает наложение ошибки на странице при синтаксической ошибке, вы увидите такое же наложение.

Вам не нужно отдельно запускать скрипт разработки фреймворка; deno desktop --hmr запускает его как часть среды выполнения настольного приложения.

HMR обычного приложения

Для проектов без обнаруженного фреймворка --hmr отслеживает исходные файлы и использует Debugger.setScriptSource V8, чтобы динамически заменять модули в работающем изоляте.

main.ts
Deno.serve((req) => {
  return new Response("hello world");
});
›_
deno desktop --hmr main.ts

Отредактируйте main.ts (измените тело ответа, добавьте маршрут), и изменения применятся после сохранения. Среда выполнения не перезапускается, webview не перезагружается, прослушивающий сокет остается привязанным.

Что сохраняется при перезагрузке

Debugger.setScriptSource заменяет код функции новым кодом. Текущие значения остаются прежними:

  • Состояние на уровне модуля (переменные let верхнего уровня, Map верхнего уровня и т. д.) сохраняется.
  • Открытые файловые дескрипторы, сетевые подключения, дочерние процессы — все сохраняется.
  • HTTP-прослушиватель сохраняется.
  • Таймеры и интервалы продолжают срабатывать по исходному расписанию, если вы не clearTimeout / clearInterval их.

Что изменится при следующем вызове

Замененные функции выполняют новые тела при следующем вызове. Поэтому:

  • Изменение обработчика запроса вступает в силу при следующем запросе.
  • Изменение обратного вызова таймера вступает в силу при следующем срабатывании.
  • Изменение обработчика события вступает в силу при следующем событии.

Что HMR не может сделать

У Debugger.setScriptSource есть ограничения. Он не может заменить:

  • Операторы верхнего уровня, которые уже были выполнены (например, console.log на уровне модуля выполняется только при первой загрузке модуля).
  • Сигнатуру класса, например добавление полей или изменение конструкторов. Объявление класса заменяется; существующие экземпляры сохраняют прежнюю структуру.
  • Набор импортов. Добавление новой строки import требует полной перезагрузки.

Если изменение слишком сильно нарушает работу для применения по частям, --hmr выполняет полную перезагрузку затронутого модуля. Если даже это небезопасно (например, состояние верхнего уровня будет потеряно так, что среда выполнения не сможет его восстановить), система выводит предупреждение с рекомендацией выполнить полный перезапуск.

HMR в браузере

Webview — это браузер. HMR браузера (быстрое обновление в React, среда выполнения HMR в Vue и т. д.) работает целиком внутри бэкенда отрисовки, взаимодействуя с вашим сервером разработки. deno desktop --hmr не вмешивается в эту работу; если ваш фреймворк настроен на использование HMR браузера, он работает как задумано.

HMR на стороне Deno, описанный на этой странице, не зависит от HMR браузера. Они работают одновременно:

  • Изменение файла компонента React → HMR браузера применяет его внутри webview.
  • Изменение обработчика Deno.serve() или реализации привязки → HMR на стороне Deno применяет его внутри среды выполнения.

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

Ограничения и особенности

  • --hmr предназначен только для разработки. Не распространяйте бинарный файл, собранный с --hmr: наблюдатель за файлами и накладные расходы инспектора не подходят для конечных пользователей.
  • Для точных номеров строк в трассировках стека после горячей замены необходимы карты исходного кода. По умолчанию они создаются; не отключайте их в конфигурации сборщика.
  • HMR работает совместно с --inspect (см. Инструменты разработчика). Вы можете подключить отладчик к работающему сеансу --hmr и пошагово выполнять недавно замененный код.

Последнее обновление: 25 июня 2026 г.

© 2018–2025 the Deno authors
Licensed under the MIT License.
https://docs.deno.com/runtime/desktop/hmr

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API