Spec-Zone.ru › Deno 2

Фреймворки

Доступно в Deno 2.9

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

Укажите для deno desktop каталог: он автоматически определит фреймворк, выберет подходящую точку входа, встроит результат сборки в бинарный файл и запустит production-сервер фреймворка (или dev-сервер в режиме --hmr), направив на него webview.

›_
# Inside a Next.js / Astro / Fresh / React Router / etc. project:
deno desktop .

Большинству поддерживаемых фреймворков не нужен специальный адаптер. У некоторых фреймворков есть файлы точек входа, специфичные для среды выполнения; перед сборкой ознакомьтесь с примечаниями для каждого фреймворка ниже.

Обнаружение

Обнаружение выполняется на основе файлов конфигурации и зависимостей package.json. Используется первое совпадение.

Фреймворк Признак обнаружения
Next.js next.config.{js,mjs,ts}
Astro astro.config.{mjs,ts,js}
Fresh fresh.gen.ts или каталог _fresh/
Remix @remix-run/react или @remix-run/dev в package.json
React Router @react-router/dev в package.json
Nuxt nuxt.config.{ts,js,mjs}
SvelteKit svelte.config.{js,ts}
SolidStart @solidjs/start в package.json
TanStack Start @tanstack/{react,solid}-start в package.json
Vite vite.config.* или зависимость vite в package.json

Если совпадений нет, deno desktop использует резервный вариант: считает путь скриптом, как и deno desktop main.ts. Напишите обработчик Deno.serve() и самостоятельно обслуживайте свой интерфейс.

Что делает обнаружение

Когда фреймворк обнаружен, CLI:

  1. Создаёт синтетическую точку входа, которая импортирует production-сервер фреймворка (или dev-сервер в режиме --hmr).
  2. Встраивает результат сборки в виртуальную файловую систему бинарного файла (.next/, dist/, .output/, _fresh/, build/ и т. д. в зависимости от фреймворка).
  3. Извлекает VFS при запуске, чтобы код фреймворка находил результат сборки относительно собственного рабочего каталога. Next.js ищет его в .next/, Astro — в dist/ и т. д.
  4. Запускает сервер фреймворка в качестве обработчика Deno.serve(). Webview переходит на назначенный порт, как и в любом другом настольном приложении.

Перед запуском deno desktop соберите проект. Команда не выполняет за вас next build, astro build и подобные команды, поэтому сначала запустите этап сборки фреймворка.

Примечания для отдельных фреймворков

Next.js

›_
cd my-next-app
npx next build         # produce .next/
deno desktop .

Production: импортирует next/dist/cli/next-start.js. Dev (в режиме --hmr): next/dist/cli/next-dev.js. Каталог .next/ встраивается.

Поддерживаются и App Router, и Pages Router.

Astro

›_
npm run build          # produce dist/
deno desktop .

В проектах Astro с SSR-адаптером импортируется ./dist/server/entry.mjs. Статические проекты (без адаптера) обслуживаются статическим файловым сервером Deno, настроенным на каталог dist/.

Поддерживаются оба режима; SSR предоставляет доступ ко всему жизненному циклу запросов Astro, а статический режим запускается быстрее.

Fresh

›_
deno task build        # produce _fresh/
deno desktop .

Fresh 2.x: импортирует _fresh/server.js и запускает dev-сервер Vite в режиме --hmr. Fresh 1.x: напрямую импортирует ./main.ts.

Remix

›_
npm run build
deno desktop .

Production: запускает remix-serve для каталога build/. Dev (в режиме --hmr): CLI @remix-run/dev.

React Router

Режим фреймворка React Router определяется по @react-router/dev в package.json. Поддерживаются как режим SPA (ssr: false), так и серверный рендеринг, если проект успешно собран с помощью Deno.

