@rollup/plugin-strip

Плагин @rollup/plugin-strip предназначен для удаления из исходного кода заранее определённых фрагментов логики на этапе сборки Rollup. Основная цель — исключение отладочного и вспомогательного кода из production-бандла без необходимости ручного рефакторинга исходников.

Удаление выполняется на уровне AST (Abstract Syntax Tree), что позволяет корректно вырезать конструкции языка, а не выполнять простую текстовую замену. Это обеспечивает безопасность трансформации и минимизирует риск поломки логики приложения.

Типичные сценарии применения:

  • удаление console.* вызовов
  • удаление debugger инструкций
  • удаление пользовательских функций логирования
  • исключение dev-only кода
  • очистка вспомогательных assert-проверок

Установка и подключение

Плагин устанавливается стандартно через npm или yarn:

npm install @rollup/plugin-strip --save-dev

Подключение в конфигурации Rollup:

import strip from '@rollup/plugin-strip';

export default {
  input: 'src/index.js',
  output: {
    file: 'dist/bundle.js',
    format: 'esm'
  },
  plugins: [
    strip()
  ]
};

При подключении без параметров плагин работает в базовом режиме, удаляя только явно указанные конструкции по умолчанию (если заданы опции).


Принцип работы

@rollup/plugin-strip проходит по AST каждого модуля и удаляет узлы, соответствующие заданным правилам.

Удаление происходит до финальных стадий бандлинга, что позволяет:

  • не включать лишний код в tree-shaking
  • уменьшать размер итогового бандла
  • ускорять последующие стадии оптимизации (например, terser)

Плагин не анализирует выполнение кода, он работает только на уровне синтаксических конструкций.


Основные сценарии очистки кода

Удаление debugger

function test() {
  debugger;
  return 42;
}

После обработки:

function test() {
  return 42;
}

Удаление console

console.log('debug');
console.error('error');

Результат:

(узлы полностью удаляются)


Удаление пользовательских функций

Часто применяется для функций логирования:

log('message');
debug('state');

После настройки плагина:

strip({
  functions: ['log', 'debug']
})

Результат:


Конфигурация плагина

functions

Позволяет удалить вызовы указанных функций.

strip({
  functions: ['console.log', 'debug', 'assert']
});

Поддерживаются:

  • простые имена функций
  • точечная нотация (например console.log)

Особенность заключается в том, что удаляются именно вызовы, а не определения функций.


debugger

Удаляет инструкции debugger.

strip({
  debugger: true
});

Это один из самых дешёвых по стоимости операций режимов, так как debugger — отдельный AST-узел.


include и exclude

Позволяют ограничивать область применения плагина.

strip({
  include: ['src/**/*.js'],
  exclude: ['src/vendor/**']
});

Используется для:

  • исключения сторонних библиотек
  • применения только к application-коду
  • разделения dev/prod логики

labels

Позволяет удалять labeled-statements.

strip({
  labels: ['DEV', 'DEBUG']
});

Пример кода:

DEV: {
  console.log('only dev');
}

После обработки блок полностью удаляется.


Условная очистка кода

В некоторых конфигурациях применяется подход с условными функциями:

strip({
  functions: ['invariant', 'warning']
});

Исходный код:

invariant(user != null, 'User is required');

В production-бандле вызов исчезает, остаётся только логика без проверки.


Взаимодействие с другими плагинами Rollup

Rollup core tree-shaking

strip работает до tree-shaking, что усиливает эффект удаления кода. Сначала убираются конкретные выражения, затем Rollup анализирует недостижимые зависимости.


@rollup/plugin-terser

Комбинация с Terser используется для финальной минификации:

  • strip удаляет семантически ненужный код
  • terser сжимает оставшийся

Типичная цепочка:

import strip from '@rollup/plugin-strip';
import terser from '@rollup/plugin-terser';

export default {
  plugins: [
    strip({
      debugger: true,
      functions: ['console.log']
    }),
    terser()
  ]
};

Babel и TypeScript

При использовании TypeScript или Babel важно учитывать порядок:

  • strip должен выполняться после трансформации TypeScript в JS
  • но до финальной минификации

Типовой порядок:

  1. typescript / babel
  2. strip
  3. terser

Проблемы и ограничения

1. Побочные эффекты

Удаление функций возможно только безопасно, если они не влияют на состояние:

log(doSomething());

Если doSomething() имеет побочный эффект, удаление log() может изменить поведение.


2. Динамические вызовы

Плагин не удаляет:

const fn = console.log;
fn('test');

AST-анализ не всегда может точно определить такие случаи.


3. Условные конструкции

Некоторые паттерны остаются нетронутыми:

if (process.env.NODE_ENV === 'production') {
  console.log('test');
}

Удаление таких блоков требует дополнительных плагинов или внешней оптимизации.


4. Сложные выражения

Не всегда корректно обрабатываются:

obj.console.log('test');

Такие случаи зависят от конфигурации functions.


Производительность сборки

@rollup/plugin-strip является относительно лёгким плагином. Основная нагрузка:

  • обход AST
  • проверка узлов на соответствие правилам

На больших проектах заметный вклад в замедление сборки появляется только при большом количестве функций и сложных include/exclude паттернах.


Рекомендации по использованию

  • удаление console.* стоит ограничивать production-сборкой
  • функции логирования лучше централизовать через обёртки
  • debugger удалять всегда в production без исключений
  • избегать удаления функций с потенциальными side effects
  • использовать совместно с terser для максимальной оптимизации

Типовые конфигурации

Production-сборка

strip({
  debugger: true,
  functions: ['console.log', 'console.info', 'console.debug']
});

Агрессивная очистка

strip({
  debugger: true,
  functions: [
    'console.*',
    'log',
    'debug',
    'trace',
    'assert'
  ],
  labels: ['DEV', 'DEBUG']
});

Избирательная очистка для модулей

strip({
  include: ['src/**'],
  exclude: ['src/tests/**'],
  debugger: true
});

Роль в архитектуре сборки

Плагин используется как промежуточный этап между разработкой и финальной оптимизацией. Его задача — не минификация и не трансформация модулей, а семантическое удаление ненужных конструкций, которые не должны попадать в runtime.

В современных JavaScript-сборках он часто выступает как часть цепочки оптимизации вместе с:

  • tree-shaking Rollup
  • terser
  • environment replacement плагинами
  • TypeScript transpilation