Фреймворки
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:
-
Создаёт синтетическую точку входа, которая импортирует production-сервер фреймворка (или dev-сервер в режиме
--hmr). -
Встраивает результат сборки в виртуальную файловую систему бинарного файла (
.next/,dist/,.output/,_fresh/,build/и т. д. в зависимости от фреймворка). -
Извлекает VFS при запуске, чтобы код фреймворка находил результат сборки относительно собственного рабочего каталога. Next.js ищет его в
.next/, Astro — вdist/и т. д. -
Запускает сервер фреймворка в качестве обработчика
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.
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.
Последнее обновление:
© 2018–2025 the Deno authors
Licensed under the MIT License.
https://docs.deno.com/runtime/desktop/frameworks