Стандартная точка входа сервера React Router предназначена для Node.js и использует renderToPipeableStream из react-dom/server. Deno разрешает react-dom/server в вариант для Web Streams, который использует renderToReadableStream. Перед запуском react-router build добавьте совместимый с Deno файл app/entry.server.tsx; React Router также использует этот файл для предварительного рендеринга резервной страницы SPA, если ssr: false.

app/entry.server.tsx
import type { EntryContext } from "react-router";
import { ServerRouter } from "react-router";
import { renderToReadableStream } from "react-dom/server";
import { isbot } from "isbot";

export default async function handleRequest(
  request: Request,
  responseStatusCode: number,
  responseHeaders: Headers,
  routerContext: EntryContext,
) {
  if (request.method.toUpperCase() === "HEAD") {
    return new Response(null, {
      status: responseStatusCode,
      headers: responseHeaders,
    });
  }

  let statusCode = responseStatusCode;

  const body = await renderToReadableStream(
    <ServerRouter context={routerContext} url={request.url} />,
    {
      signal: request.signal,
      onError(error: unknown) {
        statusCode = 500;
        console.error(error);
      },
    },
  );

  if (
    isbot(request.headers.get("user-agent") || "") || routerContext.isSpaMode
  ) {
    await body.allReady;
  }

  responseHeaders.set("Content-Type", "text/html");
  return new Response(body, {
    headers: responseHeaders,
    status: statusCode,
  });
}

Затем соберите и упакуйте приложение:

›_
deno task build
deno desktop .

В production статические клиентские ресурсы обслуживаются из build/client, а в проектах с SSR запросы маршрутизируются через build/server/index.js.

Nuxt

›_
npm run build          # produce .output/
deno desktop .

Используется результат сборки Nitro для Nuxt в .output/server/index.{ts,mjs}. Dev (в режиме --hmr): nuxi dev.

SvelteKit

›_
npm run build
deno desktop .

Сначала проверяется .deno-deploy/server.ts (результат сборки адаптера Deno Deploy); если его нет, используется .output/server/index.{ts,mjs} (результат сборки адаптера Node). Dev: dev-сервер Vite.

Если вы используете другой адаптер (@sveltejs/adapter-static и т. д.), самостоятельно обслуживайте каталог с результатом сборки с помощью Deno.serve(), а не полагайтесь на обнаружение.

SolidStart и TanStack Start

Оба фреймворка используют Nitro; они обнаруживаются по точке входа .output/server/index.*. Перед запуском deno desktop сначала выполните сборку (npm run build).

Vite

Проекты Vite обнаруживаются по файлу vite.config.* или зависимости vite. У Vite самый низкий приоритет среди сборщиков, поэтому метафреймворки на его основе (Astro, SvelteKit, Nuxt, Remix, React Router, SolidStart, TanStack Start) сначала сопоставляются по собственным конфигурационным файлам или зависимостям.

  • SSR (точка входа server.{ts,js,mjs} рядом с vite.config.*): в production напрямую запускается SSR-точка входа, а в режиме dev (--hmr) dev-сервер Vite работает в режиме middleware.
  • SPA или MPA (без серверной точки входа): Deno обслуживает статический результат vite build в dist/ по HTTP, используя резервный вариант index.html, чтобы клиентские маршрутизаторы продолжали работать после принудительной перезагрузки страницы. Сначала выполните vite build.

Принудительный выбор фреймворка и отказ от обнаружения

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

›_
deno desktop ./my-server.ts

В my-server.ts вы самостоятельно импортируете и запускаете фреймворк. Используйте этот способ, если вам нужно контролировать запуск так, как не позволяет настроить обнаружение.

Горячая перезагрузка в проектах с фреймворками

В режиме --hmr запускается собственный dev-сервер фреймворка, и webview подключается к нему напрямую. Сохранение состояния, fast refresh и наложения ошибок работают так же, как в браузере. Подробности о режимах HMR для проектов с фреймворками и без них см. в разделе HMR.

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

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

Spec-Zone.ru

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