При сборке модулей Rollup по умолчанию стремится включить все импортируемые зависимости в итоговый бандл. Такое поведение эффективно для библиотек и приложений, где требуется максимальная автономность результата. Однако в реальных проектах часть зависимостей часто предполагается внешней: они уже доступны в окружении выполнения (браузер через CDN, Node.js, другой бандл, система плагинов).
Именно для этого используется механизм внешних зависимостей через
поле external в конфигурации Rollup.
externalexternal определяет модули, которые не должны попадать в
итоговый бандл. Вместо их включения Rollup оставляет
import/require как есть либо трансформирует их
в обращения к глобальным переменным — в зависимости от формата
вывода.
Простейшая форма:
export default {
input: 'src/index.js',
output: {
file: 'dist/bundle.js',
format: 'esm'
},
external: ['lodash', 'react']
}
В этом случае:
lodash и react не будут включены в
сборкуimport _ from 'lodash';
import React from 'react';
Rollup оставит эти импорты без инлайнинга.
externalЧасто требуется более гибкая логика:
external: (id) => id.startsWith('react') || id === 'lodash'
Это позволяет:
Поведение зависит от формата сборки:
esm — внешние зависимости остаются как
importcjs — превращаются в requireumd / iife — заменяются на обращения к
глобальным переменным через output.globalsИменно последний случай делает поле globals критически
важным.
globalsglobals используется только вместе с форматами
umd и iife. Оно задаёт соответствие между
именем модуля и глобальной переменной, доступной в среде выполнения.
Пример:
export default {
input: 'src/index.js',
external: ['react'],
output: {
file: 'dist/bundle.umd.js',
format: 'umd',
name: 'MyLibrary',
globals: {
react: 'React'
}
}
}
При такой конфигурации:
import React from 'react';
превращается в:
var React = window.React;
или аналогичную форму в зависимости от окружения.
external и
globalsЭти два поля всегда работают вместе в UMD/IIFE сборках:
external говорит: «не включать модуль в бандл»globals говорит: «как этот модуль называется в
глобальной области»Без globals Rollup не сможет корректно заменить внешние
зависимости в UMD/IIFE формате, что приведёт к ошибкам выполнения.
export default {
input: 'src/index.js',
external: ['react', 'react-dom', 'lodash'],
output: [
{
file: 'dist/library.cjs.js',
format: 'cjs'
},
{
file: 'dist/library.esm.js',
format: 'esm'
},
{
file: 'dist/library.umd.js',
format: 'umd',
name: 'Library',
globals: {
react: 'React',
'react-dom': 'ReactDOM',
lodash: '_'
}
}
]
}
Здесь один и тот же исходный код компилируется в три формата:
<script>При использовании UMD-бандла зависимость должна быть загружена отдельно:
<script src="https://unpkg.com/react/umd/react.production.min.js"></script>
<script src="dist/library.umd.js"></script>
В этом случае React уже существует как глобальная
переменная, и Rollup использует её благодаря globals.
При разработке UI-библиотеки почти всегда:
react и react-dom объявляются
внешнимиglobalsПричина — избежать дублирования React в приложении-потребителе.
Для библиотек-плагинов (например, для редакторов или графических движков):
external: ['lodash'],
output: {
globals: {
lodash: '_'
}
}
Это позволяет использовать CDN-версию lodash без включения в бандл.
externalЧастый паттерн — исключение всех зависимостей из
node_modules:
external: (id) => !id.startsWith('.') && !id.startsWith('/')
Логика:
./, ../) остаются
внутри бандлаnode_modules становятся внешнимиТакой подход характерен для библиотек, но опасен для приложений, так как требует контроля зависимостей на стороне окружения.
Важно различать:
external полностью исключает модуль из графа
сборкиЕсли модуль объявлен внешним:
Это означает, что неправильное использование external
может привести к потере оптимизаций.
output.name)Для UMD и IIFE важно также поле:
output: {
format: 'umd',
name: 'MyLibrary'
}
Оно определяет:
В результате:
window.MyLibrary
становится точкой доступа к модулю.
globalsglobals не ограничивается простыми строками:
globals: {
react: 'React',
'react-dom': 'ReactDOM',
'react/jsx-runtime': 'ReactJSXRuntime'
}
Это особенно важно для современных React-сборок, где используются внутренние виртуальные модули.
globalsЕсли указано:
globals: {
react: 'React'
}
но в браузере React подключён как:
window.ReactJS
возникает runtime error.
Если указать globals, но не добавить зависимость в
external:
globals не будет использоватьсяВ форматах esm поле globals игнорируется.
Это частая причина путаницы при миграции между форматами сборки.
В библиотечной разработке часто используется правило:
peerDependencies → также добавляются в
externalglobals для UMDПример:
"peerDependencies": {
"react": ">=18"
}
external: ['react'],
output: {
globals: {
react: 'React'
}
}
Это гарантирует, что:
Комбинация external и globals формирует
один из ключевых механизмов Rollup:
Правильная настройка этих полей определяет, будет ли библиотека переносимой, совместимой и предсказуемой в разных средах исполнения.