Файл конфигурации .parcelrc используется Parcel для
управления внутренними этапами сборки: преобразованием модулей,
разрешением зависимостей, оптимизацией, минификацией и формированием
итогового бандла. Это ключевой механизм расширения поведения сборщика
без изменения исходного кода проекта.
.parcelrc представляет собой JSON-подобный файл, в
котором описываются пайплайны (pipelines) и подключаемые плагины.
Формально это JSON, допускающий расширенную конфигурацию через Parcel
plugin system.
Минимальная структура:
{
"extends": "@parcel/config-default"
}
Ключ extends указывает на базовую конфигурацию, от
которой наследуется текущий проект. В большинстве случаев используется
стандартный конфиг Parcel, включающий набор дефолтных трансформеров,
оптимизаторов и резолверов.
Parcel строит сборку как последовательность этапов обработки модулей. Каждый этап управляется определённым типом плагинов:
Эти сущности объединяются в pipelines.
Pipeline — это последовательность обработчиков для конкретного типа ресурсов.
Структура pipeline:
{
"extends": "@parcel/config-default",
"transformers": {
"*.ts": ["@parcel/transformer-typescript-tsc"]
}
}
Однако более гибкий способ — использование расширенной структуры:
{
"extends": "@parcel/config-default",
"transformers": {
"*.{js,jsx}": [
"@parcel/transformer-babel",
"@parcel/transformer-js"
],
"*.css": [
"@parcel/transformer-postcss"
]
}
}
Каждый ключ — это glob-паттерн, определяющий тип файлов, а значение — массив плагинов, выполняемых последовательно.
Transformers применяются к исходным модулям до их включения в граф зависимостей.
Пример цепочки трансформации Jav * aScript:
{
"transformers": {
"*.js": [
"@parcel/transformer-babel",
"@parcel/transformer-js"
]
}
}
Порядок имеет критическое значение:
Ошибочная перестановка может привести к некорректной компиляции или потере синтаксических преобразований.
Раздел resolvers определяет, как Parcel ищет
зависимости.
{
"resolvers": [
"@parcel/resolver-default",
"@parcel/resolver-glob"
]
}
Механизм работает по принципу цепочки ответственности:
Это позволяет внедрять кастомные стратегии поиска, например:
Оптимизаторы применяются после упаковки кода.
Пример:
{
"optimizers": {
"*.js": [
"@parcel/optimizer-terser"
],
"*.css": [
"@parcel/optimizer-cssnano"
]
}
}
Оптимизаторы выполняют:
Namer определяет структуру output файлов.
{
"namers": [
"@parcel/namer-default"
]
}
Возможные сценарии:
Пример кастомного поведения:
{
"namers": [
"./custom-namer.js"
]
}
Packager отвечает за объединение модулей в конечный файл.
{
"packagers": {
"*.js": "@parcel/packager-js",
"*.css": "@parcel/packager-css"
}
}
Он работает после оптимизации и формирует финальный формат:
Reporter используется для наблюдения за процессом сборки.
{
"reporters": [
"@parcel/reporter-default",
"@parcel/reporter-cli"
]
}
Он может:
Ключ extends позволяет наследовать и комбинировать
конфигурации.
{
"extends": [
"@parcel/config-default",
"./parcel.config.base.json"
]
}
Приоритет правил:
Все секции, работающие с файлами, используют glob-выражения:
*.js — все JS файлы в директории**/*.ts — рекурсивно во всех подпапках*.{js,ts} — несколько расширений!*.test.js — исключение файловПример комбинирования:
{
"transformers": {
"*.{js,ts}": ["@parcel/transformer-babel"],
"**/*.worker.js": ["@parcel/transformer-web-worker"]
}
}
Parcel строго соблюдает порядок выполнения:
Изменение порядка возможно только внутри соответствующих цепочек (transformers, optimizers и т.д.), но не между этапами.
.parcelrc поддерживает подключение локальных
модулей.
{
"transformers": {
"*.md": ["./transformers/markdown-transformer"]
}
}
Такой подход используется для:
Для различных типов файлов можно задавать независимые цепочки обработки:
{
"extends": "@parcel/config-default",
"transformers": {
"*.ts": [
"@parcel/transformer-typescript-tsc"
],
"*.vue": [
"@parcel/transformer-vue"
],
"*.scss": [
"@parcel/transformer-sass"
]
},
"optimizers": {
"*.js": [
"@parcel/optimizer-terser"
],
"*.css": [
"@parcel/optimizer-cssnano"
]
}
}
Каждая цепочка изолирована и не влияет на другие типы ресурсов.
Формат .parcelrc имеет ряд ограничений:
Ошибки конфигурации чаще всего связаны с:
extendsПри пересечении правил Parcel применяет приоритетность:
Пример:
{
"transformers": {
"*.js": ["A", "B"],
"src/special/*.js": ["C", "B"]
}
}
Файлы из src/special будут обрабатываться отдельной
цепочкой.
Parcel позволяет комбинировать конфигурации через монорепозитории и разные уровни директорий:
.parcelrc в корне проекта.parcelrc в подпроектеПри этом Parcel объединяет их по принципу наследования и приоритета, формируя итоговый граф обработки без ручного вмешательства.