Горячая замена модулей
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, чтобы динамически заменять модули в работающем изоляте.
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и пошагово выполнять недавно замененный код.
Последнее обновление:
© 2018–2025 the Deno authors
Licensed under the MIT License.
https://docs.deno.com/runtime/desktop/hmr