Spec-Zone.ru › Deno 2

Переход с Bun

Большинство проектов Bun — это стандартные проекты package.json и TypeScript, которые Deno запускает напрямую. Deno читает ваш package.json, устанавливает те же зависимости npm, запускает TypeScript без этапа сборки и предоставляет сопоставимый набор встроенных инструментов: тестовый раннер, форматировщик, линтер, сборщик и компилятор в одном бинарном файле.

Особого внимания требуют компоненты, использующие API, специфичные для Bun (Bun.serve, bun:sqlite, Bun.file и оболочка $). Для каждого из них есть близкий аналог в Deno или во встроенных модулях Node, поддерживаемых Deno; они описаны ниже. Код, который ничего не импортирует из bun или bun:*, обычно работает без изменений.

Запуск проекта

Установите зависимости и запустите точку входа:

›_
cd my-bun-app
deno install
deno run main.ts

deno install читает ваш существующий package.json и разрешает те же пакеты npm, например bun install. При первом запуске deno install, если файла deno.lock ещё нет, Deno создаёт его на основе существующего bun.lock, сохраняя уже зафиксированные версии и хеши целостности. bun.lock — это текстовый lock-файл Bun (создаваемый начиная с Bun 1.1.39); устаревший бинарный bun.lockb не считывается, поэтому, если у вас есть только он, один раз выполните bun install, чтобы сначала создать bun.lock, или позвольте Deno заново разрешить диапазоны версий в package.json.

Скрипты, определённые в package.json, запускаются с помощью deno task — аналога bun run:

›_
deno task start

Первое отличие в поведении, с которым вы столкнётесь: по умолчанию Deno работает в песочнице. В отличие от Bun, который запускает код с полным доступом к сети, файловой системе и окружению, Deno запрашивает разрешение при первом обращении программы к каждому ресурсу. Чтобы поведение соответствовало Bun, можно сразу предоставить все разрешения с помощью deno run -A main.ts, а затем ограничить их флагами. Подробнее см. в разделах «Безопасность и разрешения» и «Справочник по флагам разрешений».

Как и Bun, Deno позволяет не указывать подкоманду при запуске файлов: deno main.ts работает так же, как deno run main.ts.

Шпаргалка по переходу с Bun на Deno

Зависимости

Bun Deno
bun install deno install
bun add <pkg> deno add <pkg>
bun remove <pkg> deno remove <pkg>
bun update deno update
bun outdated deno outdated

Запуск и выполнение

Bun Deno
bun file.ts deno file.ts
bun run <script> deno task <script>
bunx <pkg> dx <pkg>

Тестирование, сборка и инструментарий

Bun Deno
bun test deno test
bun build deno bundle ¹
bun build --compile deno compile
bun upgrade deno upgrade

¹ deno bundle создаёт один файл JavaScript на основе графа модулей. Сейчас эта возможность экспериментальная; список параметров см. в руководстве по сборке.

В Bun нет встроенного форматировщика и линтера, поэтому это дополнения, а не замена: deno fmt и deno lint предоставляют возможности, ради которых обычно устанавливают Prettier, ESLint или Biome, без дополнительных зависимостей.

API Bun и их аналоги в Deno

Переход с Bun.serve на Deno.serve

Оба сервера принимают обработчик в стиле fetch: функцию, которая получает Request и возвращает Response. Вызов Bun.serve обычно напрямую заменяется на Deno.serve:

server.ts
Deno.serve({ port: 3000 }, (req) => {
  return new Response("Hello, World!");
});

Различия: Bun.serve принимает один объект параметров со свойством fetch, тогда как Deno.serve принимает обработчик как непосредственный аргумент (перед ним можно указать объект параметров). Bun передаёт объект сервера вторым аргументом обработчику; Deno вместо этого передаёт сведения о соединении. Параметр routes в Bun не имеет встроенного аналога в Deno.serve: для маршрутизации используйте URLPattern или фреймворк. Подробнее см. в разделе «HTTP-серверы».

