Переход с 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:
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, который также работает синхронно и предоставляет те же возможности:
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:
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.
Последнее обновление:
© 2018–2025 the Deno authors
Licensed under the MIT License.
https://docs.deno.com/runtime/migrate/migrate_from_bun