Bun - альтернатива NodeJS, которая позволяет более быстро и эффективно пользоваться возможностями разработки на JS
Установка тут достаточно простая и выполняется буквально одной командой.
Базовые команды
# установка пакета
bun install <pkg>
# бандлинг проекта
bun build ./index.tsx
# запуск тестов
bun test
# выполнение установленного пакета
bunx cowsay 'Hello, world!'
# создание нового проекта
bun init
# запуск команды из package.json
bun run startBun в TypeScript-проекте
Bun умеет запускать TypeScript-файлы без отдельной ручной компиляции.
bun run src/index.ts
bun --watch src/index.tsДля проверки типов всё равно стоит использовать TypeScript compiler:
bunx tsc --noEmitBun быстро запускает код, но сам запуск не заменяет полноценный typecheck.
package.json
{
"scripts": {
"dev": "bun --watch src/index.ts",
"typecheck": "tsc --noEmit",
"test": "bun test"
}
}Так выглядит простейший сервер на Bun
index.ts
import Bun, { file, serve } from "bun";
const server = serve({
port: 3000,
fetch(request) {
return new Response("Welcome to Bun!");
},
});
console.log(`Listening on localhost:${server.port}`);Так же из коробки он провайдит достаточно большое количество API, которые покрывают почти все нужные потребности для backend-разработки
Bun.serve({
fetch(req, server) {}, // upgrade logic
websocket: {
message(ws, message) {}, // a message is received
open(ws) {}, // a socket is opened
close(ws, code, message) {}, // a socket is closed
drain(ws) {}, // the socket is ready to receive more data
},
});Встроенный сборщик, который работает на esbuild и их конфигурация будет достаточно схожа друг с другом
await Bun.build({
entrypoints: ['./index.tsx'],
outdir: './build',
});Когда использовать Bun
Bun можно использовать как:
- package manager;
- runtime для backend-сервисов и скриптов;
- test runner;
- bundler для простых сценариев.
В продакшене важно проверять совместимость зависимостей с Bun runtime. Если проект завязан на Node.js API или нативные модули, сначала стоит прогнать интеграционные тесты.
Тесты абсолютно аналогичны Jest
import { expect, test, describe } from "bun:test";
describe("arithmetic", () => {
test("2 + 2", () => {
expect(2 + 2).toBe(4);
});
test("2 * 2", () => {
expect(2 * 2).toBe(4);
});
});Плюсы
- очень быстрый runtime и package manager;
- из коробки есть test runner и bundler;
- удобно запускает TypeScript без отдельной настройки.
Минусы
- совместимость с Node.js-экосистемой нужно проверять на практике;
- молодая платформа по сравнению с Node.js;
- часть production-инфраструктуры может быть завязана на Node.js.
Когда использовать
- нужны быстрые локальные скрипты, dev-серверы и тесты;
- проект может позволить проверку совместимости зависимостей;
- команда хочет один инструмент для runtime, install, test и build.