Форматы UMD и IIFE в Rollup используются для создания бандлов,
которые могут выполняться в браузере без наличия нативной модульной
системы. Эти форматы особенно важны для библиотек, которые должны
подключаться через <script> и работать в глобальном
контексте, а также для поддержки старых окружений, где ES-модули или
CommonJS недоступны.
Формат IIFE (Immediately Invoked Function Expression) представляет собой самовызывающуюся функцию, внутри которой инкапсулируется весь код сборки. Основная цель — изоляция пространства имён и предотвращение загрязнения глобальной области видимости.
В Rollup этот формат применяется для создания файлов, которые подключаются напрямую через тег script и сразу выполняются в браузере.
Типичная структура IIFE-бандла:
(function () {
'use strict';
function add(a, b) {
return a + b;
}
console.log(add(2, 3));
})();
Ключевые особенности IIFE:
Конфигурация Rollup для IIFE-вывода обычно задаётся через параметр
output.format:
export default {
input: 'src/index.js',
output: {
file: 'dist/bundle.iife.js',
format: 'iife',
name: 'MyLibrary'
}
};
Параметр name критически важен. Он определяет имя
глобальной переменной, через которую будет доступна библиотека.
Пример результата:
var MyLibrary = (function () {
function sum(a, b) {
return a + b;
}
return {
sum
};
})();
Таким образом, библиотека становится доступной через
window.MyLibrary в браузере.
IIFE подходит для:
<script>Ограничения:
UMD (Universal Module Definition) представляет собой гибридный формат, обеспечивающий совместимость с несколькими системами модулей:
Цель UMD — обеспечить максимальную совместимость одной сборки с разными окружениями.
Структура UMD-бандла включает проверку среды выполнения:
(function (global, factory) {
if (typeof module === 'object' && typeof module.exports === 'object') {
module.exports = factory();
} else if (typeof define === 'function' && define.amd) {
define([], factory);
} else {
global.MyLibrary = factory();
}
})(typeof window !== 'undefined' ? window : this, function () {
function multiply(a, b) {
return a * b;
}
return {
multiply
};
});
Rollup автоматически генерирует UMD-обёртку при указании соответствующего формата:
export default {
input: 'src/index.js',
output: {
file: 'dist/bundle.umd.js',
format: 'umd',
name: 'MyLibrary'
}
};
Параметр name используется в качестве глобального имени
для браузерного окружения.
Если библиотека имеет зависимости, Rollup пытается встроить их внутрь UMD-сборки, если они не помечены как external.
IIFE ориентирован исключительно на браузер и глобальную область видимости. UMD предназначен для универсального использования в разных системах модулей.
<script>IIFE представляет собой простую функцию-обёртку. UMD содержит дополнительную логику определения среды выполнения.
В обоих форматах экспорт реализуется через возвращаемый объект:
function add(a, b) {
return a + b;
}
function subtract(a, b) {
return a - b;
}
export { add, subtract };
После сборки в IIFE или UMD результат будет выглядеть как объект с методами:
MyLibrary.add(2, 3);
MyLibrary.subtract(5, 1);
Параметр name в Rollup определяет точку подключения
библиотеки в браузере:
output: {
format: 'umd',
name: 'Utils'
}
Результат:
window.Utils.add(1, 2);
Особенности выбора имени:
Company_ProjectName)В UMD и IIFE важно корректно управлять зависимостями через
external.
export default {
input: 'src/index.js',
external: ['lodash'],
output: {
format: 'umd',
name: 'MyLibrary',
globals: {
lodash: '_'
}
}
};
В этом случае lodash не включается в бандл, а ожидается
в глобальной переменной _.
IIFE и UMD предназначены для загрузки через
<script>:
<script src="bundle.umd.js"></script>
<script>
MyLibrary.multiply(2, 3);
</script>
Порядок подключения критичен при наличии внешних зависимостей.
При использовании IIFE и UMD важно учитывать:
Rollup позволяет интегрировать terser для оптимизации:
import { terser } from '@rollup/plugin-terser';
export default {
input: 'src/index.js',
output: {
format: 'umd',
name: 'MyLibrary'
},
plugins: [terser()]
};
name при UMD/IIFEexternal зависимостейНесмотря на доминирование ES-модулей, IIFE и UMD остаются важными форматами распространения библиотек. Они обеспечивают совместимость с устаревшими окружениями, CDN-подключениями и сценариями без сборщика.
Rollup использует эти форматы как конечный слой трансформации модульного кода в универсально исполняемый JavaScript-файл, пригодный для непосредственного использования в браузере.