Миграция с Webpack на Rollup представляет собой процесс постепенного переноса сборочной инфраструктуры с универсального, ориентированного на приложения бандлера к более специализированному инструменту, оптимизированному для библиотек и модульных пакетов. Rollup строится вокруг концепции максимально чистого ESM-графа и статического анализа импортов, что требует пересмотра архитектуры сборки, разделения ответственности между инструментами и точной настройки выходных форматов.
Первым шагом становится разбор текущей Webpack-сборки. Webpack часто выполняет несколько задач одновременно:
Rollup не предназначен для всех этих задач в одном инструменте, поэтому необходимо выделить зоны ответственности.
Типичная Webpack-конфигурация содержит:
При миграции важно определить, какие части реально относятся к библиотеке, а какие являются инфраструктурой приложения.
Rollup оптимален для создания библиотек, поэтому ключевое изменение архитектуры — отделение сборки библиотеки от сборки примеров, демо и приложений.
Рекомендуемая модель:
Такое разделение снижает сложность миграции и позволяет постепенно заменять части Webpack.
Rollup опирается на ES-модули как на основной формат входного кода. Поэтому важно устранить препятствия:
Webpack спокойно обрабатывает CommonJS, но Rollup требует плагины:
@rollup/plugin-commonjsОднако лучше постепенно переходить на ESM-версии зависимостей.
Конструкции вида:
require(someVariable)
затрудняют статический анализ и могут ломать tree-shaking.
В package.json важно определить:
{
"sideEffects": false
}
или перечислить исключения (CSS, polyfills).
Минимальная конфигурация для замены Webpack-бандла:
import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import babel from '@rollup/plugin-babel';
export default {
input: 'src/index.js',
output: [
{
file: 'dist/index.esm.js',
format: 'es'
},
{
file: 'dist/index.cjs.js',
format: 'cjs'
}
],
plugins: [
resolve(),
commonjs(),
babel({ babelHelpers: 'bundled' })
]
};
Webpack-аналоги:
Если проект содержит Webpack и несколько пакетов, миграция выполняется по слоям.
Webpack продолжает работать как основной билд, Rollup добавляется как дополнительный:
webpack.config.js → приложение
rollup.config.js → библиотека
Цель этапа:
Начинается с публичного API библиотеки.
Структура:
src/
index.js → главный экспорт
utils/
core/
Rollup должен собирать только публичный entry point, без внутренних Webpack-расширений.
Webpack часто скрыто влияет на код через:
В Rollup это заменяется явно:
import alias from '@rollup/plugin-alias';
Используется:
import replace from '@rollup/plugin-replace';
Webpack позволяет импортировать CSS и изображения напрямую. Rollup требует явных плагинов.
import postcss from 'rollup-plugin-postcss';
Варианты:
import url from '@rollup/plugin-url';
Используется для:
Одно из ключевых отличий Rollup — агрессивный tree-shaking.
Webpack может оставлять:
Rollup строит более строгий граф:
import/exportВажно:
Webpack использует splitChunks автоматически, Rollup требует явной настройки.
output: {
dir: 'dist',
format: 'esm',
chunkFileNames: '[name]-[hash].js'
}
Динамические import() создают чанки:
import('./module.js').then(m => m.run());
В Rollup это основной механизм разделения кода.
Webpack Dev Server не имеет прямого аналога в Rollup.
Обычно используется связка:
rollup-plugin-serverollup-plugin-livereloadОднако в миграции важно разделить:
Rollup редко используется как полноценный dev-server для UI-приложений.
Если Webpack использует ts-loader, в Rollup переходят
на:
import typescript from '@rollup/plugin-typescript';
или
import babel from '@rollup/plugin-babel';
Выбор зависит от архитектуры:
Во время миграции часто остаются CommonJS-модули.
Порядок обработки:
@rollup/plugin-node-resolve@rollup/plugin-commonjsВажно учитывать:
Webpack часто использует:
process.env.NODE_ENV
В Rollup это заменяется через:
import replace from '@rollup/plugin-replace';
Пример:
replace({
preventAssignment: true,
'process.env.NODE_ENV': JSON.stringify('production')
});
Webpack:
resolve: {
alias: {
'@core': path.resolve(__dirname, 'src/core')
}
}
Rollup:
import alias from '@rollup/plugin-alias';
Это важный шаг, поскольку многие проекты сильно зависят от alias-структуры.
Webpack обычно генерирует один bundle. Rollup позволяет гибко формировать несколько артефактов:
Типичная стратегия миграции:
После переноса необходимо сравнить:
Инструменты анализа:
rollup-plugin-visualizerWebpack иногда интерпретирует CJS как ESM, Rollup — строже.
Rollup может удалить код, который Webpack оставлял.
Webpack loader ≠ Rollup plugin. Прямая замена невозможна.
Полностью отсутствует в Rollup, заменяется явным импортом или glob-подходами.
После переноса всех модулей важно закрепить конфигурацию:
Rollup-сборка должна становиться максимально предсказуемой и линейной, без скрытых трансформаций, характерных для Webpack.