Parcel использует конфигурацию с минимальным количеством ручных настроек, опираясь на автоматическое определение типа проекта и встроенные пресеты. При этом система проектирования архитектуры сборщика построена вокруг идеи расширяемого конвейера (pipeline), который можно модифицировать без переписывания базовой конфигурации.
Ключевой принцип — наследование и дополнение поведения по
умолчанию, а не его полная замена. Это достигается через
систему .parcelrc, а также через конфигурации зависимых
инструментов (Babel, TypeScript, PostCSS) и целевые настройки
package.json.
.parcelrcОсновная точка расширения поведения Parcel — файл
.parcelrc. Он определяет, какие плагины участвуют в сборке
и как устроены этапы обработки модулей.
Базовая структура:
{
"extends": "@parcel/config-default",
"transformers": {
"*.svg": ["@parcel/transformer-svg"]
},
"resolvers": ["@parcel/resolver-default"],
"packagers": {
"*.js": "@parcel/packager-js"
}
}
extendsПоле extends определяет наследование конфигурации:
@parcel/config-default — стандартный набор
трансформеров, резолверов и оптимизаторовМеханизм расширения работает по принципу мерджа конфигураций, а не полной замены. Это означает, что добавленные плагины дополняют цепочку обработки.
Parcel разделяет сборку на независимые стадии:
Расширение конфигурации обычно затрагивает один или несколько слоёв.
Transformers — наиболее часто расширяемая часть пайплайна. Они отвечают за преобразование исходных файлов.
Пример добавления собственного трансформера:
{
"extends": "@parcel/config-default",
"transformers": {
"*.md": ["@parcel/transformer-markdown"]
}
}
Если необходимо расширить существующую цепочку, важно учитывать порядок выполнения:
{
"transformers": {
"*.js": [
"@parcel/transformer-babel",
"@parcel/transformer-typescript"
]
}
}
Parcel применяет трансформеры последовательно, где результат одного становится входом другого.
Resolvers определяют, как Parcel находит модули при
import.
Стандартный резолвер:
{
"resolvers": ["@parcel/resolver-default"]
}
Добавление кастомного поведения:
{
"resolvers": [
"@parcel/resolver-alias",
"@parcel/resolver-default"
]
}
Здесь важно расположение:
resolver-defaultЧасто используется для:
Packagers формируют итоговые файлы бандла.
Пример расширения:
{
"packagers": {
"*.css": "@parcel/packager-css",
"*.js": "@parcel/packager-js"
}
}
При необходимости можно заменить упаковку для определённых типов файлов, например для интеграции с нестандартными окружениями (Electron, Workers, embedded runtime).
Optimizers применяются после сборки бандла и влияют на размер и структуру финального кода.
{
"optimizers": {
"*.js": ["@parcel/optimizer-terser"]
}
}
Расширение этой части пайплайна используется для:
Parcel поддерживает конфигурационные пресеты — готовые наборы настроек.
Пример:
{
"extends": "@parcel/config-default"
}
Можно создать собственный preset:
{
"extends": "@my-scope/parcel-config"
}
Такой подход позволяет централизовать правила сборки для нескольких проектов.
При объединении конфигураций применяется стратегия:
extends влияет на приоритетПример конфликтного сценария:
{
"extends": "@parcel/config-default",
"transformers": {
"*.js": ["custom-transformer"]
}
}
Здесь стандартный JS-трансформер может быть полностью заменён, если не включить его явно:
{
"transformers": {
"*.js": [
"@parcel/transformer-babel",
"custom-transformer"
]
}
}
Parcel позволяет дополнять конфигурацию через секцию
targets в package.json.
{
"targets": {
"default": {
"engines": {
"browsers": ["last 2 versions"]
},
"outputFormat": "esmodule"
}
}
}
Основные параметры:
engines — целевая средаoutputFormat — формат сборкиdistDir — выходная директорияsourceMap — управление картами исходниковЭта часть конфигурации не заменяет .parcelrc, а
дополняет её на уровне проекта.
Parcel автоматически использует Babel при необходимости, но его
поведение можно расширять через babel.config.json.
{
"presets": ["@babel/preset-env"],
"plugins": ["@babel/plugin-proposal-class-properties"]
}
Parcel не требует ручной привязки Babel, но при наличии конфигурации он:
@parcel/transformer-babelTypeScript поддерживается через встроенный трансформер, но поведение
контролируется tsconfig.json.
{
"compilerOptions": {
"strict": true,
"module": "ESNext",
"jsx": "react-jsx"
}
}
Parcel использует TS не как компилятор, а как часть трансформационного слоя, что позволяет:
CSS-обработка расширяется через postcss.config.js:
module.exports = {
plugins: [
require("autoprefixer"),
require("postcss-nested")
]
};
Parcel автоматически обнаруживает конфигурацию и внедряет её в pipeline CSS трансформаций.
Parcel не требует полного отказа от стандартного поведения. Расширение строится на принципе:
Пример гибридной конфигурации:
{
"extends": "@parcel/config-default",
"transformers": {
"*.css": [
"@parcel/transformer-postcss",
"custom-css-transformer"
]
},
"optimizers": {
"*.css": [
"@parcel/optimizer-cssnano"
]
}
}
В монорепозиториях часто используется многоуровневое расширение:
{
"extends": [
"@company/parcel-config-base",
"@company/parcel-config-react"
]
}
Такой подход позволяет:
Если .parcelrc отсутствует, Parcel использует:
@parcel/config-defaultЭто означает, что расширение всегда является опциональным механизмом, а не обязательным элементом сборки.
При обработке конфигурации Parcel учитывает:
extendsЭта система делает поведение предсказуемым, но требует контроля над порядком подключения расширений при сложных конфигурациях.