본문으로 건너뛰기
김신건의 로그

[JavaScript] Bun (Runtime + Bundler)

· 수정 · 📖 약 2분 · 703자/단어 #javascript #bundler #build-tool #runtime #bun
Bun, bun, Bun runtime, Bun bundler, bun install, Bun.build

정의

Bun 은 Jarred Sumner 가 2022년 발표한 JavaScript/TypeScript 런타임 + 번들러 + 패키지 매니저 + 테스트 러너 통합 도구입니다. Zig 로 작성되어 Node.js/npm 대비 압도적 성능.

한 줄 요약: Node + npm + Webpack + Jest 를 하나의 초고속 도구로.

구성 요소

Bun 은 여러 도구를 하나로:

  • bun 런타임: Node.js 대체
  • bun install: npm/yarn/pnpm 대체
  • bun run: node 실행
  • bun test: Jest 대체
  • bun build / Bun.build(): 번들러
  • bunx: npx 대체

왜 Zig 인가

  • Rust 보다 러닝커브 낮음
  • C 와 상호운용 우수
  • 컴파일 시간 빠름
  • 저수준 제어 (JavaScriptCore 통합)

Node 가 V8 + libuv + C++ 인 것과 대비되게, Bun 은 JavaScriptCore (Safari) + Zig 조합.

번들러 사용

CLI

bun build ./src/index.ts \
  --outdir=dist \
  --minify \
  --sourcemap \
  --target=browser

API

await Bun.build({
  entrypoints: ['./src/index.ts'],
  outdir: './dist',
  minify: true,
  sourcemap: 'external',
  target: 'browser',
  format: 'esm',
  external: ['react'],
  plugins: [/* ... */],
});

특징

TypeScript 네이티브

.ts 를 별도 설치 없이 실행/번들:

bun run src/main.ts   # 그냥 됨

esbuild/SWC 처럼 type check 는 X (bun tsc --noEmit 별도).

JSX 네이티브

.tsx, .jsx 즉시 지원. React/Preact/Solid 등.

CSS 지원

CSS import 기본 지원. PostCSS 는 plugin 필요.

Dead Code Elimination + Tree Shaking

ESM 기반, esbuild 급.

Import Attributes

import config from './config.json' with { type: 'json' };

패키지 매니저 (bun install)

node_modules 관리:

  • 속도: npm 대비 20-30x, pnpm 대비 2-3x
  • 호환: package.json 표준
  • Lockfile: bun.lock (텍스트 형식)
  • Workspace: 모노레포 지원
bun install
bun add react
bun add -d typescript
bun remove react

런타임

Node.js 호환

대부분 Node.js API 지원. 몇몇 예외 (worker_threads 부분 지원, 일부 native module).

Bun 자체 API

// HTTP 서버 (Express 없이)
Bun.serve({
  port: 3000,
  fetch(req) {
    return new Response('Hello');
  },
});

// 파일 IO
const file = Bun.file('./data.json');
const json = await file.json();

// 파일 쓰기
await Bun.write('./out.txt', 'content');

// SQLite (bundled)
import { Database } from 'bun:sqlite';
const db = new Database('mydb.sqlite');

성능

  • HTTP throughput: Node 대비 3-4x
  • Startup time: 매우 빠름
  • Memory usage: 낮음

번들러 vs esbuild

공통점:

  • ESM 기반 tree shaking
  • TypeScript/JSX 즉시
  • 초고속

차이점:

  • Bun 은 통합 스택 (런타임 + 매니저 + 테스트 + 번들러)
  • esbuild 는 순수 번들러/트랜스파일러

사용 사례

1. Node.js 앱 대체

bun install
bun run src/server.ts

Node → Bun 전환. 대부분 앱 즉시 작동.

2. TypeScript 스크립트

bun run scripts/generate.ts   # tsx, ts-node 대체

3. 모노레포

// package.json
{
  "workspaces": ["packages/*"]
}

bun install 이 워크스페이스 링크 관리.

4. 라이브러리 빌드

{
  "scripts": {
    "build": "bun build ./src/index.ts --outdir=dist --format=esm --external=*"
  }
}

Rollup/tsup 대체.

5. 테스트

bun test

Jest 호환 API (일부).

프로덕션 사용

적합:

  • 새 프로젝트
  • Node 앱 (서버, CLI, 스크립트)
  • 모노레포
  • CI 스크립트

주의:

  • 일부 Node.js API 미지원 (특히 legacy)
  • Native module (.node 파일) 호환성 이슈
  • 아직 Node 만큼 배포 검증 축적 안 됨
  • Jest snapshot 등 일부 테스트 도구 이관 필요

함정

WARNING

Node 호환 100% 아님. 프로덕션 이관 전 앱 실행 검증 필수.

CAUTION

Type check 별도. bun run tsc --noEmit 을 CI 에.

WARNING

일부 npm 패키지 호환 안 됨. 특히 native binding.

IMPORTANT

Bun lockfile 은 텍스트 (bun.lock, v1.1+) 이라 git diff 가능. 이전 바이너리 bun.lockb 는 마이그레이션.

CAUTION

AWS Lambda 등 서버리스. 공식 Bun runtime 지원 없으면 컨테이너 이미지 배포.

관련 위키

이 글의 용어 (8개)
[JavaScript] Bundling (번들링 개요)javascript
정의 JavaScript 번들링 (Bundling) 은 여러 소스 파일 (JS, CSS, 이미지, JSON 등) 을 브라우저나 런타임이 효율적으로 실행할 수 있는 최소한의 결과물…
[JavaScript] CommonJS vs ESM (package.json 설정 완전 정복)javascript
정의 JavaScript 는 두 개의 서로 다른 모듈 시스템 을 가집니다. - CommonJS (CJS): Node.js 초기 (2009) 부터 사용. / . 동기 로딩. - E…
[JavaScript] esbuildjavascript
정의 esbuild 는 Evan Wallace (Figma CTO) 가 2020년 발표한 Go 로 작성된 JavaScript 번들러/컴파일러 입니다. 10-100배 빠른 성능으로…
[JavaScript] Rollupjavascript
정의 Rollup 은 Rich Harris (Svelte 창시자) 가 2015년 만든 JavaScript 번들러. 라이브러리 배포 에 특화되어 tree shaking 을 처음으로…
[JavaScript] Turbopack & Rspack (Rust 번들러)javascript
정의 2022-2023년 등장한 Rust 로 재구현된 Webpack 계열 번들러 두 개: - Turbopack: Vercel (Next.js) 개발. Next.js dev/bui…
[JavaScript] Vitejavascript
정의 Vite (프랑스어 "빠르다") 는 Evan You (Vue 창시자) 가 2020년 시작한 모던 프런트엔드 빌드 도구. 두 부분: - Dev Server: Native ES…
[JavaScript] Webpackjavascript
정의 Webpack 은 2014년 Tobias Koppers 가 만든 JavaScript 모듈 번들러입니다. 오랫동안 사실상의 표준 이었고, 방대한 loader/plugin 생태…
TypeScripttypescript
정의 TypeScript 는 Microsoft 가 2012년 발표한 JavaScript 의 상위 집합 프로그래밍 언어입니다. 정적 타입 시스템, 인터페이스, 제네릭, enum, …

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기