Современные версии Deno поддерживают нативную работу с npm-пакетами, что делает возможным использование esbuild без дополнительных транспиляционных слоёв и внешних сборочных инструментов.
Подключение esbuild в Deno опирается на механизм:
npm:-specifier resolutionТакой подход позволяет использовать привычный Node.js-экосистемный пакет без потери преимуществ Deno: строгих разрешений и детерминированных зависимостей.
Базовое подключение выполняется напрямую через npm-импорт:
import * as esbuild from "npm:esbuild@0.25.0";
При первом запуске Deno загрузит пакет в локальный кэш. Дальнейшие вызовы выполняются без повторного скачивания.
Важный аспект — необходимость разрешений:
deno run --allow-read --allow-write --allow-net build.ts
--allow-net — загрузка зависимостей и возможных
плагинов--allow-read — доступ к исходным файлам--allow-write — запись результатов сборкиСтандартный сценарий использования esbuild в Deno идентичен Node.js-подходу, но с учётом специфик рантайма:
import * as esbuild from "npm:esbuild@0.25.0";
await esbuild.build({
entryPoints: ["./src/main.ts"],
bundle: true,
platform: "browser",
outfile: "./dist/bundle.js",
format: "esm",
});
Ключевые параметры:
entryPoints — входные точки приложенияbundle — объединение зависимостейplatform — целевая платформа (browser,
node, neutral)outfile — путь итогового файлаformat — формат модуля (ESM, CJS, IIFE)Deno изначально поддерживает TypeScript, однако esbuild используется для ускоренной трансформации и бандлинга.
Типовой сценарий:
import * as esbuild from "npm:esbuild@0.25.0";
await esbuild.build({
entryPoints: ["src/app.ts"],
bundle: true,
outfile: "dist/app.js",
target: ["es2022"],
loader: {
".ts": "ts",
".tsx": "tsx",
},
});
Особенности:
deno check)В отличие от Node.js, Deno не использует process.env и
require. Поэтому конфигурация esbuild адаптируется:
await esbuild.build({
entryPoints: ["src/main.ts"],
bundle: true,
outfile: "dist/app.js",
define: {
"Deno.env": "undefined",
},
});
Распространённые замены:
process.env.NODE_ENV →
Deno.env.get("ENV")Deno.readTextFile,
Deno.writeTextFileesbuild поддерживает режим наблюдения за изменениями файлов:
import * as esbuild from "npm:esbuild@0.25.0";
const ctx = await esbuild.context({
entryPoints: ["src/main.ts"],
bundle: true,
outfile: "dist/app.js",
});
await ctx.watch();
Особенности в Deno:
--allow-readawait ctx.dispose();
Плагины esbuild работают в Deno при условии npm-совместимости.
Пример подключения плагина:
import * as esbuild from "npm:esbuild@0.25.0";
import alias from "npm:esbuild-plugin-alias";
await esbuild.build({
entryPoints: ["src/main.ts"],
bundle: true,
outfile: "dist/app.js",
plugins: [
alias({
entries: {
"@": "./src",
},
}),
],
});
Ограничения:
fs из Node APIПрактика использования esbuild в Deno часто подразумевает выделение build-скрипта:
project/
src/
dist/
build.ts
deno.json
Пример build.ts:
import * as esbuild from "npm:esbuild@0.25.0";
const isProd = Deno.env.get("MODE") === "production";
await esbuild.build({
entryPoints: ["src/main.ts"],
bundle: true,
minify: isProd,
sourcemap: !isProd,
outfile: "dist/app.js",
});
В deno.json можно описать задачи сборки:
{
"tasks": {
"build": "deno run --allow-read --allow-write --allow-net build.ts"
}
}
Это позволяет стандартизировать процесс:
esbuild поддерживает загрузчики (loaders) для различных типов файлов:
await esbuild.build({
entryPoints: ["src/main.ts"],
bundle: true,
outfile: "dist/app.js",
loader: {
".png": "file",
".svg": "text",
".css": "css",
},
});
В Deno это особенно полезно при построении фронтенд-бандлов, так как:
esbuild сохраняет свою ключевую характеристику — высокую скорость сборки за счёт:
В связке с Deno наблюдаются следующие эффекты:
Использование esbuild в Deno имеет ряд особенностей:
Структура сборки в Deno-проектах с esbuild:
Проверка типов:
deno check src/main.tsСборка через esbuild:
deno task buildОптимизация вывода:
Деплой:
esbuild поддерживает разделение кода:
await esbuild.build({
entryPoints: ["src/main.ts"],
bundle: true,
splitting: true,
format: "esm",
outdir: "dist",
});
Это особенно эффективно при:
В серверном сценарии esbuild часто применяется для подготовки артефактов:
await esbuild.build({
entryPoints: ["server/app.ts"],
bundle: true,
platform: "node",
outfile: "dist/server.js",
});
Хотя Deno не требует bundling для выполнения, esbuild используется для:
Комбинация watch-режима esbuild и перезапуска Deno процесса:
const ctx = await esbuild.context({
entryPoints: ["src/main.ts"],
bundle: true,
outfile: "dist/app.js",
});
await ctx.watch();
Параллельно запускается:
deno run --allow-all --watch dist/app.js
Это создаёт двухуровневую систему:
Ключевые техники:
external для CDN зависимостейexternal: ["react", "react-dom"]
Deno обеспечивает строгую модель разрешений, что влияет на работу esbuild:
Это делает pipeline предсказуемым и изолированным, особенно при использовании npm-версии esbuild.