Система сборки Parcel опирается на конвейерную модель, в которой каждый модуль проходит этапы резолвинга, трансформации, оптимизации и упаковки. Ошибка может возникнуть на любом этапе и всегда сопровождается диагностическим объектом, содержащим структурированное описание причины сбоя.
Ключевая особенность Parcel заключается в унифицированном формате ошибок: независимо от источника (плагин, трансформер, резолвер), сообщение приводится к единому виду с обязательными полями контекста. Это позволяет анализировать проблему без необходимости разбирать внутреннюю реализацию каждого плагина.
Типичное сообщение об ошибке включает несколько слоёв информации:
BuildError, SyntaxError,
DependencyNotFound)Пример условного диагностического объекта:
{
"type": "BuildError",
"message": "Cannot resolve module 'react-dom/client'",
"filePath": "/src/index.js",
"codeFrame": {
"code": "import { createRoot } from 'react-dom/client';",
"line": 1,
"column": 25
}
}
Наиболее частый класс проблем связан с этапом разрешения зависимостей. Parcel использует резолвер, который эмулирует Node.js алгоритм, но расширяет его поддержкой алиасов, условных экспоротов и нестандартных расширений.
Сообщение вида:
Cannot resolve module 'lodash-es'
Возникает при отсутствии пакета в node_modules или при
некорректной установке зависимостей.
Package subpath './dist' is not defined by "exports" in package.json
Причина заключается в ограничениях ESM-экспорта. Parcel строго
следует полю exports, игнорируя прямой доступ к внутренним
путям пакета.
При использовании конфигурации .parcelrc или
tsconfig.json возможны ситуации, когда алиасы перекрывают
реальные пути, приводя к резолвингу несуществующих модулей.
После успешного резолвинга модуль проходит через цепочку трансформеров: Babel, TypeScript, PostCSS и другие плагины. На этом этапе ошибки чаще всего связаны с синтаксисом или несовместимостью версий.
Parcel использует парсеры AST, и любая ошибка синтаксиса приводит к остановке трансформации:
Unexpected token (10:5)
CodeFrame обычно указывает точное место нарушения:
function test() {
const a = ;
}
При включённой проверке типов могут возникать ошибки компиляции:
Type 'string' is not assignable to type 'number'
Важно, что Parcel не всегда включает строгую проверку типов по
умолчанию, поэтому такие ошибки появляются только при активной
интеграции с tsc или соответствующим плагином.
Babel-трансформеры могут конфликтовать с конфигурацией пресетов:
@babel/core.browserslistrcParcel поддерживает систему плагинов, каждый из которых может расширять этапы сборки. Ошибки на этом уровне имеют более сложную структуру, поскольку включают стек вызовов внутри пользовательского кода.
@parcel/transformer-sass: Undefined variable "$primary-color"
Причины:
При некорректной реализации плагина возможны:
Parcel в таких случаях завершает сборку с типом
BuildError и изолирует проблемный плагин.
CodeFrame представляет собой ключевой инструмент диагностики. Он показывает:
Пример:
8 | import React from "react";
9 |
>10 | const value = getData(
| ^
11 | undefinedVar
12 | );
Особенность Parcel заключается в том, что CodeFrame формируется после трансформации, но с привязкой к исходным source maps, что позволяет отображать ошибки даже после Babel или TypeScript компиляции.
При многоступенчатой сборке исходный код проходит через несколько трансформаций. Source maps обеспечивают обратное отображение ошибок на оригинальный файл.
Parcel агрегирует source maps на каждом этапе, что позволяет:
При повреждении source map возможны ложные позиции ошибок или смещение координат.
Parcel активно использует файловый кеш для ускорения сборки. Однако кеш может становиться источником нестабильных ошибок.
Симптомы:
Parcel идентифицирует часть таких случаев как CacheMiss
или автоматически инвалидирует кеш, но не всегда корректно.
Динамические импорты (import()) создают отдельные чанки,
которые проходят собственный цикл сборки.
Ошибки на этом этапе часто связаны с:
Пример проблемного кода:
import(`./pages/${pageName}.js`);
Parcel может не определить возможные значения pageName,
что приводит к ошибке во время сборки или предупреждению о невозможности
статического анализа.
Parcel использует многопоточную архитектуру Worker Threads. Ошибки могут возникать внутри worker-процессов и агрегироваться в главный процесс.
Особенности:
Сообщения вида:
Worker crashed while processing asset
обычно указывают на критическую ошибку в трансформере или нативном модуле.
При сложных графах зависимостей возможны ситуации, когда разные плагины используют несовместимые версии одной библиотеки.
Примеры:
postcss@babel/coretypescript и трансформера ParcelParcel пытается изолировать такие конфликты, но иногда ошибка проявляется только на этапе выполнения трансформации.
Stack trace в Parcel содержит как пользовательские, так и внутренние вызовы:
Error: Cannot find module
at Resolver.resolve (parcel:resolver-default)
at async Transformer.process (parcel:transformer-babel)
at async Pipeline.run (parcel:core)
Особенность анализа заключается в отделении:
Практическое значение имеет первый релевантный фрейм, относящийся к исходному файлу проекта.
Некоторые ошибки не имеют точной локализации:
В таких случаях Parcel возвращает обобщённые сообщения:
Build failed unexpectedly
или
Internal error occurred during bundling
Диагностика в подобных ситуациях опирается на:
Файл конфигурации .parcelrc напрямую влияет на цепочку
сборки. Ошибки в нём приводят к полной деградации пайплайна.
Типичные проблемы:
Пример:
{
"extends": "@parcel/config-default",
"transformers": {
"*.js": ["@parcel/transformer-babel", "@parcel/transformer-sass"]
}
}
Конфликт типов трансформеров приводит к невозможности корректной обработки файлов.
Parcel строго проверяет корректность входных файлов:
Такие ошибки обычно фиксируются на раннем этапе пайплайна и предотвращают дальнейшую обработку.
В масштабных проектах с сотнями модулей ошибки часто проявляются каскадно. Первичная ошибка вызывает цепочку последующих.
Характерные признаки:
Parcel группирует такие ошибки по первопричине, но при сложных графах зависимостей это не всегда очевидно.