Обслуживание по HTTP
deno desktop доступен начиная с Deno v2.9.0. Если у вас более ранняя версия, обновите Deno, чтобы использовать его.
Приложение deno desktop обслуживает свой интерфейс через локальный HTTP и направляет встроенное веб-представление на этот адрес. Благодаря этому структура приложения остается такой же, как у обычного сайта на Deno. Deno.serve() — точка входа, и каждый запрос проходит через ваш обработчик, но вам не нужно управлять портом, а приложение не доступно извне по сети.
Как это работает
При запуске двоичного файла:
- Среда выполнения выбирает свободный локальный порт и задает переменную окружения
DENO_SERVE_ADDRESSсо значениемtcp:127.0.0.1:<port>. - Ваш код вызывает
Deno.serve(...). API сервера считываетDENO_SERVE_ADDRESS(в этом режиме значение задает сама Deno, а не пользователь) и привязывается к этому порту, игнорируя переданный вами порт. - Когда прослушиватель будет готов, веб-представление переходит по адресу
http://127.0.0.1:<port>.
Вы пишете тот же обработчик, что и для любого HTTP-сервера Deno. Специального API для обслуживания запросов в настольных приложениях нет.
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
Также работает вариант с экспортом по умолчанию:
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`);
Последнее обновление:
© 2018–2025 the Deno authors
Licensed under the MIT License.
https://docs.deno.com/runtime/desktop/serving