Spec-Zone.ru › Deno 2

deno compile

Флаги

Как и в случае с deno install, флаги среды выполнения, используемые для запуска скрипта, необходимо указать во время компиляции. Сюда входят флаги разрешений.

›_
deno compile --allow-read --allow-net jsr:@std/http/file-server

Аргументы скрипта можно частично встроить.

›_
deno compile --allow-read --allow-net jsr:@std/http/file-server -p 8080

./file_server --help

Обнаружение фреймворков

Начиная с Deno 2.8, deno compile . (или deno compile <directory>) обнаруживает распространённые веб-фреймворки и создаёт точку входа, которая умеет запускать их. Сначала выполняется обнаруженный скрипт сборки, поэтому скомпилированный бинарный файл всегда содержит актуальную сборку.

Поддерживаемые фреймворки:

  • Next.js
  • Astro
  • Fresh (1.x и 2.x)
  • Remix
  • React Router
  • SvelteKit
  • Nuxt
  • SolidStart
  • TanStack Start
  • Vite (SSR, а также SPA/MPA-проекты, отдаваемые как статические файлы)
›_
# In a Next.js / Astro / Fresh / React Router / etc. project
deno compile .

# Or pointing at a specific app directory
deno compile ./apps/web

Сгенерированные точки входа используют import.meta.dirname, чтобы пути к ресурсам фреймворка правильно разрешались относительно виртуальной файловой системы внутри скомпилированного бинарного файла.

Перед компиляцией проекты React Router должны успешно собираться в Deno. Поскольку серверная точка входа React Router по умолчанию предназначена для Node.js, при сборке с Deno добавьте app/entry.server.tsx, совместимый с Web Streams. Пример см. в замечаниях о фреймворке React Router для настольных приложений.

Если проект не соответствует ни одному из поддерживаемых фреймворков, deno compile завершится с ошибкой.

Режим наблюдения

Передайте --watch, чтобы пересобирать исполняемый файл при каждом изменении файла в графе компиляции:

›_
deno compile --watch main.ts

Используйте --watch-exclude, чтобы указать пути, изменения в которых не будут запускать пересборку, а --no-clear-screen — чтобы сохранять вывод терминала между пересборками:

›_
deno compile --watch --watch-exclude=./dist --no-clear-screen main.ts

Кросс-компиляция

С помощью флага --target можно выполнять кросс-компиляцию бинарных файлов для других платформ.

# Cross compile for Apple Silicon
deno compile --target aarch64-apple-darwin main.ts

# Cross compile for Windows with an icon
deno compile --target x86_64-pc-windows-msvc --icon ./icon.ico main.ts

Поддерживаемые цели

Deno поддерживает кросс-компиляцию для всех целей независимо от платформы хоста.

ОС Архитектура Цель
Windows x86_64 x86_64-pc-windows-msvc
Windows ARM64 aarch64-pc-windows-msvc
macOS x86_64 x86_64-apple-darwin
macOS ARM64 aarch64-apple-darwin
Linux x86_64 x86_64-unknown-linux-gnu
Linux ARM64 aarch64-unknown-linux-gnu

aarch64-pc-windows-msvc (Windows на ARM) поддерживается начиная с Deno 2.9.3.

Бинарный файл denort

deno compile встраивает вашу программу в denort («среду выполнения Deno»): урезанную сборку Deno, содержащую только то, что необходимо для запуска скомпилированной программы, без подкоманд для работы с инструментами. Использование denort в качестве основы вместо полного бинарного файла deno позволяет уменьшить размер скомпилированных исполняемых файлов.

При первой компиляции для определённой версии Deno и целевой платформы Deno загружает соответствующий denort-<target>.zip из dl.deno.land и кэширует его в DENO_DIR. Так же работает и кросс-компиляция: при компиляции с --target загружается denort для этой платформы. При последующих компиляциях используется бинарный файл из кэша, поэтому они выполняются без подключения к сети.

