Поле output.generatedCode управляет тем, какой синтаксис
и какие возможности JavaScript Rollup может использовать при генерации
итогового бандла. Это низкоуровневая настройка, влияющая не на логику
сборки, а на форму генерируемого кода.
Настройка особенно важна в библиотеках, SDK, пакетах для npm, а также в проектах, где требуется строгий контроль над:
Поле появилось как более современный механизм управления генерацией
кода вместо грубого глобального подхода через
output.esModule и некоторых других старых параметров.
export default {
input: 'src/index.js',
output: {
file: 'dist/bundle.js',
format: 'cjs',
generatedCode: {
arrowFunctions: true,
constBindings: true
}
}
};
generatedCodeПоле принимает:
generatedCode: 'es2015'
или:
generatedCode: 'es5'
generatedCode: {
arrowFunctions: true,
constBindings: true,
objectShorthand: true
}
Объектный режим предоставляет максимально тонкий контроль.
es5generatedCode: 'es5'
Rollup старается генерировать код, совместимый с ES5.
Особенности:
const и let;Пример результата:
'use strict';
var value = 10;
function test() {
return value;
}
Такой режим используется:
es2015generatedCode: 'es2015'
Разрешает Rollup использовать синтаксис ES2015.
Возможны:
const;Пример:
const value = 10;
const test = () => value;
Преимущества:
generatedCodearrowFunctionsУправляет использованием стрелочных функций.
generatedCode: {
arrowFunctions: true
}
Rollup сможет генерировать:
const fn = () => {};
generatedCode: {
arrowFunctions: false
}
Тогда используется классический синтаксис:
var fn = function () {};
Rollup генерирует их:
Это влияет только на код, который создаёт сам Rollup, а не на пользовательский исходный код.
thisСтрелочные функции не имеют собственного this.
Из-за этого Rollup иногда избегает их использования в некоторых местах даже при:
arrowFunctions: true
Например:
(function () {
console.log(this);
})();
не может быть безопасно заменено на:
(() => {
console.log(this);
})();
constBindingsРазрешает использование const.
generatedCode: {
constBindings: true
}
Результат:
const external = require('lib');
Без этой настройки:
var external = require('lib');
const важенconst помогает:
Кроме того, код становится более предсказуемым.
objectShorthandУправляет сокращённым синтаксисом объектов.
generatedCode: {
objectShorthand: true
}
Результат:
const obj = {
value
};
Вместо:
var obj = {
value: value
};
Сокращённый синтаксис:
Особенно заметно в библиотеках с большим количеством экспортов.
reservedNamesAsPropsУправляет использованием зарезервированных слов как свойств объекта.
generatedCode: {
reservedNamesAsProps: true
}
Rollup сможет генерировать:
obj.default
Вместо:
obj['default']
Некоторые старые JS-движки некорректно работают с:
obj.default
если default считается зарезервированным словом.
Поэтому для ES5-совместимости параметр часто отключают:
reservedNamesAsProps: false
symbolsРазрешает использование Symbol.
generatedCode: {
symbols: true
}
Rollup может использовать:
Symbol.toStringTag
Например:
Object.defineProperty(exports, Symbol.toStringTag, {
value: 'Module'
});
generatedCode: {
symbols: false
}
Rollup избегает Symbol API.
Это нужно:
export default {
input: 'src/index.js',
output: {
file: 'dist/index.js',
format: 'esm',
generatedCode: {
arrowFunctions: true,
constBindings: true,
objectShorthand: true,
reservedNamesAsProps: true,
symbols: true
}
}
};
Подходит для:
export default {
input: 'src/index.js',
output: {
file: 'dist/legacy.js',
format: 'iife',
generatedCode: {
arrowFunctions: false,
constBindings: false,
objectShorthand: false,
reservedNamesAsProps: false,
symbols: false
}
}
};
Подходит для:
Очень распространённый сценарий.
export default [
{
input: 'src/index.js',
output: {
file: 'dist/index.mjs',
format: 'esm',
generatedCode: 'es2015'
}
},
{
input: 'src/index.js',
output: {
file: 'dist/index.legacy.js',
format: 'iife',
generatedCode: 'es5'
}
}
];
generatedCode влияет только на код, генерируемый самим
Rollup.
Он не транспилирует пользовательский код.
Например:
const fn = () => {};
в исходниках останется стрелочной функцией, даже если:
generatedCode: 'es5'
Многие ожидают, что Rollup автоматически превратит весь проект в ES5.
Но:
generatedCode: 'es5'
не заменяет Babel.
import babel from '@rollup/plugin-babel';
export default {
input: 'src/index.js',
plugins: [
babel({
babelHelpers: 'bundled'
})
],
output: {
file: 'dist/bundle.js',
format: 'iife',
generatedCode: 'es5'
}
};
Современный синтаксис:
ES5:
var obj = {
value: value
};
ES2015:
const obj = { value };
Инструменты:
лучше оптимизируют ES2015-код.
Особенно:
Современный output иногда быстрее:
const помогает JIT;Однако разница обычно невелика.
Главное преимущество — размер и оптимизация.
esmНаиболее естественный формат для:
generatedCode: 'es2015'
cjsДаже CommonJS может использовать:
const;iifeЧасто используется для браузеров.
Здесь важно учитывать целевую совместимость.
umdПри создании универсальных библиотек часто делают:
generatedCode: 'es5'
чтобы избежать проблем у потребителей пакета.
Rollup генерирует:
Именно эти части сильнее всего зависят от
generatedCode.
Современный вариант:
const getDefaultExportFromCjs = x =>
x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default')
? x['default']
: x;
ES5-вариант:
function getDefaultExportFromCjs(x) {
return x &&
x.__esModule &&
Object.prototype.hasOwnProperty.call(x, 'default')
? x['default']
: x;
}
es5Например:
Иногда библиотека должна быть максимально совместимой.
Тогда:
generatedCode: 'es5'
снижает риск проблем.
es2015Например:
ориентированы на современные среды.
Node.js давно поддерживает:
const;Поэтому ES5 обычно не нужен.
generatedCode не заменяет Babel.
Например:
generatedCode: 'es2015'
и поддержка IE11.
Это приведёт к runtime-ошибкам.
Библиотека может работать у автора проекта, но ломаться у пользователей со старым toolchain.
generatedCode: 'es2015'
generatedCode: 'es5'
Современный стандарт:
dist/
├─ index.mjs
├─ index.cjs
└─ index.legacy.js
С разными вариантами generatedCode.
TypeScript также не зависит напрямую от
generatedCode.
Например:
const value: number = 10;
сначала компилируется TypeScript-компилятором, а затем Rollup управляет только своим runtime-кодом.
Современный синтаксис улучшает итоговую оптимизацию.
Особенно:
const;Минификаторы лучше понимают неизменяемые конструкции.
output.compactcompact уменьшает количество пробелов и переносов.
generatedCode управляет самим синтаксисом.
Они часто используются вместе:
output: {
compact: true,
generatedCode: 'es2015'
}
output.minifyInternalExportsСовременный синтаксис помогает Rollup эффективнее минимизировать внутренние экспорты.
Особенно в ESM-режиме.
При:
symbols: true
Rollup генерирует более корректные namespace-объекты.
Но:
generatedCode: 'es5'
generatedCode: 'es2015'
generatedCode: {
arrowFunctions: true,
constBindings: true,
objectShorthand: false,
reservedNamesAsProps: true,
symbols: true
}
Такой подход применяется в крупных библиотеках, где требуется точный контроль над поведением итогового runtime-кода.