[JavaScript] Bun (Runtime + Bundler)
정의
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, …
💬 댓글