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

[JavaScript] Rollup

· 수정 · 📖 약 3분 · 977자/단어 #javascript #bundler #build-tool #rollup #library
Rollup, rollup, rollup.js, Rolldown, rollup plugin

정의

Rollup 은 Rich Harris (Svelte 창시자) 가 2015년 만든 JavaScript 번들러. 라이브러리 배포 에 특화되어 tree shaking 을 처음으로 제대로 구현했고, Vue/React/D3 등 수많은 라이브러리가 Rollup 으로 배포됩니다.

2024+: Rust 재구현 Rolldown 이 시작되어 Vite 6+ 프로덕션 백엔드로 이관 진행.

왜 라이브러리에 Rollup 인가

라이브러리 요구사항:

  • 여러 포맷 출력: ESM, CJS, UMD, IIFE (앱마다 다른 소비)
  • 작은 결과물: 사용자 앱에 포함되므로
  • 완벽한 tree shaking
  • 깨끗한 output: 웹팩의 runtime wrapper 없음
  • Source map 정확성

Webpack 은 앱 특화, Rollup 은 라이브러리 특화.

기본 설정

// rollup.config.js
import typescript from '@rollup/plugin-typescript';
import { nodeResolve } from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import terser from '@rollup/plugin-terser';

export default {
  input: 'src/index.ts',
  output: [
    {
      file: 'dist/index.mjs',
      format: 'esm',
      sourcemap: true,
    },
    {
      file: 'dist/index.cjs',
      format: 'cjs',
      sourcemap: true,
    },
    {
      file: 'dist/index.umd.js',
      format: 'umd',
      name: 'MyLib',
      globals: { react: 'React' },
    },
  ],
  external: ['react', 'react-dom'],
  plugins: [
    typescript(),
    nodeResolve(),
    commonjs(),
    terser(),
  ],
};

출력 포맷

Format용도
esm모던 번들러/브라우저 (import/export)
cjsNode.js CommonJS
umd브라우저 script tag + AMD + CJS (범용)
iife브라우저 script tag (즉시 실행)
amdRequireJS (legacy)
systemSystemJS

라이브러리는 대개 esm + cjs dual, 브라우저 CDN 용 umd 추가.

External

라이브러리는 dependencies 를 번들에 포함 안 함:

external: ['react', 'react-dom', 'lodash']

react 는 앱 쪽에서 제공. 이 정보를 dependencies (or peerDependencies) 와 동기화.

Tree Shaking

Rollup 이 처음으로 대중화 한 개념. ESM 정적 분석 기반:

// utils.js
export function used() {}
export function unused() {}

// main.js
import { used } from './utils';
used();

// rollup 결과: unused() 완전 제거

Webpack 은 뒤늦게 지원, esbuild/Rolldown 도 지원.

Pure annotation: 함수 호출에 side effect 없다는 힌트

const x = /*#__PURE__*/ computeValue();

x 미사용 시 컴파일러가 computeValue() 호출도 제거.

Plugin 생태계

  • @rollup/plugin-typescript: TS
  • @rollup/plugin-node-resolve: node_modules 해석
  • @rollup/plugin-commonjs: CJS interop
  • @rollup/plugin-json
  • @rollup/plugin-babel
  • @rollup/plugin-terser: 압축
  • rollup-plugin-visualizer: 번들 분석
  • rollup-plugin-dts: .d.ts bundling

Vite 는 Rollup plugin 호환 (Vite 6 부터는 Rolldown plugin, 상당 부분 호환).

Rolldown (2024+)

Rollup 의 Rust 재구현. VoidZero (Vue/Vite 팀) 주도.

  • Rollup 호환 API + plugin
  • Rust 성능 (esbuild/Turbopack 급)
  • Vite 6+ 프로덕션 백엔드 로 이관 예정
  • Beta 진행 중 (2025)

목표: Vite 의 개발 즉시성 + 프로덕션 빌드 속도. rolldown-vite 로 얼리 어답터 사용 가능.

Rollup vs Webpack (라이브러리 관점)

RollupWebpack
Output 크기작음 (wrapper 최소)큼 (runtime 포함)
여러 포맷자연스러움복잡한 설정
Tree shaking최상좋음
CSS 처리Plugin 필요Loader 광범위
Code splitting지원매우 강력
HMRX (Vite 가 얹음)O
SPA 개발Vite 로 대체자체 완결

결정: 라이브러리 = Rollup / tsup, SPA = Vite / Turbopack.

tsup (Rollup 대안)

tsup 은 esbuild 기반이지만 라이브러리 특화. Rollup 보다 훨씬 빠름:

{
  "scripts": {
    "build": "tsup src/index.ts --format esm,cjs --dts --clean"
  }
}
  • 자동 CJS/ESM dual
  • .d.ts 자동 생성
  • Zero-config

