В процессе сборки Parcel анализирует каждую импортную директиву и преобразует строковые пути в конкретные файлы файловой системы или виртуальные ресурсы. Этот процесс называется разрешением модулей (module resolution). Он включает несколько уровней поиска, учитывающих тип импорта, контекст файла, конфигурацию проекта и правила платформы.
Основная цель — определить точный файл, который соответствует выражению вида:
import Button from "./components/Button";
import React from "react";
Первый случай относится к относительному пути, второй — к внешнему пакету. В обоих случаях Parcel применяет разные стратегии поиска.
Разрешение в Parcel начинается с классификации импортируемой строки:
Относительные пути
import utils from "../utils/math";
Обрабатываются относительно текущего файла. Parcel вычисляет абсолютный путь, добавляет расширения и ищет файл в файловой системе.
Абсолютные или алиасные пути
import utils from "@/utils/math";
Обрабатываются через систему алиасов или пользовательских правил.
Импорты пакетов
import lodash from "lodash";
Разрешаются через node_modules с учётом
package.json.
Для относительных путей Parcel выполняет последовательность шагов:
Пример:
import config from "./config";
Parcel последовательно проверяет:
./config./config.js./config.ts./config/index.js./config/index.tsПри импорте стороннего пакета Parcel использует алгоритм, совместимый
с Node.js, но расширенный поддержкой современных полей
package.json.
import express from "express";
Поиск происходит по цепочке директорий:
После нахождения пакета Parcel анализирует его
package.json, учитывая поля:
modulemainbrowserexportsПриоритет определяется конфигурацией среды сборки.
Современные пакеты используют exports для явного
описания доступных точек входа:
{
"exports": {
".": {
"import": "./dist/index.mjs",
"require": "./dist/index.cjs"
},
"./utils": "./dist/utils.mjs"
}
}
Parcel интерпретирует это как строгую карту доступных импортов. Попытка обратиться к неэкспортированному пути приводит к ошибке разрешения.
Пример:
import { helper } from "package/utils";
Если путь не описан в exports, модуль не будет найден,
даже если файл физически существует.
Parcel поддерживает систему алиасов, позволяющую заменять длинные или сложные пути на короткие логические идентификаторы.
{
"alias": {
"@components": "./src/components",
"@utils": "./src/utils"
}
}
Использование:
import Button from "@components/Button";
import formatDate from "@utils/date";
Более гибкая настройка возможна через конфигурационные плагины и резолверы:
{
"resolvers": ["@parcel/resolver-default"]
}
Собственные резолверы могут перехватывать импорт и возвращать альтернативные пути.
При наличии алиасов Parcel проверяет их до обработки файловой системы.
Порядок разрешения:
Это позволяет избежать конфликтов между пользовательскими именами и реальными пакетами.
Parcel поддерживает paths из
tsconfig.json:
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@app/*": ["src/app/*"],
"@shared/*": ["src/shared/*"]
}
}
}
Импорт:
import store from "@app/store";
Parcel синхронизирует эти правила с собственной системой резолвинга, обеспечивая единое поведение между TypeScript и сборкой.
Parcel автоматически определяет расширения, даже если они не указаны явно.
Приоритет обычно следующий:
.ts.tsx.js.jsx.json.nodeПример:
import config from "./config";
Файл может быть:
config.tsconfig.jsconfig.jsonParcel учитывает целевую платформу сборки.
Приоритет отдается полю browser в package.json:
{
"browser": "./dist/browser.js"
}
Используется main или module, игнорируя
browser-специфичные реализации.
При использовании динамических импортов:
const module = await import("./feature");
Parcel выполняет тот же алгоритм резолвинга, но дополнительно создает отдельные чанки для код-сплиттинга.
Если путь содержит переменные, Parcel пытается ограничить набор возможных модулей через статический анализ.
Ошибки возникают при невозможности сопоставить импорт с физическим или виртуальным ресурсом.
Типичные причины:
exportsParcel возвращает детализированное сообщение, указывающее цепочку поиска.
Parcel позволяет подключать кастомные резолверы, которые могут создавать виртуальные модули:
Такие резолверы интегрируются в общий pipeline и участвуют в ранней стадии сборки, до трансформации кода.
Для ускорения сборки Parcel кэширует результаты разрешения:
Кэш привязан к содержимому зависимостей и автоматически инвалидируется при изменениях файловой системы или конфигурации.