CSS Custom Properties (переменные CSS) представляют собой механизм
хранения значений, доступных на уровне каскада стилей. Они объявляются
через префикс -- и используются через функцию
var().
Ключевая особенность заключается в том, что такие переменные обрабатываются в рантайме браузера, а не на этапе сборки. Это фундаментально отличает их от переменных препроцессоров (Sass, Less), которые компилируются в статические значения до попадания в браузер.
:root {
--main-color: #4f46e5;
--spacing-unit: 8px;
}
.button {
background: var(--main-color);
padding: calc(var(--spacing-unit) * 2);
}
Для системы сборки это означает, что значения переменных, как правило, недоступны для статического анализа и подстановки без дополнительных инструментов.
Parcel рассматривает CSS как часть графа зависимостей. Каждый CSS-файл проходит через несколько стадий:
@import, url(),
@value и др.)CSS Custom Properties не выделяются в отдельную сущность на уровне Parcel, но их поведение определяется контекстом всей цепочки обработки CSS.
Parcel не выполняет подстановку значений CSS Custom Properties, так как это нарушило бы семантику каскада и наследования. Вместо этого система обеспечивает корректную передачу переменных в итоговый CSS без изменения их логики.
При сборке происходит следующее:
--variable-name остаются
неизменнымиvar(--variable-name) не трансформируются в
статические значенияЭто обеспечивает идентичное поведение в development и production средах.
Parcel использует PostCSS как основной механизм расширения возможностей CSS. Через него подключаются плагины, влияющие на обработку стилей.
Наиболее значимым инструментом является
postcss-preset-env, который может:
CSS Custom Properties при этом не компилируются, но могут участвовать в генерации fallback-логики:
.button {
color: var(--text-color, black);
}
Fallback-значение остаётся нетронутым и используется браузером напрямую, без участия сборщика.
В production-сборке Parcel применяет CSS minifier (обычно cssnano через PostCSS). При этом поведение Custom Properties имеет ограничения:
Пример:
:root {
--spacing: 10px;
--spacing: 10px;
}
После минификации возможно сокращение до одного объявления, но только при полной эквивалентности контекста.
При использовании CSS Modules Parcel изолирует классы, но CSS Custom Properties ведут себя иначе, поскольку они наследуются через DOM.
/* styles.module.css */
.card {
--card-padding: 16px;
padding: var(--card-padding);
}
После компиляции:
.card может быть хешировано--card-padding остаётся глобально доступным внутри
DOM-веткиЭто создаёт гибридную модель: локальная область видимости классов и глобальная семантика переменных.
Parcel не вмешивается в механизмы каскада, однако его бандлинг влияет на итоговую структуру CSS:
@import инлайнятся в итоговый бандл:root могут попадать в общий глобальный
слойCSS Custom Properties активно используют наследование:
.theme-dark {
--bg: #111;
--text: #eee;
}
.panel {
background: var(--bg);
color: var(--text);
}
Parcel сохраняет эту модель без преобразований, так как любое вмешательство нарушило бы динамическое поведение темы.
В режиме разработки Parcel использует HMR для CSS. При изменении файла:
CSS Custom Properties особенно хорошо подходят для HMR-сценариев, поскольку:
:root мгновенно
отражается во всех зависимых стиляхПример поведения:
:root {
--accent: red;
}
После изменения на:
:root {
--accent: blue;
}
все элементы, использующие var(--accent), обновляются
без перерасчёта классов или повторной компиляции логики.
Parcel строит граф зависимостей CSS, но CSS Custom Properties не образуют явных связей:
var(--x) не создаёт зависимость от места объявления
--xЭто означает отсутствие возможности:
CSS Custom Properties в связке с Parcel часто используются вместе с:
calc(), clamp(),
min(), max()Parcel в этих сценариях выступает как транспортер, обеспечивающий:
В production режиме Parcel ориентируется на стабильность CSS Custom Properties:
Такой подход поддерживает сложные системы темизации, где переменные используются как основа архитектуры стилей, а не как статические значения для компиляции.