В Parcel (начиная с версии 2) программный интерфейс сборки
предоставляется через пакет @parcel/core, где центральной
сущностью выступает класс Parcel. Он инкапсулирует весь
процесс бандлинга: от анализа входных точек до генерации выходных
ассетов и управления кешированием, трансформациями и графом
зависимостей.
Класс проектировался как высокоуровневая обёртка над внутренними этапами пайплайна сборки, предоставляя единый объект для управления жизненным циклом сборки в Node.js окружении.
Инициализация начинается с подключения конструктора:
import Parcel from '@parcel/core';
Создание экземпляра выполняется через конфигурационный объект, который определяет входные точки, режим работы и поведение сборщика.
const bundler = new Parcel({
entries: 'src/index.html',
defaultConfig: '@parcel/config-default',
mode: 'development',
shouldDisableCache: false,
hmrOptions: {
port: 1234
}
});
Определяет входные точки приложения. Поддерживаются:
entries: ['src/index.html', 'src/admin.html']
Внутренне Parcel строит граф зависимостей, начиная с этих точек.
Указывает используемую конфигурацию пайплайна трансформаций.
defaultConfig: '@parcel/config-default'
Конфигурация включает:
Режим работы сборщика:
development — ускоренная сборка, включён HMR,
упрощённая оптимизацияproduction — агрессивная оптимизация, минификация,
tree-shakingmode: 'production'
Управляет использованием кеша Parcel.
shouldDisableCache: true
Кеш используется для ускорения повторных сборок, хранит результаты трансформаций и граф зависимостей.
Конфигурация Hot Module Replacement:
hmrOptions: {
port: 8080
}
Параметры:
port — порт HMR сервераhost — хост (опционально)Уровень логирования:
noneerrorwarninfoverboselogLevel: 'info'
Основной метод запуска одноразовой сборки.
const { bundleGraph, buildTime } = await bundler.run();
Объект результата включает:
bundleGraph — итоговый граф бандловbuildTime — время сборкиchangedAssets — изменённые ресурсыЗапускает режим наблюдения за файлами.
const subscription = await bundler.watch((err, event) => {
if (err) return console.error(err);
if (event.type === 'buildSuccess') {
console.log('Сборка завершена');
}
if (event.type === 'buildFailure') {
console.log('Ошибка сборки');
}
});
buildSuccess — успешная сборкаbuildFailure — ошибка компиляцииbuildStart — начало сборкиМетод возвращает объект подписки:
await subscription.unsubscribe();
Позволяет вручную разрешать модули через резолвер Parcel.
const resolved = await bundler.resolver.resolve({
specifier: './utils',
parent: '/src/index.js'
});
importИспользуется как более низкоуровневая альтернатива
run().
const result = await bundler.build();
run() ориентирован на полный жизненный циклbuild() используется для явного одноразового запуска
без некоторых обёрток событийного уровняПосле выполнения run() или build() доступен
объект BundleGraph.
const bundles = bundleGraph.getBundles();
Возвращает список итоговых бандлов.
bundleGraph.getBundles();
Получение входных бандлов:
bundleGraph.getEntryBundles();
Получение зависимых бандлов:
bundleGraph.getChildBundles(bundle);
Обход графа зависимостей:
bundleGraph.traverse(node => {
console.log(node.id);
});
Завершает работу Parcel-инстанса и освобождает ресурсы.
await bundler.close();
Parcel использует событийный поток внутри методов
watch() и run().
Пример обработки:
bundler.watch((err, event) => {
switch (event.type) {
case 'buildStart':
break;
case 'buildSuccess':
break;
case 'buildFailure':
break;
}
});
Экземпляр проходит несколько фаз:
Методы класса лишь управляют запуском этих этапов, не реализуя их напрямую.
Parcel-инстанс сохраняет состояние между сборками:
Это позволяет ускорять последующие сборки при использовании
watch().
Parcel использует параллельное выполнение задач:
Класс Parcel лишь координирует эти процессы через
внутренний планировщик задач.
Ошибки возвращаются через:
run() / build()watch()bundler.run().catch(err => {
console.error(err.diagnostics);
});
Объект диагностики содержит:
Один экземпляр может обслуживать разные сценарии:
Поведение меняется через конфигурацию, а не через изменение кода класса.
Parcel как класс интегрируется в Node.js процесс:
import Parcel from '@parcel/core';
(async () => {
const bundler = new Parcel({ entries: 'src/index.js' });
await bundler.run();
})();