Переход с bun:sqlite на node:sqlite

Deno поддерживает встроенный модуль node:sqlite, который также работает синхронно и предоставляет те же возможности:

db.ts
import { DatabaseSync } from "node:sqlite";

const db = new DatabaseSync(":memory:");
db.exec("CREATE TABLE people (name TEXT)");
db.prepare("INSERT INTO people VALUES (?)").run("Ada");

const rows = db.prepare("SELECT * FROM people").all();
console.log(rows);

Названия классов отличаются (DatabaseSync и StatementSync вместо Database и Statement), но последовательность prepare/run/get/all остаётся такой же.

Переход с Bun.file на файловые API Deno

Bun.file() возвращает отложенную ссылку на файл с методами .text() и .json(). В Deno файл можно прочитать напрямую с помощью Deno.readTextFile или использовать Deno.open, если для потоковой передачи нужен файловый дескриптор:

const text = await Deno.readTextFile("./data.txt");
const config = JSON.parse(await Deno.readTextFile("./config.json"));

Для высокоуровневых вспомогательных функций (копирование, перемещение, обход, проверка существования) используйте пакет @std/fs. Также можно использовать node:fs, если вы предпочитаете API Node.

Переход с bun:test на deno test

bun test запускает тесты в стиле Jest, импортированные из bun:test. Deno поддерживает встроенный модуль node:test, поэтому структура describe и it переносится напрямую; для проверок используйте его вместе с node:assert:

add.test.ts
import { describe, it } from "node:test";
import assert from "node:assert";
import { add } from "./add.ts";

describe("add", () => {
  it("adds two numbers", () => {
    assert.strictEqual(add(1, 2), 3);
  });
});
›_
deno test

Если вы хотите сохранить проверки expect в стиле Jest из Bun, импортируйте expect из @std/expect. Также доступен собственный тестовый раннер Deno Deno.test. Полный обзор см. в разделе «Тестирование».

Оболочка $

Для шаблонной оболочки Bun на основе литералов $ существует почти идентичный аналог — dax, одна из библиотек, вдохновивших её создание.

import $ from "jsr:@david/dax";

const result = await $`echo hello`.text();

Для управления дочерними процессами без слоя оболочки используйте встроенный API Deno.Command.

Переход с bunfig.toml на deno.json

Настройки среды выполнения и инструментов переносятся из bunfig.toml в deno.json: там размещаются задачи, настройки форматировщика и линтера, параметры компилятора и карты импортов. Deno читает вместе с ним и package.json, поэтому переход можно выполнять постепенно. Подробнее см. в разделе «Конфигурация».

Чему нет прямого аналога

У некоторых возможностей Bun нет аналога в Deno, поэтому учитывайте это при планировании перехода:

  • Макросы. Bun может выполнять функции во время сборки с помощью импортов with { type: "macro" } и встраивать результаты. В Deno нет системы макросов на этапе сборки; выполняйте эту работу в скрипте сборки.
  • HTMLRewriter. Bun включает совместимый с Cloudflare Workers HTMLRewriter, построенный на lol-html. В Deno нет встроенного глобального объекта HTMLRewriter; используйте npm-пакет, например npm:lol-html, или HTML-парсер, например deno-dom.
  • Особенности сборщика. Возможности bun build, такие как HTML-точки входа с автоматической сборкой ресурсов, не имеют прямого соответствия в экспериментальном deno bundle. Для полнофункциональной сборки фронтенда используйте Vite или другой сборщик в Deno; см. раздел «Сборка».

Что дальше

  • Переход с Node.js. Многие сведения применимы и к проектам Bun, в том числе о разрешении CommonJS- и ES-модулей.
  • Безопасность и разрешения. Как работает песочница и какие флаги нужно указать.
  • Тестирование. Тестовый раннер, моки, снимки и покрытие кода.
  • Управление зависимостями. Подробно о рабочих процессах с npm, JSR и package.json.

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

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

Spec-Zone.ru

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