Файл конфигурации Rollup представляет собой обычный модуль JavaScript, который экспортирует объект или массив объектов с настройками сборки. Основная цель конфигурации — описать, как исходный код должен быть преобразован в один или несколько выходных бандлов.
На практике используется файл rollup.config.js в корне
проекта, хотя допустимы и другие варианты:
rollup.config.mjs, rollup.config.cjs, либо
экспорт конфигурации из TypeScript при наличии соответствующего
плагина.
Конфигурация может экспортироваться через export default
или module.exports:
export default {
input: 'src/index.js',
output: {
file: 'dist/bundle.js',
format: 'esm'
}
}
или в CommonJS-формате:
module.exports = {
input: 'src/index.js',
output: {
file: 'dist/bundle.js',
format: 'esm'
}
}
Разница определяется режимом работы Node.js и типом проекта
(type: module в package.json).
input определяет точку входа приложения. Rollup строит
граф зависимостей начиная с этого файла.
input: 'src/main.js'
Допускается указание нескольких точек входа:
input: {
app: 'src/app.js',
admin: 'src/admin.js'
}
В этом случае формируется несколько бандлов, каждый со своей точкой входа.
output определяет результат сборки. Это может быть
объект или массив объектов.
Основные свойства:
file — путь к итоговому файлуdir — директория вывода (для множественных
бандлов)format — формат модуляname — глобальное имя для IIFE или UMDsourcemap — генерация source mapПример:
output: {
dir: 'dist',
format: 'esm',
sourcemap: true
}
Rollup поддерживает несколько форматов:
esm — ES Modulescjs — CommonJSiife — немедленно вызываемая функцияumd — универсальный форматsystem — SystemJSПример UMD:
output: {
file: 'dist/library.js',
format: 'umd',
name: 'MyLibrary'
}
Rollup изначально работает только с ES-модулями. Поддержка дополнительных возможностей реализуется через плагины.
import resolve from '@rollup/plugin-node-resolve'
import commonjs from '@rollup/plugin-commonjs'
export default {
input: 'src/index.js',
output: {
file: 'dist/bundle.js',
format: 'esm'
},
plugins: [
resolve(),
commonjs()
]
}
Порядок подключения плагинов критичен: каждый следующий плагин получает результат предыдущего.
Параметр external исключает модули из бандла.
external: ['react', 'react-dom']
Также допускается функция:
external: id => id.startsWith('node:')
Это используется для исключения встроенных модулей Node.js или peerDependencies.
Rollup применяет tree-shaking автоматически, но поведение можно регулировать:
treeshake: {
moduleSideEffects: false,
propertyReadSideEffects: false
}
Данные настройки влияют на удаление неиспользуемого кода и анализ побочных эффектов.
Файл может экспортировать массив конфигураций:
export default [
{
input: 'src/index.js',
output: {
file: 'dist/index.esm.js',
format: 'esm'
}
},
{
input: 'src/index.js',
output: {
file: 'dist/index.cjs.js',
format: 'cjs'
}
}
]
Каждый объект выполняется как отдельная сборка.
Конфигурация может быть функцией, возвращающей Promise:
export default async () => {
const pkg = await import('./package.json', { assert: { type: 'json' } })
return {
input: 'src/index.js',
output: {
file: pkg.default.main,
format: 'esm'
}
}
}
Это позволяет динамически определять параметры сборки.
Конфигурация может зависеть от CLI-параметров:
export default commandLineArgs => {
const production = commandLineArgs.production
return {
input: 'src/index.js',
output: {
file: production ? 'dist/app.min.js' : 'dist/app.js',
format: 'esm'
}
}
}
Запуск:
rollup -c --production
Rollup поддерживает наблюдение за изменениями файлов:
export default {
input: 'src/index.js',
output: {
file: 'dist/bundle.js',
format: 'esm'
},
watch: {
include: 'src/**',
exclude: 'node_modules/**'
}
}
Watch-режим используется в разработке и позволяет автоматически пересобирать проект.
Для библиотек важно не включать зависимости в бандл:
import pkg from './package.json'
export default {
input: 'src/index.js',
external: Object.keys(pkg.peerDependencies || {}),
output: {
file: 'dist/index.js',
format: 'esm'
}
}
Это обеспечивает корректное использование библиотеки в чужих проектах.
Типичная конфигурация библиотеки:
export default {
input: 'src/index.js',
external: ['react'],
output: [
{
file: 'dist/index.esm.js',
format: 'esm'
},
{
file: 'dist/index.cjs.js',
format: 'cjs'
},
{
file: 'dist/index.umd.js',
format: 'umd',
name: 'Lib'
}
]
}
Такой подход обеспечивает поддержку разных окружений.
output может быть функцией, возвращающей объект:
export default {
input: 'src/index.js',
output: (options) => {
return {
file: `dist/bundle.${options.format}.js`,
format: options.format
}
}
}
Это удобно при генерации нескольких форматов без дублирования конфигурации.
Плагины работают как цепочка трансформаций:
plugins: [
resolve(),
commonjs(),
babel({ babelHelpers: 'bundled' }),
terser()
]
Нарушение порядка часто приводит к ошибкам сборки или некорректному результату.
Переменные окружения часто используются для переключения логики:
const dev = process.env.NODE_ENV !== 'production'
export default {
input: 'src/index.js',
output: {
file: dev ? 'dist/bundle.js' : 'dist/bundle.min.js',
format: 'esm'
}
}
Rollup не управляет env напрямую, но конфигурация может использовать Node.js API.
Конфигурация может полностью строиться программно:
export default ({ watch }) => {
const isWatch = Boolean(watch)
return {
input: 'src/index.js',
plugins: isWatch ? [] : [],
output: {
file: 'dist/bundle.js',
format: 'esm'
}
}
}
В монорепозиториях конфигурация часто строится с учетом пакетов:
import path from 'path'
export default {
input: path.resolve(__dirname, 'packages/core/src/index.js'),
output: {
dir: 'packages/core/dist',
format: 'esm'
}
}
Часто используется автоматическое определение входов через файловую систему.
Параметры CLI могут переопределять конфигурацию:
rollup -c --file dist/output.js --format cjs
Эти значения могут быть доступны через аргументы функции конфигурации.
Неправильная настройка часто связана с:
external для peerDependenciesinput и output.dirname в UMD-сборкеКаждая из этих проблем проявляется на этапе построения графа модулей или генерации бандла, а не во время выполнения приложения.