---
id: frontend-bun-lightning-patterns
title: Bun Bundler / Lightning CSS / esbuild plugins
category: Coding
status: draft
source_trust_level: B
verification_status: conceptual
created_at: 2026-05-09
updated_at: 2026-05-09
tags: [frontend, build, bun, vibe-coding]
tech_stack: { language: "TS", applicable_to: ["Frontend"] }
applied_in: []
aliases: [Bun bundler, Lightning CSS, esbuild plugins, Bun.build, Vite plugin, build performance]
---

# Bun / Lightning CSS / esbuild Plugins

> Modern build의 가장 빠른 부분. **Bun (JS runtime + bundler), Lightning CSS (Rust CSS), esbuild plugins**.

## 📖 핵심 개념
- Bun: JS runtime + bundler + test + npm.
- Lightning CSS: PostCSS 의 Rust 대체.
- esbuild plugins: hook 을 plug.
- 모든 native = 10-100x 빠름.

## 💻 코드 패턴

### Bun bundler (CLI)
```bash
bun build src/index.ts --outfile=dist/out.js --target=browser --minify
```

### Bun bundler (JS API)
```ts
const result = await Bun.build({
  entrypoints: ['src/index.ts'],
  outdir: 'dist',
  target: 'browser',
  format: 'esm',
  minify: true,
  splitting: true,
  sourcemap: 'external',
});

if (!result.success) {
  for (const m of result.logs) console.error(m);
}
```

### Bun runtime
```ts
// Hot reload
bun --hot run server.ts

// SQLite native
const db = new Bun.SQLite('app.db');
db.query('SELECT * FROM users').all();

// Test
bun test
```

→ Node + npm + bundler + test 한 binary.

### Bun.serve
```ts
// 빠른 HTTP server
Bun.serve({
  port: 3000,
  fetch(req) {
    return new Response('Hello');
  },
});
```

→ Hono / Express 의 alternative. 빠름.

### Bun shell
```ts
import { $ } from 'bun';

await $`ls -la`;
const r = await $`echo hello`.text();
```

→ Cross-platform shell.

### Lightning CSS (Rust CSS)
```bash
yarn add -D lightningcss
```

```ts
import { transform, bundle } from 'lightningcss';

const { code, map } = transform({
  filename: 'main.css',
  code: Buffer.from(css),
  minify: true,
  sourceMap: true,
  targets: {
    chrome: 90 << 16,
    firefox: 90 << 16,
  },
});
```

→ PostCSS + autoprefixer + minify + nesting.

### Vite + Lightning CSS
```js
export default defineConfig({
  css: {
    transformer: 'lightningcss',
    lightningcss: {
      targets: { chrome: 90 },
    },
  },
});
```

### Tailwind 4 + Lightning CSS
```
Tailwind v4 가 Lightning CSS 사용 (Rust 기반).
- 100x 빠른 build.
- CSS-native (no JS config).
```

### CSS nesting (native)
```css
/* 모던 native nesting */
.card {
  padding: 16px;
  
  & h2 {
    font-size: 1.5rem;
  }
  
  &:hover {
    background: #eee;
  }
}
```

→ Lightning CSS 가 transform (구 browser).

### esbuild plugin 작성
```ts
import { build, Plugin } from 'esbuild';

const myPlugin: Plugin = {
  name: 'my-plugin',
  setup(build) {
    // Resolve hook
    build.onResolve({ filter: /\.json$/ }, args => ({
      path: args.path,
      namespace: 'json',
    }));
    
    // Load hook
    build.onLoad({ filter: /.*/, namespace: 'json' }, async (args) => {
      const text = await fs.promises.readFile(args.path, 'utf8');
      return {
        contents: `export default ${text}`,
        loader: 'js',
      };
    });
    
    // End hook
    build.onEnd((result) => {
      console.log(`Built ${result.outputFiles?.length}`);
    });
  },
};

await build({
  entryPoints: ['index.ts'],
  bundle: true,
  outfile: 'out.js',
  plugins: [myPlugin],
});
```

### Common esbuild plugins
```
- esbuild-plugin-svelte
- esbuild-plugin-vue
- esbuild-plugin-postcss
- esbuild-plugin-svgr
- esbuild-plugin-glob
```