Чтобы использовать в качестве основы пользовательскую или собранную локально среду выполнения, задайте переменную окружения DENORT_BIN, указав путь к ней. Deno также обнаруживает бинарный файл denort, размещённый рядом с исполняемым файлом deno.

Выбор движка JavaScript

Предупреждение

--engine quickjs является экспериментальной функцией и может измениться. Она появилась после Deno 2.9.4, поэтому доступна в canary-сборках и последующих выпусках.

По умолчанию скомпилированные бинарные файлы работают на V8. Флаг --engine позволяет вместо этого выполнить сборку с QuickJS, что даёт более компактный исполняемый файл:

›_
# Default, same as omitting the flag
deno compile --engine v8 main.ts

# Build a binary that runs on QuickJS
deno compile --engine quickjs main.ts

Этот же флаг доступен для deno desktop и позволяет выбрать движок, встроенный в библиотеку среды выполнения приложения.

Перед выпуском бинарного файла с QuickJS учтите следующие компромиссы:

  • Обновления безопасности. Бэкэнд QuickJS не получает таких же обновлений безопасности, как V8. Не используйте его для программ, выполняющих недоверенный код.
  • Производительность. QuickJS — интерпретатор без JIT, поэтому вычислительно сложный код работает медленнее, чем на V8. При этом запуск происходит быстрее, а памяти используется меньше.
  • Зрелость. Бэкэнд является экспериментальным; возможны отличия в поведении от V8, поэтому протестируйте программу на том движке, с которым собираетесь её выпускать.

Для каждого движка используется собственная предварительно собранная среда выполнения: с --engine quickjs Deno загружает denort-quickjs-<target>.zip (или libdenort-quickjs-<target>.zip для deno desktop) вместо стандартного denort-<target>.zip. Оба варианта публикуются для каждой поддерживаемой цели, поэтому кросс-компиляция выполняется одинаково. Если вы переопределите базовую среду выполнения с помощью DENORT_BIN (или бинарного файла denort рядом с deno), этот бинарный файл будет использоваться без изменений: в таком случае --engine игнорируется, а Deno выводит предупреждение.

Значки

При сборке для Windows к исполняемому файлу можно добавить значок с помощью флага --icon. Значок должен быть в формате .ico.

deno compile --icon icon.ico main.ts

# Cross compilation with icon
deno compile --target x86_64-pc-windows-msvc --icon ./icon.ico main.ts

Динамические импорты

По умолчанию статически анализируемые динамические импорты (импорты, в которых строковый литерал указан в выражении вызова import("...")) включаются в результат.

// calculator.ts and its dependencies will be included in the binary
const calculator = await import("./calculator.ts");

Однако динамические импорты, которые нельзя статически проанализировать, не включаются:

const specifier = condition ? "./calc.ts" : "./better_calc.ts";
const calculator = await import(specifier);

Чтобы включить динамические импорты, которые нельзя статически проанализировать, укажите флаг --include <path>.

›_
deno compile --include calc.ts --include better_calc.ts main.ts

Включение файлов данных или каталогов

Начиная с Deno 2.1, файлы и каталоги можно включать в исполняемый файл, указав их с помощью флага --include <path>.

›_
deno compile --include names.csv --include data main.ts

Затем прочитайте файл относительно пути к каталогу текущего модуля с помощью import.meta.dirname:

// main.ts
const names = Deno.readTextFileSync(import.meta.dirname + "/names.csv");
const dataFiles = Deno.readDirSync(import.meta.dirname + "/data");

// use names and dataFiles here

Обратите внимание: сейчас это работает только с файлами в файловой системе, но не с удалёнными файлами.

--include рассматривает встроенные файлы .js и .ts как корни графа модулей, поэтому разрешает их зависимости и транспилирует их. Чтобы встроить файлы в исходном виде, без разрешения модулей, используйте вместо этого --include-as-is. Это подходящий вариант для предварительно собранных фронтенд-пакетов (например, результатов сборки Vite или webpack), которые уже обработаны и не смогут разрешиться как модули Deno:

