В Parcel при сборке библиотек ключевую роль играет параметр
outputFormat, определяющий формат модульной системы
результирующего бандла. Он задаёт способ экспорта кода и его
совместимость с различными средами выполнения: браузером, Node.js и
окружениями без модульной системы.
Поддерживаются три основных режима:
esmodulecommonjsglobalКаждый из них влияет на структуру выходного файла, способ подключения библиотеки и поведение зависимостей.
В режиме сборки библиотеки Parcel перестаёт рассматривать проект как приложение с точкой входа и вместо этого формирует переиспользуемый артефакт. В этом режиме учитываются:
Конфигурация выполняется через поле targets в
package.json, где описывается поведение сборки для
конкретного назначения.
{
"name": "my-lib",
"source": "src/index.js",
"targets": {
"default": {
"context": "library",
"distDir": "dist",
"outputFormat": "esmodule"
}
}
}
Формат esmodule генерирует код, совместимый с ECMAScript
Modules. Результат использует конструкции import и
export, сохраняя статическую структуру зависимостей.
export function sum(a, b) {
return a + b;
}
Parcel сохраняет структуру модулей настолько, насколько это возможно, избегая лишней агрегации кода в один IIFE-блок.
Формат используется при:
Формат commonjs ориентирован на Node.js и традиционную
модульную систему require.
require() для импорта зависимостейmodule.exports и
exportsfunction sum(a, b) {
return a + b;
}
module.exports = { sum };
Parcel в этом режиме выполняет трансформацию ESM-кода в CommonJS-структуру, включая:
export defaultrequireФормат global предназначен для использования библиотеки
напрямую в браузере через <script> без модульного
загрузчика.
Код помещается в глобальное пространство имён, обычно через объект
window.
(function (global) {
function sum(a, b) {
return a + b;
}
global.MyLib = {
sum
};
})(this);
Parcel связывает формат вывода с конкретной целью сборки через
targets. Это позволяет одной библиотеке иметь несколько
вариантов сборки.
{
"source": "src/index.js",
"targets": {
"esm": {
"context": "library",
"outputFormat": "esmodule",
"distDir": "dist/esm"
},
"cjs": {
"context": "library",
"outputFormat": "commonjs",
"distDir": "dist/cjs"
},
"umd": {
"context": "library",
"outputFormat": "global",
"distDir": "dist/umd"
}
}
}
Такой подход позволяет одновременно поддерживать разные экосистемы без изменения исходного кода.
Выбор формата определяет, как Parcel обрабатывает граф модулей:
requireПри этом оптимизации Parcel (scope hoisting, tree-shaking, dead code elimination) применяются по-разному в зависимости от формата.
При сборке библиотек важным фактором является наличие побочных эффектов в модулях.
esmodule Parcel может безопасно удалять
неиспользуемый код при корректной аннотации
sideEffectscommonjs анализ менее точный из-за динамической
природы requireglobal весь код обычно считается выполняемым сразу,
что ограничивает удаление неиспользуемых частейParcel обеспечивает согласованность между форматами через слой интеропа:
default exportdefault экспорт при
необходимостиПри наличии нескольких entry points Parcel формирует независимые
бандлы для каждого target, сохраняя заданный
outputFormat. Это влияет на:
Оптимизация общего кода зависит от стратегии сборки и конфигурации targets.
Выбор формата определяет публичный контракт библиотеки:
module.exportsЭти различия влияют на:
Каждый формат отражает отдельную модель распространения JavaScript-библиотек и требует соответствующей архитектуры при проектировании пакета.