tsup vs Rollup: TypeScript ライブラリのバンドル
esbuild を用いた、高速でほぼゼロ設定の TypeScript ライブラリ build が欲しいなら tsup を選び、公開するパッケージの出力、プラグイン、tree-shaking を精密に制御したいなら Rollup を選びましょう。
tsup と Rollup はどちらも TypeScript/JavaScript ライブラリをバンドルしますが、抽象化のレベルが異なります。tsup は esbuild を包む薄く意見の強いラッパー (.d.ts 生成には rollup ベース) で、最小限の設定で ESM/CJS バンドルを生成します。Rollup はより低レベルで高度に設定可能なバンドラーで、クリーンな出力と強力な tree-shaking で知られ、ライブラリの公開に広く使われています。
| tsup | Rollup | |
|---|---|---|
| エンジン | esbuild (+ 型には rollup) | Rollup コア |
| 設定 | 最小限 (tsup.config.ts) | 明示的 (rollup.config.js + プラグイン) |
| 速度 | 非常に高速 (esbuild) | 高速、esbuild より遅い |
| 出力フォーマット | ESM、CJS、IIFE | ESM、CJS、UMD、IIFE など |
| 型宣言 | 組み込み (--dts) | プラグイン経由 (例: rollup-plugin-dts) |
| 制御 | 意見が強い | きめ細かい |
それぞれが本当に優れている点
tsup は速度と使い勝手で優れます。1 つのコマンドで ESM/CJS のデュアルに加えて型宣言を生成し、ほぼ設定なしでほとんどの npm ライブラリをカバーします。Rollup は、カスタムの出力命名、高度な code-splitting、特定のプラグイン挙動、最大限の tree-shaking 品質など、正確な制御が必要で、設定とプラグインチェーンを維持する意思がある場合に優れます。
CI では
tsup は runner での build ステップを短く高速に保ち、分あたりのコストを下げます。Rollup の build も高速ですが設定が重いため、node_modules と build 出力をキャッシュして CI が変更のないパッケージを再構築しないようにしましょう。ライブラリでは、esbuild は型チェックを行わないため、CI でバンドルと並行して型チェック (tsc --noEmit) を実行しましょう。
正直な注意点
tsup は esbuild を使っており、これは非常に高速ですが型チェックを行わず、エッジケースの変換の一部のみをサポートするため、型は別途扱います。Rollup はより多くの制御を提供しますが、その代償としてセットアップが増え build が遅くなります。tsup 自体が内部で esbuild と Rollup に依存している点に注意してください。つまり、選択は実際にはどれだけの制御が欲しいかによります。
結論
ESM/CJS に型を加えた一般的なケースをカバーする、高速で設定の少ないライブラリ build には tsup を使いましょう。出力の制御、高度なプラグイン、tree-shaking の品質が追加設定に見合う場合は Rollup を使いましょう。