›_
deno compile --include-as-is ./dist main.ts

Настройка include / exclude в deno.json

Пути --include и --exclude можно задать декларативно в deno.json, чтобы не указывать их повторно при каждом вызове deno compile:

deno.json
{
  "compile": {
    "include": ["names.csv", "data", "worker.ts"],
    "exclude": ["data/secrets", "**/*.test.ts"]
  }
}

Флаги CLI объединяются с конфигурацией: --include и --exclude дополняют списки в deno.json, а не заменяют их. Подробнее, в том числе о том, как указать permissions в том же блоке, см. раздел Конфигурация компиляции в руководстве по конфигурации.

Воркеры

Как и динамические импорты, которые нельзя статически проанализировать, код для воркеров по умолчанию не включается в скомпилированный исполняемый файл. Есть два способа включить воркеры:

  1. Используйте флаг --include <path>, чтобы включить код воркера.
›_
deno compile --include worker.ts main.ts
  1. Импортируйте модуль воркера с помощью статически анализируемого импорта.
// main.ts
import "./worker.ts";
›_
deno compile main.ts

Объединение зависимостей

Предупреждение

--bundle является экспериментальной функцией и может измениться. Некоторые динамические шаблоны пока не поддерживаются (см. раздел Ограничения ниже).

По умолчанию deno compile встраивает в исполняемый файл всё дерево разрешённых node_modules. Для проектов со множеством npm-зависимостей это может привести к увеличению размера бинарных файлов и замедлению запуска. Флаг --bundle вместо этого перед встраиванием передаёт точку входа в сборщик, поэтому в бинарный файл попадает только код, действительно используемый программой.

›_
deno compile --bundle main.ts

Для дерева зависимостей, состоящего только из ESM, удаление неиспользуемого кода убирает всё лишнее, а полезная нагрузка npm исключается целиком, что позволяет значительно уменьшить размер бинарного файла. Если встречается пакет CommonJS или нативное дополнение (.node), необходимые пакеты встраиваются, чтобы продолжить работать во время выполнения, но неиспользуемые пакеты по-прежнему исключаются.

--bundle автоматически распознаёт несколько распространённых на практике шаблонов:

  • CommonJS и нативные дополнения — зависимости CJS и нативные дополнения .node обнаруживаются, а содержащие их пакеты встраиваются.
  • Воркеры — обнаруживаются вызовы new Worker(new URL("./worker.ts", import.meta.url), ...), каждый воркер собирается отдельно и встраивается вместе с основным пакетом.
  • Чтение package.json — файлы package.json пакетов, которые читаются во время выполнения (например, для отображения версии), включаются автоматически.

Минификация пакета

Используйте --bundle вместе с --minify, чтобы минифицировать результат сборки. Это уменьшает размер встроенного пакета и расход памяти во время выполнения, но делает трассировки стека менее понятными.

›_
deno compile --bundle --minify main.ts

--minify имеет смысл использовать только вместе с --bundle.

Ограничения

Поскольку объединение зависимостей требует статического анализа кода, шаблоны, которые невозможно отследить, исключаются из бинарного файла:

  • Динамические require() / import() спецификаторов, которые не являются строковыми литералами.
  • Воркеры, запускаемые с вычисляемыми URL или из транзитивных зависимостей, а не из собственного исходного кода.

Если программа зависит от таких шаблонов, сделайте их статически анализируемыми, добавьте необходимые файлы с помощью --include или выполните компиляцию без --bundle.

Самораспаковывающиеся исполняемые файлы

По умолчанию скомпилированные исполняемые файлы предоставляют встроенные файлы через виртуальную файловую систему в памяти. Флаг --self-extracting меняет это поведение: при первом запуске бинарный файл извлекает все встроенные файлы на диск, а во время выполнения использует обычные операции с файловой системой.

