@rollup/plugin-inject — это
официальный плагин экосистемы Rollup, предназначенный для автоматической
подстановки импортов зависимостей в местах их использования. Его
основная задача заключается в том, чтобы избавить код от необходимости
явно писать import для часто используемых глобальных
идентификаторов, библиотек или утилит, заменяя их на соответствующие
импорты во время сборки.
Плагин особенно полезен в проектах, где исторически использовались
глобальные переменные (например, Promise,
fetch, process, $,
_) или когда необходимо обеспечить совместимость кода между
различными средами выполнения без ручного управления импортами.
Механизм работы @rollup/plugin-inject основан на анализе
AST (Abstract Syntax Tree) кода. Плагин отслеживает использование
указанных идентификаторов и автоматически добавляет соответствующие
импорты в модуль.
Принцип можно описать следующим образом:
Ключевой момент заключается в том, что трансформация происходит на этапе сборки, а исходный код при этом остается чистым и не требует ручных импортов.
Плагин устанавливается стандартным способом через npm или yarn:
npm install @rollup/plugin-inject --save-dev
или
yarn add @rollup/plugin-inject -D
После установки он подключается в конфигурации Rollup.
Минимальная настройка предполагает передачу объекта, где ключи — это идентификаторы, а значения — модули, из которых они должны быть импортированы.
import inject from '@rollup/plugin-inject';
export default {
input: 'src/index.js',
output: {
file: 'dist/bundle.js',
format: 'esm'
},
plugins: [
inject({
$: 'jquery',
_: 'lodash'
})
]
};
В этом примере:
$ автоматически заменяется импортом из
jquery;_ подставляется из lodash.Таким образом, при встрече кода:
$('.app').hide();
Rollup преобразует его примерно в:
import $ from 'jquery';
$('.app').hide();
Плагин поддерживает более сложные сценарии, включая именованные экспорты.
inject({
map: ['lodash', 'map'],
reduce: ['lodash', 'reduce']
});
Здесь происходит следующее:
map импортируется как именованный экспорт из
lodash;reduce аналогично подтягивается из того же пакета.Результирующая трансформация:
import { map, reduce } from 'lodash';
@rollup/plugin-inject корректно работает с
форматами:
В случае CommonJS-пакетов плагин адаптирует импорт:
inject({
fs: 'fs'
});
В итоге может быть сгенерирован require:
const fs = require('fs');
в зависимости от настроек Rollup и целевого формата сборки.
Плагин допускает более гибкую настройку через функции, возвращающие модули или конкретные экспорты.
inject({
dayjs: () => 'dayjs'
});
Такой подход используется для динамического определения источника зависимости, особенно в крупных сборках с разными окружениями.
Внутренне плагин работает через анализ следующих узлов:
Основная логика:
Важное поведение: если идентификатор уже объявлен локально, плагин не выполняет подстановку, чтобы избежать конфликтов области видимости.
Одна из ключевых особенностей — защита от перезаписи локальных переменных.
inject({
$: 'jquery'
});
function test() {
const $ = () => {};
$('.app');
}
В этом случае:
$ внутри функции не будет заменён;$ вне локальной области будет
обработан.Это поведение критично для корректной работы в сложных кодовых базах.
Плагин генерирует явные импорты, что позволяет Rollup применять tree-shaking на уровне модулей.
Однако эффективность зависит от:
При корректной настройке можно добиться минимального размера бандла, так как неиспользуемые части библиотек будут исключены.
inject({
Promise: 'es6-promise'
});
Используется для старых окружений, где отсутствуют современные API.
В больших проектах часто встречается код без модульной системы:
function init() {
console.log(_VERSION);
}
Плагин позволяет привязать _VERSION к внешнему
модулю:
inject({
_VERSION: ['app-config', 'VERSION']
});
inject({
fetch: 'cross-fetch'
});
Позволяет унифицировать поведение API в Node.js и браузере.
Несмотря на удобство, @rollup/plugin-inject имеет ряд
ограничений:
Использование плагина изменяет философию явных импортов. Код становится короче, но:
Поэтому его применение обычно ограничивается:
Если один и тот же идентификатор указан несколько раз или пересекается с импортами, Rollup применяет следующие правила:
import не переопределяются;@rollup/plugin-inject часто используется вместе с:
@rollup/plugin-node-resolve — для поиска модулей;@rollup/plugin-commonjs — для поддержки CJS
зависимостей;@rollup/plugin-replace — для замены констант и
окружений.Порядок подключения плагинов влияет на результат трансформации.
Обычно inject размещается после node-resolve,
но до финальной оптимизации бандла.
Неправильная настройка часто приводит к неожиданному поведению:
Особенно критична ситуация, когда inject применяется к широко
используемым именам вроде map, filter,
Promise, что может привести к непредсказуемым импортам в
разных частях проекта.
@rollup/plugin-inject занимает нишу инструмента
автоматизации миграций и упрощения поддержки старого кода. Его роль не
заключается в построении архитектуры модулей, а в мосте между:
Это делает его вспомогательным, но важным компонентом в сложных сборочных цепочках Rollup.