В современном JavaScript модульная система опирается не только на
импорт кода, но и на работу со статическими ресурсами, которые должны
быть корректно включены в сборку. Parcel поддерживает механизм работы с
URL-выражениями, основанный на стандартном конструкторе
new URL(), позволяющий явно указывать зависимости от
файлов, изображений, шрифтов и других ресурсов.
Ключевая идея заключается в том, что URL становится частью графа зависимостей: сборщик анализирует выражение, извлекает путь и включает соответствующий файл в бандл.
new URLКонструкция имеет следующий вид:
const imageUrl = new URL('./assets/logo.png', import.meta.url);
В этом выражении присутствуют две ключевые части:
'./assets/logo.png')import.meta.url)import.meta.url предоставляет абсолютный URL текущего
модуля. Это позволяет вычислять путь к ресурсу относительно файла, а не
текущей рабочей директории.
Результатом выражения является объект URL, из которого
обычно используется строковое представление:
const imageUrl = new URL('./assets/logo.png', import.meta.url).href;
new URL(...)Parcel анализирует AST JavaScript-кода и выявляет вызовы
new URL, где вторым аргументом является
import.meta.url. Такие конструкции считаются статически
анализируемыми зависимостями.
Процесс обработки включает несколько этапов:
В результате исходный путь заменяется на ссылку на оптимизированный ресурс в итоговой сборке.
import.meta.url в разрешении путейimport.meta.url является стандартным механизмом
ES-модулей, который возвращает абсолютный URL текущего модуля. В
контексте Parcel он используется как якорь для вычисления относительных
путей.
Пример:
const sprite = new URL('../images/sprite.svg', import.meta.url);
Parcel интерпретирует это как:
src/components/src/images/Такая модель исключает неоднозначность путей, возникающую при использовании относительных строк без контекста модуля.
Механизм new URL() в Parcel применяется преимущественно
для подключения:
png, jpg, webp,
svg)woff, woff2,
ttf)mp4, mp3)Пример подключения изображения:
const avatar = new URL('./assets/avatar.png', import.meta.url).href;
document.querySelector('img').src = avatar;
Parcel обрабатывает файл изображения как отдельный модуль, применяя:
Parcel не полагается на ручную настройку путей. Вместо этого используется анализ структуры модулей.
Пример структуры:
src/
pages/
home.js
assets/
banner.jpg
В файле home.js:
const banner = new URL('../assets/banner.jpg', import.meta.url).href;
Parcel вычисляет путь автоматически, независимо от текущей рабочей директории запуска сборки.
import и
requireМеханизм new URL() отличается от стандартного импорта
модулей:
import используется для кодаnew URL() используется для ресурсовimport возвращает экспортируемые значенияnew URL() возвращает ссылку на файлParcel применяет к ресурсам дополнительные трансформации:
/distПример итоговой трансформации:
new URL('./logo.png', import.meta.url)
может быть преобразовано в:
/dist/logo.8f3a91.png
Parcel требует, чтобы путь в new URL() был статически
определяемым.
Недопустимые конструкции:
const file = 'logo.png';
const url = new URL(`./assets/${file}`, import.meta.url);
или
new URL(dynamicPath, import.meta.url);
Такие выражения не могут быть проанализированы на этапе сборки и не включаются в граф зависимостей.
В UI-логике механизм часто применяется для динамического связывания ресурсов с элементами DOM:
const icon = new URL('./icons/settings.svg', import.meta.url).href;
const button = document.createElement('button');
const img = document.createElement('img');
img.src = icon;
button.appendChild(img);
document.body.appendChild(button);
Parcel гарантирует, что ресурс будет корректно обработан и доступен после сборки.
Механизм универсален и не ограничивается изображениями. Parcel трактует любой файл как модуль-ресурс:
@font-faceПример подключения шрифта:
const fontUrl = new URL('./fonts/inter.woff2', import.meta.url).href;
const style = document.createElement('style');
style.textContent = `
@font-face {
font-family: 'Inter';
src: url(${fontUrl});
}
`;
document.head.appendChild(style);
В development-режиме Parcel сохраняет читаемые пути для упрощения отладки. В production-режиме применяются:
При этом семантика new URL() остаётся неизменной,
изменяется только итоговое представление пути.
Каждое выражение new URL() становится узлом в графе
зависимостей Parcel. Это позволяет:
Таким образом, даже простое URL-выражение влияет на структуру всей сборки.