›_
deno compile --self-extracting main.ts

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

Каталог для извлечения выбирается в следующем порядке:

  1. <exe_dir>/.<exe_name>/<hash>/ (рядом со скомпилированным бинарным файлом)
  2. Резервный вариант — системный каталог данных платформы:
    • Linux: $XDG_DATA_HOME/<exe_name>/<hash> или ~/.local/share/<exe_name>/<hash>
    • macOS: ~/Library/Application Support/<exe_name>/<hash>
    • Windows: %LOCALAPPDATA%\<exe_name>\<hash>

Файлы извлекаются только один раз: при последующих запусках используется уже созданный каталог, если он существует и его хеш совпадает.

Компромиссы

Режим самораспаковки обеспечивает более широкую совместимость, но имеет некоторые недостатки:

  • Первоначальный запуск: первый запуск занимает больше времени из-за извлечения файлов.
  • Использование диска: извлечённые файлы занимают дополнительное место на диске.
  • Использование памяти: расход памяти увеличивается, поскольку встроенное содержимое больше нельзя использовать как статические данные.
  • Риск изменения: пользователи и другой код могут изменить извлечённые файлы на диске.

Подписание кода

macOS

По умолчанию в macOS скомпилированный исполняемый файл подписывается специальной подписью, что эквивалентно запуску codesign -s -:

›_
deno compile -o main main.ts
codesign --verify -vv ./main

./main: valid on disk
./main: satisfies its Designated Requirement

При подписании исполняемого файла можно указать идентификатор подписи, как и для любого другого исполняемого файла macOS:

›_
codesign -s "Developer ID Application: Your Name" ./main

Подробнее о подписании кода и нотариальном заверении в macOS см. в официальной документации.

Windows

В Windows скомпилированный исполняемый файл можно подписать с помощью утилиты SignTool.exe.

›_
deno compile -o main.exe main.ts
signtool sign /fd SHA256 main.exe

Постоянное хранилище в исполняемых файлах

Скомпилированный бинарный файл рассматривается как самостоятельное приложение, поэтому хранилище, привязанное к источнику, сохраняет данные между запусками в каталоге данных приложений платформы (%LOCALAPPDATA% в Windows, ~/Library/Application Support в macOS, $XDG_DATA_HOME в Linux):

  • localStorage и API кэша Web читают данные из этого каталога и записывают их туда.
  • Deno.openKv(), вызванный без указания пути, открывает в этом каталоге постоянную базу данных, а не использует базу данных в памяти.

Каждое скомпилированное приложение получает отдельное расположение, определяемое его идентификатором, поэтому приложения не используют общее хранилище. Идентификатор задаётся флагом --app-name, встраивается во время компиляции и, если он не указан, заменяется именем выходного файла:

›_
deno compile --app-name my-app main.ts

Поскольку расположение определяется именем, а не путём к модулю, хранилище остаётся неизменным между запусками, даже если переименовать бинарный файл; два бинарных файла, собранные с одинаковым --app-name, используют общее хранилище, а приложения с разными именами изолированы друг от друга. Повторная компиляция с другим --app-name создаёт новое хранилище.

Использование командной строки:
deno compile [OPTIONS] [SCRIPT_ARG]...

Компилирует указанный скрипт в автономный исполняемый файл.

deno compile --allow-read --allow-net jsr:@std/http/file-server
deno compile --output file_server jsr:@std/http/file-server

Все указанные флаги, влияющие на поведение во время выполнения, будут применены к полученному двоичному файлу.

Это позволяет распространять приложение Deno в системах, где Deno не установлен. Внутри создаётся пакет из урезанной версии среды выполнения Deno и вашего кода JavaScript или TypeScript.

Кросс-компиляция для разных целевых архитектур поддерживается с помощью флага --target. При первом запуске deno compile Deno загрузит соответствующий двоичный файл и сохранит его в кэше $DENO_DIR.

