Предупреждение Rollup MISSING_GLOBAL_NAME появляется в
момент формирования бандла в форматах, где внешние зависимости должны
быть представлены через глобальные переменные среды выполнения (чаще
всего UMD или IIFE). Оно означает отсутствие имени глобальной переменной
для одного из модулей, помеченных как external.
В Rollup внешние зависимости могут быть исключены из сборки с помощью
настройки external. В таком случае библиотека не
встраивается в итоговый бандл, а предполагается, что она уже доступна в
окружении выполнения.
Для корректной работы Rollup должен знать, под каким именем эта зависимость будет доступна в глобальной области видимости. Это особенно критично для форматов:
В этих форматах импорт:
import React from 'react';
превращается не в локальный модуль, а в обращение к глобальной переменной:
const React = window.React;
или:
const React = React;
в зависимости от окружения.
Если Rollup не знает, как называется глобальная переменная, он генерирует предупреждение:
MISSING_GLOBAL_NAME
Предупреждение возникает при сочетании следующих факторов:
externaliife или
umdoutput.globalsТипичная конфигурация, вызывающая проблему:
export default {
input: 'src/index.js',
external: ['react'],
output: {
file: 'bundle.js',
format: 'umd'
}
};
В этом случае Rollup не знает, чему соответствует react
в глобальной области.
При сборке UMD/IIFE Rollup строит карту зависимостей:
Если шаг 3 не выполнен, генератор кода не может безопасно скомпилировать обращение к зависимости, поскольку не существует универсального имени переменной.
Исходный код:
import _ from 'lodash';
export function chunkArray(arr, size) {
return _.chunk(arr, size);
}
Конфигурация Rollup:
export default {
input: 'src/index.js',
external: ['lodash'],
output: {
file: 'dist/bundle.umd.js',
format: 'umd',
name: 'MyLib'
}
};
При сборке появляется предупреждение:
(!) MISSING_GLOBAL_NAME
Use output.globals to specify browser global variable names corresponding to external modules
Rollup требует явного маппинга:
output: {
globals: {
lodash: '_'
}
}
После этого генерируется код:
var _ = window._;
или UMD-обертка:
(factory(window._));
output.globals — ключевой механизм устранения
предупреждения.
Формат:
output: {
globals: {
[moduleName]: globalVariableName
}
}
Пример:
export default {
input: 'src/index.js',
external: ['react', 'react-dom'],
output: {
file: 'dist/bundle.js',
format: 'umd',
name: 'MyLibrary',
globals: {
react: 'React',
'react-dom': 'ReactDOM'
}
}
};
На практике большинство популярных библиотек имеют устоявшиеся глобальные идентификаторы:
| Модуль | Глобальная переменная |
|---|---|
| react | React |
| react-dom | ReactDOM |
| lodash | _ |
| jquery | jQuery или $ |
| axios | axios |
Несовпадение регистра или имени приводит к ошибкам выполнения даже при отсутствии предупреждений.
Если React подключается через CDN:
<script src="https://unpkg.com/react/umd/react.production.min.js"></script>
то Rollup должен знать, что react соответствует
React.
При разработке UI-библиотек часто используется:
"peerDependencies": {
"react": "^18.0.0"
}
и external:
external: ['react']
Без globals UMD-сборка становится неполной.
Некоторые пакеты имеют сложные имена:
@scope/package@babel/runtimeДля них требуется точное указание:
globals: {
'@babel/runtime': 'BabelRuntime'
}
Основные признаки:
MISSING_GLOBAL_NAMEReferenceError: X is not definedПолезно проверить:
externalglobalsRollup строго разделяет:
При ESM проблем нет — импорт резолвится на уровне бандлера.
При UMD/IIFE требуется мост между мирами:
external module name -> global variable name
Если мост не определён, генерация кода становится неоднозначной, поэтому Rollup выбирает безопасную стратегию — предупреждение вместо автоматического предположения.
Если output.globals не задан:
Пример потенциально сломанного кода:
(function (global, factory) {
factory(global.react);
})(this, function (React) {});
Если global.react отсутствует, библиотека падает при
запуске.
Проблема строго связана с форматами:
esm — не требует globalscjs — не требует globalsumd — требует globalsiife — требует globalsПоэтому часто конфигурации разделяют:
output: [
{
file: 'dist/index.esm.js',
format: 'esm'
},
{
file: 'dist/index.cjs.js',
format: 'cjs'
},
{
file: 'dist/index.umd.js',
format: 'umd',
name: 'MyLib',
globals: {
react: 'React'
}
}
];
external: ['react', 'react-dom'],
globals: {
react: 'React'
}
react-dom не указан → появляется предупреждение.
globals: {
React: 'React'
}
Должно быть react, а не React.
external: ['@scope/utils'],
globals: {
'@scope/utils': 'Utils'
}
Любое отклонение от точного имени ломает маппинг.
Рабочая последовательность:
externaloutput.globalsconst external = ['react', 'react-dom'];
export default {
input: 'src/index.js',
external,
output: {
file: 'dist/bundle.umd.js',
format: 'umd',
name: 'LibraryName',
globals: {
react: 'React',
'react-dom': 'ReactDOM'
}
}
};
MISSING_GLOBAL_NAME выполняет функцию раннего
обнаружения архитектурной несогласованности между:
Он предотвращает ситуации, когда библиотека собирается успешно, но падает при первом запуске в production окружении.
Игнорирование приводит к:
<script> тегиЧасто вместе с этой проблемой встречаются:
output.name (обязателен для UMD)externaloutput.globalspreserveSymlinksplugins: [nodeResolve()]Но именно globals является ключевым элементом устранения
предупреждения.
Внутри генератора UMD логика можно упростить до следующего шага:
if (external module used in UMD/IIFE)
if (no global mapping)
warn MISSING_GLOBAL_NAME
Это не ошибка сборки, а сигнал о неполноте конфигурации.