tsup vs Rollup: fazendo bundle de bibliotecas TypeScript
Escolha o tsup para builds rápidos de bibliotecas TypeScript com quase nenhuma config, movidos pelo esbuild; escolha o Rollup quando precisar de controle preciso sobre saída, plugins e tree-shaking para um pacote publicado.
tsup e Rollup fazem bundle de bibliotecas TypeScript/JavaScript, mas em níveis de abstração diferentes. O tsup é um wrapper fino e opinativo em torno do esbuild (com geração de .d.ts baseada em rollup) que produz bundles ESM/CJS com config mínima. O Rollup é um bundler de nível mais baixo e altamente configurável, conhecido por saída limpa e forte tree-shaking, muito usado para publicar bibliotecas.
| tsup | Rollup | |
|---|---|---|
| Engine | esbuild (+ rollup para tipos) | Núcleo do Rollup |
| Config | Mínima (tsup.config.ts) | Explícita (rollup.config.js + plugins) |
| Velocidade | Muito rápida (esbuild) | Rápida, mais lenta que o esbuild |
| Formatos de saída | ESM, CJS, IIFE | ESM, CJS, UMD, IIFE, etc. |
| Declarações de tipo | Integradas (--dts) | Via plugin (ex.: rollup-plugin-dts) |
| Controle | Opinativo | Granular |
Onde cada um realmente se destaca
O tsup vence em velocidade e ergonomia: um comando produz ESM/CJS duplo mais declarações de tipo, o que cobre a maioria das bibliotecas npm com quase nenhuma config. O Rollup vence quando você precisa de controle exato, como nomeação de saída customizada, code-splitting avançado, comportamento específico de plugin ou máxima qualidade de tree-shaking, e está disposto a manter uma config e uma cadeia de plugins.
No CI
O tsup mantém os passos de build curtos e rápidos nos runners, o que reduz o custo por minuto. Os builds do Rollup ainda são rápidos, mas exigem muita configuração; cacheie o node_modules e a saída do build para que o CI não reconstrua pacotes inalterados. Para bibliotecas, rode uma verificação de tipos (tsc --noEmit) junto do bundle no CI, já que o esbuild não faz verificação de tipos.
Ressalvas honestas
O tsup usa o esbuild, que é extremamente rápido, mas não faz verificação de tipos e suporta um subconjunto de transformações de casos extremos; você trata os tipos separadamente. O Rollup dá mais controle ao custo de mais setup e builds mais lentos. Note que o próprio tsup depende do esbuild e do Rollup por baixo dos panos, então a escolha é realmente sobre quanto controle você quer.
O veredito
Use o tsup para builds de biblioteca rápidos e com pouca config que cobrem o caso comum de ESM/CJS mais tipos. Use o Rollup quando o controle de saída, plugins avançados ou a qualidade do tree-shaking justificarem a configuração extra.