В настоящее время невозможно использовать SASS для динамического включения файлов. @import
нельзя использовать в директивах управления (например, @if
) или миксинах, использование переменной в директиве import является ошибочным синтаксисом, и нет директивы для досрочного завершения выполнения файла (что эффективно позволило бы условный импорт). Однако вы можете решить свою проблему, изменив структуру правил вашего стиля.
Примечание
Существует плагин SASS , который изменит @import
только
включите файлы один раз. Тем не менее,
- Ваш код будет иметь дополнительную зависимость от среды
- Нам всем лучше понять, как правила стилей предназначены для структурирования, что позволит избежать дублирования правил.
@import
может быть скоро устарело . Команда SASS планирует « масштабная модернизация импорта », поэтому защита от повторного импорта
может быть частью будущих версий SASS, так как она популярна
запрашиваемая функция.
Решение
Если у вас есть стили, которые условно включены из нескольких файлов, они не являются «глобальными» стилями. Эти стили должны быть заключены в миксины, в файлы 'module' или 'library'. Основная идея заключается в том, что , импортирующий один такой файл, не будет выводить никакой CSS Таким образом, вы можете импортировать эти файлы избыточно, чтобы использовать миксины там, где они вам нужны.
Если вам нужно сделать это с переменными , тогда:
- Убедитесь, что вы определили переменные, прежде чем включать миксины, в противном случае они доступны только в миксине scope . Хороший способ сделать это - определить все переменные по умолчанию в файле vars.sass и импортировать его вместе с импортированными модулями / библиотеками, чтобы переменные были доступны глобально.
- Определите переменные, используя
!default
в mixin, чтобы его можно было переопределить даже до вызова mixin (как в файле vars.sass).
Если у вас есть стили верхнего уровня , которые вы хотите убедиться, что они определены без жестких правил включения, вы можете использовать этот миксин:
$was-defined: () !default;
@mixin define-once($name) {
@if not index($was-defined, $name) {
$was-defined: append($was-defined, $name);
@content;
}
}
// Example:
@include define-once('body-typography') {
body {
font-size: 100%;
line-height: 2em;
color: #444;
font-family: monospace;
}
}
Чтобы получить более полезные рекомендации по структурированию вашего кода, ознакомьтесь с этой статьей .