Parcel как сборщик ориентирован на автоматическое определение модулей и максимально бесшовную работу с современным JavaScript. Однако при создании библиотек и переиспользуемых пакетов ключевым становится выбор формата итогового бандла. От него зависит совместимость с различными средами выполнения, системой модулей и инструментами сборки.
Формат вывода определяет, каким образом собранный код будет экспортироваться и импортироваться в других проектах. В контексте JavaScript существуют три основных подхода:
Parcel в библиотечном режиме может генерировать разные типы выходных
файлов, ориентируясь на поле targets в
package.json и настройку outputFormat.
CommonJS остаётся базовым форматом для Node.js-экосистемы. Его
ключевая особенность — синхронная загрузка модулей через
require.
const utils = require('./utils');
module.exports = {
sum: utils.sum
};
Parcel при генерации CJS-бандла преобразует исходные ESM-импорты в
require() и module.exports.
При outputFormat: "commonjs" Parcel:
import на requireexport в module.exportsESM — современный стандарт модульности, встроенный в язык JavaScript. Он используется как в браузерах, так и в современных версиях Node.js.
import { sum } from './utils.js';
export function calculate(a, b) {
return sum(a, b);
}
При outputFormat: "esmodule" Parcel:
import/export без
преобразованияESM является предпочтительным форматом для библиотек, ориентированных на современный фронтенд.
UMD представляет собой универсальный формат, который обеспечивает совместимость сразу с несколькими системами модулей:
UMD обычно представляет собой функцию-обёртку следующего вида:
(function (root, factory) {
if (typeof module === 'object' && module.exports) {
module.exports = factory();
} else if (typeof define === 'function' && define.amd) {
define([], factory);
} else {
root.myLibrary = factory();
}
})(this, function () {
return {
hello: function () {
return 'world';
}
};
});
Parcel не всегда явно маркирует формат как “UMD”, но при
использовании outputFormat: "global" создаётся аналогичная
универсальная обёртка, ориентированная на браузерное окружение:
<script>Parcel определяет формат вывода через конфигурацию целей (targets) в
package.json.
{
"name": "my-library",
"version": "1.0.0",
"source": "src/index.js",
"module": "dist/module.js",
"main": "dist/main.js",
"targets": {
"module": {
"context": "browser",
"outputFormat": "esmodule"
},
"main": {
"context": "node",
"outputFormat": "commonjs"
},
"umd": {
"context": "browser",
"outputFormat": "global"
}
}
}
Parcel выбирает формат на основе:
targetsmodule и mainbrowser или node)outputFormatrequireФормат вывода напрямую влияет на возможности оптимизации:
Parcel при ESM-режиме может оставлять зависимости “живыми” для последующей оптимизации другими инструментами.
export function add(a, b) {
return a + b;
}
export default function multiply(a, b) {
return a * b;
}
module.exports = function multiply(a, b) {
return a * b;
};
module.exports.add = function add(a, b) {
return a + b;
};
export function add(a, b) {
return a + b;
}
export default function multiply(a, b) {
return a * b;
}
root.myLibrary = {
add: function (a, b) {
return a + b;
},
default: function (a, b) {
return a * b;
}
};
Parcel позволяет собирать одну кодовую базу сразу в несколько форматов. Это особенно важно при публикации библиотек, которые должны работать:
Типичная стратегия — параллельный вывод:
Различия между форматами влияют на:
this в модуляхParcel минимизирует эти различия, но не устраняет их полностью, так как они определяются спецификацией JavaScript и средой выполнения.