### Vite plugin (Rollup 기반)
```ts
import type { Plugin } from 'vite';

export function myPlugin(): Plugin {
  return {
    name: 'my-plugin',
    
    config(config) {
      // Modify config
    },
    
    transform(code, id) {
      if (id.endsWith('.special')) {
        return { code: transform(code) };
      }
    },
    
    resolveId(id) {
      if (id === 'virtual:my-module') return id;
    },
    
    load(id) {
      if (id === 'virtual:my-module') {
        return 'export default 42';
      }
    },
  };
}
```

### Vite virtual module
```ts
// Plugin 가 virtual module
load(id) {
  if (id === 'virtual:routes') {
    const routes = scanFiles('src/routes');
    return `export default ${JSON.stringify(routes)}`;
  }
}

// User code
import routes from 'virtual:routes';
```

→ Build-time code generation.

### Bundle 크기 분석
```bash
# esbuild
esbuild --analyze=verbose

# Vite + rollup-plugin-visualizer
import { visualizer } from 'rollup-plugin-visualizer';
plugins: [visualizer()]
```

### CSS tree-shake
```css
/* Used */
.btn { ... }

/* Unused */
.unused { ... }
```

```js
// PurgeCSS 또는 Lightning CSS 의 unused class detection
```

→ Tailwind 가 자체.

### CSS sourcemap
```ts
{
  sourceMap: true,
}
```

→ Browser DevTools 에서 original source.

### Speed comparison
```
Webpack: baseline.
Vite (dev): 0.1x time.
Vite (build): 0.3x.
esbuild: 0.05x.
Bun build: 0.04x.
```

### Bun 의 약점
```
- npm ecosystem 이 일부 안 작동.
- Production 안정성 (2026 stable 가 새).
- Tooling integration 부족.
- Native module 일부 X.

→ Side project / new = OK.
큰 enterprise = Node 가 안전.
```

### Lightning CSS 의 약점
```
- PostCSS plugin 호환 X.
- 일부 modern CSS 기능 not yet.

→ Tailwind 4+ 가 가장 큰 user.
```

### React + Bun
```bash
bun create vite my-app -- --template react-ts
cd my-app
bun install
bun run dev
```

→ Vite 가 그대로. Runtime 가 Bun.

### Next.js + Bun
```bash
bun create next-app my-app
cd my-app
bun run dev
```

→ Next 가 Webpack/Turbopack 사용. Bun 가 npm replacement.

### Production deploy (Bun)
```dockerfile
FROM oven/bun:1
WORKDIR /app
COPY package.json bun.lockb ./
RUN bun install --production
COPY . .
CMD ["bun", "src/server.ts"]
```

→ Hono + Bun = 가장 빠른 stack.

### Esbuild loader
```ts
{
  loader: {
    '.svg': 'text',         // SVG 가 string
    '.png': 'dataurl',      // base64
    '.txt': 'text',
    '.wasm': 'binary',
  },
}
```

### Bun 의 .env
```ts
// 자동 load
import.meta.env.MY_VAR

// .env, .env.local, .env.{NODE_ENV}
```

→ Vite 와 비슷.

### Workspace (monorepo)
```json
// package.json
{
  "workspaces": ["packages/*", "apps/*"]
}
```

```bash
bun install
# → 모든 workspace install.
```

### Future
```
- Bun 가 Node 대안 (실험적 → production)
- Lightning CSS = Tailwind 의 future
- esbuild / swc = compiler standard
- Webpack 의 share 줄어듦.
```

## 🤔 의사결정 기준
| 작업 | 추천 |
|---|---|
| Modern Bun stack | Bun + Hono |
| React app | Vite + esbuild |
| 큰 enterprise | Node + Vite |
| 빠른 CLI | Bun shell |
| CSS-heavy | Lightning CSS |
| Tailwind 4 | Lightning CSS (자동) |
| Custom build | esbuild plugin |
| Monorepo | Bun workspace |

## ❌ 안티패턴
- **모든 거 Bun (production)**: 일부 깨짐.
- **PostCSS + Lightning CSS 둘 다**: 충돌.
- **CSS tree-shake 없음**: 큰 bundle.
- **Sourcemap prod**: leak.
- **Big bun.lockb in git**: OK (sync 위해).
- **ESM + CJS 혼동**: import 깨짐.

## 🤖 LLM 활용 힌트
- Bun = JS runtime + bundler + test + npm 한 binary.
- Lightning CSS = Tailwind 4 + Rust.
- esbuild plugin 가 pluggable.
- Modern stack = native (Rust / Go) tool.

## 🔗 관련 문서
- [[Frontend_Turbopack_Rspack]]
- [[Runtime_Bun_Deno_Comparison]]
- [[TS_Build_Bundler_Patterns]]
