Rollup @rollup/plugin-terser представляет собой официальный плагин экосистемы Rollup, предназначенный для минификации итоговых бандлов с использованием Terser. Его задача — уменьшение размера JavaScript-кода за счёт удаления пробелов, сокращения идентификаторов, устранения мёртвого кода и применения различных оптимизаций AST-уровня.
Плагин используется на этапе финальной сборки и обычно подключается только для production-сборок, так как процесс минификации увеличивает время билда.
Rollup сам по себе ориентирован на создание оптимальных ES-модулей и не включает встроенную минификацию. Это принципиальное отличие от некоторых других бандлеров.
Минификация в Rollup решается через плагины, и @rollup/plugin-terser является стандартным решением.
Основные эффекты применения:
Плагин устанавливается вместе с terser:
npm install -D @rollup/plugin-terser terser
или
yarn add -D @rollup/plugin-terser terser
Важно понимать, что terser является peer dependency и должен быть установлен отдельно.
Минимальная интеграция выглядит следующим образом:
import terser from '@rollup/plugin-terser';
export default {
input: 'src/index.js',
output: {
file: 'dist/bundle.min.js',
format: 'esm'
},
plugins: [
terser()
]
};
В этом случае Rollup сначала собирает модульный граф, а затем передаёт итоговый код в Terser для минификации.
В реальных проектах минификация применяется только в production:
import terser from '@rollup/plugin-terser';
const isProd = process.env.NODE_ENV === 'production';
export default {
input: 'src/index.js',
output: {
file: isProd ? 'dist/bundle.min.js' : 'dist/bundle.js',
format: 'esm',
sourcemap: true
},
plugins: [
isProd && terser()
]
};
Rollup игнорирует false-значения в массиве plugins, что
делает такой подход стандартной практикой.
Плагин передаёт настройки напрямую в Terser, поэтому большинство параметров совпадает с terser API.
Управляет переименованием идентификаторов:
terser({
mangle: {
toplevel: true
}
})
toplevel: true позволяет минифицировать имена переменных
верхнего уровня.
Основной блок оптимизаций:
terser({
compress: {
drop_console: true,
drop_debugger: true
}
})
Часто используемые опции:
drop_console — удаление console.*drop_debugger — удаление debuggerdead_code — удаление недостижимого кода (включено по
умолчанию)Настройка вывода:
terser({
format: {
comments: false
}
})
Позволяет:
Хотя Rollup сам управляет sourcemap, terser может учитывать его:
terser({
sourceMap: true
})
Rollup может генерировать несколько выходных файлов:
export default {
input: {
main: 'src/main.js',
admin: 'src/admin.js'
},
output: [
{
dir: 'dist',
format: 'esm'
}
],
plugins: [
terser()
]
};
В этом случае минификация применяется ко всем chunks.
Terser работает через разбор AST, что делает его одним из самых тяжёлых этапов сборки.
Факторы, влияющие на скорость:
Для больших проектов характерно:
terser({
compress: {
passes: 1
}
})
Использование отдельных конфигураций:
Rollup поддерживает cache API:
export default {
cache: true
};
Хотя напрямую terser не кешируется, повторный анализ графа ускоряет общий процесс.
Terser поддерживает:
Однако некоторые трансформации могут конфликтовать с нестандартными плагинами трансформации AST.
При включённом mangle stack traces могут становиться менее читаемыми:
terser({
mangle: {
keep_fnames: true
}
})
Если код зависит от побочных эффектов импортов, aggressive compression может удалить нужные части:
terser({
compress: {
side_effects: true
}
})
Код с eval и динамическими конструкциями может быть частично оптимизирован некорректно. В таких случаях используют:
terser({
compress: {
evaluate: false
}
})
Важно различать два этапа:
Tree-shaking удаляет неиспользуемый код на уровне модулей, тогда как terser оптимизирует синтаксис внутри уже собранного кода.
При публикации библиотек минификация часто отключается:
Но в CDN-сборках terser применяется всегда.
Основные режимы:
@rollup/plugin-terser управляет всей цепочкой автоматически, предоставляя единый интерфейс в Rollup-плагине.
import terser from '@rollup/plugin-terser';
export default {
input: 'src/index.js',
output: {
file: 'dist/app.min.js',
format: 'iife',
sourcemap: true
},
plugins: [
terser({
compress: {
passes: 2,
drop_console: true
},
mangle: {
toplevel: true,
keep_fnames: false
},
format: {
comments: false
}
})
]
};
В пайплайнах сборки плагин обычно используется в отдельной стадии:
Часто применяется параллельная сборка разных target-окружений (ESM/CJS/IIFE).
Порядок плагинов критичен:
Любая попытка поставить terser раньше других плагинов приводит к некорректной работе сборки, так как он ожидает финальный JS-код.