Параметры проверки типов

--check<CHECK_TYPE>необязательно

Задаёт поведение проверки типов. Эта подкоманда по умолчанию проверяет типы локальных модулей, поэтому передавать --check избыточно; передайте --check=all, чтобы также проверять типы удалённых модулей. В качестве альтернативы используйте подкоманду 'deno check'.

--no-check<NO_CHECK_TYPE>необязательно

Пропустить проверку типов. Если указано значение "remote", диагностические ошибки из удалённых модулей будут игнорироваться.

Параметры управления зависимостями

--cached-only

Требовать, чтобы удалённые зависимости уже находились в кэше.

--frozen<BOOLEAN>необязательно

Завершить работу с ошибкой, если lock-файл устарел.

--import-map<FILE>

Загрузить файл карты импортов из локального файла или удалённого URL.

--lock<FILE>необязательно

Проверить указанный lock-файл. (Если значение не задано, используется "./deno.lock" по умолчанию.)

--no-lock

Отключить автоматический поиск lock-файла.

--no-npm

Не разрешать зависимости npm.

--no-remote

Не разрешать удалённые модули.

--node-modules-dir<MODE>необязательно

Выбирает режим каталога node_modules для пакетов npm (это не путь). Возможные значения: auto (создать локальный каталог node_modules и установить в него пакеты npm), manual (использовать существующий локальный каталог node_modules, не изменяя его), none (не использовать локальный каталог node_modules; разрешать пакеты npm из глобального кэша). Если флаг передан без значения, по умолчанию используется auto.

--node-modules-linker<MODE>

Задаёт режим связывания пакетов npm (isolated или hoisted).

--reload, -r<CACHE_BLOCKLIST>необязательно

Перезагрузить кэш исходного кода (повторно скомпилировать TypeScript). Если значение не указано, перезагружается всё. Передайте список спецификаторов, разделённых запятыми, чтобы перезагрузить только указанные модули; npm: перезагружает все модули npm; npm:chalk перезагружает один модуль npm; jsr:@std/http/file-server,jsr:@std/assert/assert-equals перезагружает указанные модули.

--vendor<vendor>необязательно

Включает или отключает использование локальной папки vendor для удалённых модулей и папки node_modules для пакетов npm.

Параметры

--allow-scripts<PACKAGE>необязательно

Разрешить выполнение скриптов жизненного цикла npm для указанных пакетов. Примечание: скрипты выполняются только при использовании каталога node_modules (--node-modules-dir).

--cert<FILE>

Загрузить центр сертификации из файла в кодировке PEM.

--conditions<conditions>

Используйте этот аргумент, чтобы указать пользовательские условия для экспортов пакетов npm. Также можно использовать переменную окружения DENO_CONDITIONS. .

--config, -c<FILE>

Настроить различные аспекты Deno, включая TypeScript, линтинг и форматирование кода. Обычно файл конфигурации называется deno.json или deno.jsonc и обнаруживается автоматически; в этом случае данный флаг не требуется.

--env-file<FILE>необязательно

Загрузить переменные окружения из локального файла. Используется только первая переменная окружения с заданным ключом. Существующие переменные окружения процесса не перезаписываются, поэтому, если переменные с такими же именами уже существуют в окружении, их значения сохраняются. Если в файле .env несколько объявлений одной переменной окружения, применяется первое найденное. Это определяется порядком файлов, переданных в качестве аргументов.

--ext<ext>

Задать тип содержимого указанного файла.

--location<HREF>

Значение globalThis.location, используемое некоторыми веб-API.

--minimum-dependency-age<minimum-dependency-age>

(Нестабильно) Возраст в минутах, длительность ISO-8601 или абсолютная временная метка RFC3339 (например, '120' — два часа, 'P2D' — два дня, '2025-09-16' — дата отсечения, '2025-09-16T12:00:00+00:00' — время отсечения, '0' — отключить).