결정:

  • 세밀한 제어 필요 → Rollup
  • 표준 라이브러리 빠르게 → tsup

함정

WARNING

external 안 지정 하면 모든 의존성이 번들에 들어감. 크기 폭발.

CAUTION

CJS 라이브러리 소비 시 interop 이슈. commonjs() plugin + esModuleInterop.

WARNING

UMD 는 globals 매핑 필수. React 라이브러리면 globals: { react: 'React' }.

IMPORTANT

.d.ts 자동 아님. rollup-plugin-dtstsc --emitDeclarationOnly 병행.

CAUTION

Rolldown 은 beta. 프로덕션 라이브러리는 안정된 Rollup 유지, 실험용부터 Rolldown.

라이브러리 배포 워크플로우

flowchart LR
    SRC["src/index.ts"] --> ROLLUP["Rollup 번들링"]
    ROLLUP --> ESM["dist/index.mjs<br/>ESM"]
    ROLLUP --> CJS["dist/index.cjs<br/>CJS"]
    ROLLUP --> UMD["dist/index.umd.js<br/>브라우저 CDN"]
    ROLLUP --> DTS["dist/index.d.ts<br/>TypeScript 타입"]
    ESM --> NPM["npm publish"]
    CJS --> NPM
    UMD --> NPM
    DTS --> NPM

package.json exports 필드 (최신 방식)

Node.js 12+ 와 모던 번들러가 인식하는 조건부 진입점.

{
  "name": "my-library",
  "main": "./dist/index.cjs",
  "module": "./dist/index.mjs",
  "types": "./dist/index.d.ts",
  "sideEffects": false,
  "exports": {
    ".": {
      "import": "./dist/index.mjs",
      "require": "./dist/index.cjs",
      "types": "./dist/index.d.ts"
    },
    "./utils": {
      "import": "./dist/utils.mjs",
      "require": "./dist/utils.cjs"
    }
  }
}
  • "sideEffects": false: 번들러에게 tree-shaking 허용 신호
  • exports 맵: 서브패스 진입점 명시
  • 구버전 지원용 main + module 병행 유지

빌드 성능 최적화

watch 모드

rollup -c --watch

파일 변경 감지 후 자동 재빌드. Vite 는 Rollup watch 위에 HMR 을 얹은 구조.

병렬 빌드

// rollup.config.js: 배열로 여러 설정 동시 처리
export default [
  { input: 'src/index.ts', output: { format: 'esm', file: 'dist/index.mjs' } },
  { input: 'src/index.ts', output: { format: 'cjs', file: 'dist/index.cjs' } },
];

Cache 재사용

let cache;
const bundle = await rollup({ input: 'src/index.ts', cache });
cache = bundle.cache; // 다음 빌드에 재사용 (CI 에서 특히 효과적)
await bundle.write({ format: 'esm', file: 'dist/index.mjs' });

Rolldown 마이그레이션 현황 (2025)

항목상태
Rollup plugin 호환대부분 지원, 일부 차이 있음
Vite 6.x 기본 번들러점진적 전환 중
API 안정성Beta, breaking change 가능
성능Rollup 대비 10x 이상 빠름
프로덕션 추천안정된 Rollup 유지 권장
# rolldown-vite 얼리 어답터 시도
npm install rolldown-vite

관련 위키

이 글의 용어 (8개)
[JavaScript] Bun (Runtime + Bundler)javascript
정의 Bun 은 Jarred Sumner 가 2022년 발표한 JavaScript/TypeScript 런타임 + 번들러 + 패키지 매니저 + 테스트 러너 통합 도구입니다. Zig…
[JavaScript] Bundling (번들링 개요)javascript
정의 JavaScript 번들링 (Bundling) 은 여러 소스 파일 (JS, CSS, 이미지, JSON 등) 을 브라우저나 런타임이 효율적으로 실행할 수 있는 최소한의 결과물…
[JavaScript] CommonJS vs ESM (package.json 설정 완전 정복)javascript
정의 JavaScript 는 두 개의 서로 다른 모듈 시스템 을 가집니다. - CommonJS (CJS): Node.js 초기 (2009) 부터 사용. / . 동기 로딩. - E…
[Javascript] ES Modules (import / export)javascript
정의 ES Modules (ESM) 은 표준 JS 모듈 시스템 (ES6). / 키워드. 브라우저와 Node.js 16+ 모두 지원. export named export defau…
[JavaScript] esbuildjavascript
정의 esbuild 는 Evan Wallace (Figma CTO) 가 2020년 발표한 Go 로 작성된 JavaScript 번들러/컴파일러 입니다. 10-100배 빠른 성능으로…
[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 생태…

💬 댓글

사이트 검색 / 명령어

검색

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