Spec-Zone.ru › Deno 2

Обслуживание по HTTP

Доступно в Deno 2.9

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

Приложение deno desktop обслуживает свой интерфейс через локальный HTTP и направляет встроенное веб-представление на этот адрес. Благодаря этому структура приложения остается такой же, как у обычного сайта на Deno. Deno.serve() — точка входа, и каждый запрос проходит через ваш обработчик, но вам не нужно управлять портом, а приложение не доступно извне по сети.

Как это работает

При запуске двоичного файла:

  1. Среда выполнения выбирает свободный локальный порт и задает переменную окружения DENO_SERVE_ADDRESS со значением tcp:127.0.0.1:<port>.
  2. Ваш код вызывает Deno.serve(...). API сервера считывает DENO_SERVE_ADDRESS (в этом режиме значение задает сама Deno, а не пользователь) и привязывается к этому порту, игнорируя переданный вами порт.
  3. Когда прослушиватель будет готов, веб-представление переходит по адресу http://127.0.0.1:<port>.

Вы пишете тот же обработчик, что и для любого HTTP-сервера Deno. Специального API для обслуживания запросов в настольных приложениях нет.

main.ts
Deno.serve((req) => {
  const url = new URL(req.url);
  if (url.pathname === "/api/hello") {
    return Response.json({ hello: "world" });
  }
  return new Response(HOMEPAGE, {
    headers: { "content-type": "text/html" },
  });
});

const HOMEPAGE = `<!doctype html>
<html><body>
  <h1>Hello, desktop</h1>
  <button onclick="fetch('/api/hello').then(r => r.json()).then(console.log)">
    Ping
  </button>
</body></html>`;
›_
deno desktop main.ts

Также работает вариант с экспортом по умолчанию:

main.ts
export default {
  fetch(req: Request): Response {
    return new Response("Hello!");
  },
};

Зачем использовать локальный HTTP?

Архитектура с локальным HTTP предполагает небольшие накладные расходы, но при этом обеспечивает важные для настольных приложений свойства:

  • Один и тот же код в браузере и настольном приложении. Главная страница, fetch, веб-сокеты и cookie работают одинаково в deno run и deno desktop. Вы можете разрабатывать приложение во вкладке браузера и выпускать тот же код в виде двоичного файла для настольной системы.
  • Никакой специальной системы модулей. Импорты, статические ресурсы и код на уровне модулей работают так же, как на веб-сервере.
  • Фреймворки работают без изменений. Next.js, Astro, Fresh и другие уже поставляются с производственным HTTP-сервером. deno desktop запускает этот сервер и направляет на него веб-представление. См. раздел «Фреймворки».

Цена — один сетевой переход внутри 127.0.0.1 для каждого запроса. При обслуживании интерфейса (HTML, CSS, объединенный JS, ответы JSON API) это несущественно.

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

Доступность по сети

Адрес привязки — всегда 127.0.0.1 (или [::1]). Скомпилированный двоичный файл никогда не привязывается к публичному интерфейсу, даже если передать 0.0.0.0 в Deno.serve(). Другие приложения и пользователи на той же машине не смогут подключиться к вашему серверу.

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

Использование пользовательского порта

Вы не можете переопределить порт, к которому Deno.serve() привязывается внутри deno desktop. Это сделано намеренно: веб-представление должно переходить на тот же порт, который прослушивает среда выполнения, а именно среда выполнения определяет его значение.

Чтобы узнать, к какому адресу привязан сервер, прочитайте DENO_SERVE_ADDRESS. Он имеет формат tcp:127.0.0.1:<port>, поэтому, если вам нужен URL http://, выделите из него порт:

const addr = Deno.env.get("DENO_SERVE_ADDRESS")!; // "tcp:127.0.0.1:54321"
const port = addr.split(":").pop();
console.log("Serving on:", `http://127.0.0.1:${port}`);

Обслуживание нескольких окон

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

const port = Deno.env.get("DENO_SERVE_ADDRESS")!.split(":").pop();
const settings = new Deno.BrowserWindow();
settings.navigate(`http://127.0.0.1:${port}/settings`);

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

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

Spec-Zone.ru

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