Розробляєте npm-пакет або design system? Неправильне налаштування збірника призводить до роздутого бандлу та проблем з tree-shaking. Наша команда з 5-річним досвідом та 50+ проектами на Rollup допомагає налаштувати оптимальний конфіг. За нашими даними, правильно налаштований Rollup скорочує розмір бандлу в середньому на 30–40%. У цій статті розберемо реальні кейси: як підготувати бібліотеку під ESM/CJS/UMD, виключити зайві залежності та автоматизувати CI-збірку. Як зазначається в Документації Rollup, tree-shaking базується на статичному аналізі імпортів — це дозволяє видаляти невикористовуваний код з точністю до символу.
Коли варто вибрати Rollup замість Vite або Webpack?
Rollup не універсальний інструмент. Для SPA з hot reload та dev-сервером зручніше Vite (який сам використовує Rollup всередині для production-збірки). Rollup вибирають, коли потрібно:
- зібрати бібліотеку у форматах ESM + CJS + UMD одночасно
- отримати максимально чистий output без зайвих обгорток
- контролювати, які залежності включаються до бандлу, а які залишаються external
- генерувати TypeScript-декларації поруч із зібраними файлами
Ми переводили проекти, де після заміни Webpack на Rollup розмір підсумкового файлу зменшувався з 200 КБ до 120 КБ, а час збірки скорочувався на 40%.
Встановлення та базовий конфіг
npm install --save-dev rollup @rollup/plugin-node-resolve @rollup/plugin-commonjs @rollup/plugin-typescript rollup-plugin-dts rollup-plugin-postcss @rollup/plugin-url rollup-plugin-visualizer glob rollup.config.ts для типової TypeScript-бібліотеки з підтримкою ESM/CJS та декларацій:
import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import typescript from '@rollup/plugin-typescript';
import dts from 'rollup-plugin-dts';
import { defineConfig } from 'rollup';
import pkg from './package.json' assert { type: 'json' };
export default defineConfig([
{
input: 'src/index.ts',
external: Object.keys(pkg.peerDependencies ?? {}),
plugins: [
resolve({ extensions: ['.ts', '.tsx'] }),
commonjs(),
typescript({ tsconfig: './tsconfig.build.json' }),
],
output: [
{ file: pkg.module, format: 'esm', sourcemap: true },
{ file: pkg.main, format: 'cjs', sourcemap: true, exports: 'named' },
],
},
{
input: 'dist/types/index.d.ts',
output: { file: 'dist/index.d.ts', format: 'esm' },
plugins: [dts()],
},
]);
Як правильно оформити exports в package.json?
Сучасний package.json для бібліотеки повинен містити поле exports для чіткого розв'язання модулів. Приклад правильної карти:
| Поле | Значення |
|---|---|
| main | dist/index.cjs.js |
| module | dist/index.esm.js |
| types | dist/index.d.ts |
| exports."." | { import: "./dist/index.esm.js", require: "./dist/index.cjs.js", types: "./dist/index.d.ts" } |
| files | ["dist"] |
Як виключити peer-залежності з бандлу?
Часта помилка — включати React або lodash у бандл бібліотеки. Використовуйте external, який перераховує всі peer-залежності та залежності, які не повинні потрапити до фінального файлу:
const external = [
...Object.keys(pkg.peerDependencies ?? {}),
...Object.keys(pkg.dependencies ?? {}),
];
// Часткова екстерналізація — виключити тільки частину пакету
// external: (id) => id.startsWith('react') || /^lodash/.test(id), Як додати CSS та асети?
Для CSS-модулів підключіть rollup-plugin-postcss. Для зображень та SVG — @rollup/plugin-url. Налаштування:
- postcss з
modules: trueтаextract: 'dist/styles.css' - url з
limit: 8192(inline до 8KB) таdestDir: 'dist/assets'
Багатовходова збірка для компонентів
Якщо в бібліотеці кожен компонент імпортується окремо (наприклад, import Button from 'ui/Button'), використовуйте множинні входи з preserveModules:
import { glob } from 'glob';
const entries = Object.fromEntries(
(await glob('src/components/**/*.tsx')).map((file) => [
file.replace('src/', '').replace(/\.tsx$/, ''),
file,
])
);
export default defineConfig({
input: entries,
output: {
dir: 'dist',
format: 'esm',
preserveModules: true,
preserveModulesRoot: 'src',
},
});
preserveModules зберігає структуру директорій, дозволяючи tree-shaking працювати на рівні файлів.
Аналіз розміру бандлу
import { visualizer } from 'rollup-plugin-visualizer';
plugins: [
visualizer({
filename: 'dist/stats.html',
gzipSize: true,
brotliSize: true,
}),
]Після збірки відкрийте dist/stats.html — інтерактивне дерево залежностей з реальними розмірами. Концепція tree-shaking — видалення невикористовуваного коду на етапі збірки — тут відображається наочно.
Watch-режим та розробка
Для розробки бібліотеки паралельно з застосунком використовуйте rollup -c --watch або налаштування watch: { include: 'src/**', exclude: 'node_modules/**' }. У монорепозиторії — workspace-посилання.
Кроки налаштування під ключ
- Аудит існуючої збірки (якщо є) — оцінюємо конфіг та залежності.
- Проектування карти exports — визначаємо формати та шляхи.
- Налаштування TypeScript та декларацій — tsconfig, плагіни.
- Інтеграція CSS та асетів — postcss, url.
- Оптимізація external-залежностей — виключаємо зайве.
- Підключення візуалізатора та аналізу — статзбірка.
- Тестування в CI/CD — гарантія стабільності.
Кожен етап включає перевірку якості: після аудиту ми складаємо звіт з рекомендаціями, після налаштування запускаємо тестову збірку та перевіряємо роботу в CI. Підтримка після впровадження — 1 місяць безкоштовно.
Що входить в результат налаштування?
За підсумками роботи ви отримуєте:
- Робочий конфіг Rollup з плагінами під ваш стек
- Карта exports в package.json для всіх форматів
- TypeScript-декларації (d.ts) поруч із зібраними файлами
- Інтеграція CSS та асетів, якщо потрібно
- Конфігурація CI/CD (GitHub Actions або GitLab CI)
- Звіт з аналізом розміру бандлу (plato, stats.html)
- Консультація щодо використання готової збірки
Чому external dependencies так важливі?
Без правильного external ви ризикуєте включити в бандл цілі фреймворки, наприклад React, що збільшить розмір бібліотеки з 10 КБ до 500+ КБ. Користувачі бібліотеки вже мають ці залежності у своєму проекті — дублювання веде до помилок та роздуття бандлу. Налаштування external з урахуванням peerDependencies та dependencies — обов'язковий крок для будь-якої бібліотеки.
Строки
| Тип налаштування | Орієнтовний час |
|---|---|
| Базова (один вхід, ESM+CJS, декларації) | 2–4 години |
| Складна (CSS, асети, multiple entries, CI) | 1–2 дні |
Гарантія працездатності в CI/CD та підтримка після налаштування. Замовте аудит вашої ручної збірки — ми виявимо вузькі місця та запропонуємо оптимізацію. Отримайте консультацію інженера, який налаштував Rollup для десятків бібліотек.