--no-code-cache

Отключить функцию кэширования кода V8.

--no-config

Отключить автоматическую загрузку файла конфигурации.

--preload<FILE>

Список файлов, которые будут выполнены до основного модуля.

--require<FILE>

Список модулей CommonJS, которые будут выполнены до основного модуля.

--seed<NUMBER>

Задать начальное значение генератора случайных чисел.

--v8-flags<V8_FLAGS>необязательно

Чтобы просмотреть список всех доступных флагов, используйте --v8-flags=--help Флаги также можно задать с помощью переменной окружения DENO_V8_FLAGS. Любые флаги, заданные этим флагом, добавляются после переменной окружения DENO_V8_FLAGS.

Параметры компиляции

--app-name<app-name>

Постоянный идентификатор скомпилированного приложения. Определяет, где сохраняются привязанные к источнику данные, например хранилища по умолчанию Deno.openKv(), localStorage и caches (в каталоге данных приложений платформы). По умолчанию используется имя выходного файла. Задайте это значение, чтобы хранилище оставалось неизменным при переименовании.

--bundle

Экспериментальная функция. Создать пакет точки входа с помощью esbuild перед встраиванием вместо поставки всего дерева node_modules. В результате получается двоичный файл меньшего размера с более быстрым запуском, но отбрасываются шаблоны динамического require/import, которые нельзя проследить статически.

--engine<engine>

Движок JS, на котором работает скомпилированный двоичный файл (quickjs компактнее и является экспериментальным, а также не получает те же обновления безопасности, что и v8).

--exclude<exclude>

Исключить файл или каталог из скомпилированного исполняемого файла. Используйте этот флаг, чтобы исключить определённый файл или каталог из включённых файлов. Например, чтобы исключить папку из упакованного каталога node_modules.

--exclude-unused-npm

Встраивать только пакеты npm, достижимые из графа модулей (управляемые npm; без каталога node_modules). Без этого флага встраивается полный снимок управляемых пакетов npm из lock-файла / package.json. Это уменьшает размер двоичного файла, если lock-файл содержит пакеты, которые точка входа не импортирует. Пропускаются пакеты, достижимые только через динамические импорты, которые нельзя проанализировать статически; при необходимости передайте их с помощью --include npm:, если это необходимо.

--icon<icon>

Задать значок исполняемого файла в Windows (.ico).

--include<include>

Включить дополнительный модуль, файл или каталог в скомпилированный исполняемый файл. Используйте этот флаг, если динамически импортируемый модуль или основной модуль веб-воркера не загружается в исполняемом файле либо если нужно встроить в него файл или каталог. Этот флаг можно передавать несколько раз, чтобы включить несколько дополнительных модулей.

--minify

Экспериментальная функция. Минифицировать выходные данные пакета. Имеет смысл только вместе с --bundle. Уменьшает размер встроенного пакета и использование памяти во время выполнения, но делает трассировки стека менее читаемыми.

--no-terminal

Скрыть терминал в Windows.

--output, -o<output>

Выходной файл (по умолчанию $PWD/).

--self-extracting

Создать самораспаковывающийся двоичный файл, который при первом запуске извлекает встроенную файловую систему на диск, а затем запускается из неё.

--target<target>

Целевая архитектура ОС.

Параметры отслеживания файлов

--no-clear-screen

Не очищать экран терминала в режиме отслеживания.

--watch

Отслеживать изменения файлов и автоматически перезапускать процесс. Отслеживаются только локальные файлы из графа модулей точки входа.

--watch-exclude<FILES>необязательно

Исключить указанные файлы или шаблоны из режима отслеживания.

Последнее обновление: 6 августа 2026 г.

© 2018–2025 the Deno authors
Licensed under the MIT License.
https://docs.deno.com/runtime/reference/cli/compile

Spec-Zone.ru

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