Я работаю над стилями для мультитенантных приложений, для которых был выбран SASS. Следуя рекомендациям по последней версии, я начал создавать базовые стили, используя @use и @forward. Теперь я хочу тема эту базу с переменными цветов и шрифтов клиентов, чтобы получить несколько таблиц стилей, которые можно использовать в разных экземплярах нашего приложения.
Если бы я использовал устаревший @import, я бы сделал следующее:
styles/customerA/index.scss
@import "customerA-variables";
@import "../base/index";
Но с новыми правилами я не могу найти простой способ просто передать переменные, специфичные для темы, в базовые стили. Я попытался использовать ключевое слово with, но оказалось, что мне нужно определить переменные в модуле, а я бы предпочел инкапсулировать их в другом модуле и импортировать.
styles/customerA/index.scss
@use "customerA-variables" as variables;
@use "../base/index" with (
$bgColor: variables.$bgColor,
$textColor: variables.$textColor
);
styles/base/_base-variables.scss
$bgColor: #eee !default;
$textColor: #333 !default;
styles/base/index.scss
/* HOW IT WORKS */
$bgColor: #eee !default;
$textColor: #333 !default;
/* HOW I WISH IT WORKED */
@use "./base-variables" as *;
/* LATER IN THE FILE */
body {
background-color: $bgColor;
color: $textColor;
}
В сценарии @use "../variables" as * я получаю эту ошибку:
Error: This variable was not declared with !default in the @used module.
Я ищу рабочее решение, желательно без копирования всех переменных темы внутри скобок with.






Сначала ошибка:
Error: This variable was not declared with !default in the @used module.
Эта ошибка возникает, когда вы пытаетесь @use модуль / файл с переменными конфигурации, но переменные конфигурации не установлены как переменные !default в модуле / файле. Итак, SASS проверяет, передаете ли вы конфигурацию, которая не предназначена для настройки для модуля. Это дополнительная безопасность для вас.
Я не совсем уверен, правильно ли я понял ваш пример, но это может быть так:
// styles/customerA/index.scss
@use "customerA-variables" as variables;
@use "../base/index" with (
$bgColor: variables.$bgColor,
$textColor: variables.$textColor
);
--> SASS ERROR because $bgColor and/or $textColor
--> in @used module/file are not set as defaults, i.e.:
--> $bgColor: green;
--> must be: $bgColor: green !default;
Таким образом, вы можете проверить модуль, если все переменные установлены на значения по умолчанию и не перезаписаны значениями, отличными от значений по умолчанию.
** ВТОРОЙ: использование @use:
Новое правило @use действительно действительно сбивает с толку ... в вашем примере, который приводит к двойному коду: один раз, когда вы устанавливаете пользовательские переменные в customerA-variables.scss, а затем, когда вы повторяете эти переменные, когда вы @use модуль / файл в styles/customerA/index.scss (см. Ваш второй код пример).
Хороший способ избежать этого двойного кода - подготовить файл конфигурации с настройками для отдельного клиента и ЧЕМ @use файл конфигурации (а не напрямую нужный модуль / файл).
Пример:
// ###
// ### module/file: ../base/index.scss
$bgColor: #eee !default;
$textColor: #333 !default;
body {
background-color: $bgColor;
color: $textColor;
}
// ###
// ### customer configuration file: configModuleCustomerA.scss
@forward "../base/index" with (
$bgColor: red,
$textColor: blue
);
// ###
// ### use that configuration file
// ### to your main file: styles/customerA/index.scss
@use "...path.../configModuleCustomerA" as *;
// Note:
// 1. that writes the configurated css
// 2. and it provides the variables for additional use to THIS file
// see going on this file below ...
.additionalElement {
background: $bgColor;
color: $textColor;
}
// ###
// ### ---> that compiles to CSS:
body {
background-color: red;
color: blue;
}
.additionalElement {
background: red;
color: blue;
}
ПРИМЕЧАНИЕ: вам следует знать об одном дополнительном УРЯДКЕ / ЭФФЕКТЕ.
ВАМ НУЖНО УСТАНОВИТЬ ПЕРЕМЕННЫЕ ТОЛЬКО ОДИН РАЗ ... именно тогда, когда вы настраиваете модуль / файл. И поскольку вы делаете это в файле конфигурации модуля, переменные, которые вы устанавливаете там, становятся частью конфигурации вашего проекта!
Итак, если вам нужны ОДИНАКОВЫЕ переменные модуля второй / третий / ... раз (то есть в дополнительных файлах partials), вы @use этот файл конфигурации в любом файле, где он / они вам нужны. Не волнуйтесь: код css компилируется в ваш CSS только ОДИН РАЗ: при первом запуске модуля @use.
НО ПОДДЕРЖИВАЙТЕ ВАШЕ ДЕЛО:
Но если вы хотите @use модуль / файл с разными конфигурациями, как в вашем случае, вы должны скомпилировать его в два РАЗНЫХ файла CSS. Один модуль с двумя или более различными конфигурациями, загруженными в один и тот же CSS, блокируется SASS. В этом случае вам нужно разделить css на разные клиентские файлы css, которые все используют разные файлы конфигурации модуля.
2. Знаете ли вы, как хранить базовые переменные в отдельном файле вместо встроенных в module/file: ../base/index.scss? Кроме того, как я могу передать объект в аргумент with вместо длинного списка ($var: value ...)?
Ошибка: устранение неполадок может быть отчаянным процессом ... и я ВЕРЮ, что вы записали вары в файл как !defaults. Но, тем не менее, ошибка и ПОДСКАЗКА от этой ошибки ясны: вы пытались использовать модуль / файл с конфигурационными vars ... но конфигурации var вообще не существуют в модуле / файле или по умолчанию. Может быть, так вы включаете файл var: @use "./base-variables" as *; Это тот же каталог (!?), так что, может быть, попробуйте @use "base-variables" as *; ... или это при другом использовании @use?
Храните конфигурационные переменные в отдельном файле: Нет, я не нашел рабочего способа до сих пор, но многие намекают, что это нежелательно разработчикам проекта SASS ... бог знает почему. Я думаю, что есть много программистов, которые ищут ... Но на самом деле в документации есть тонкий намек на передачу объекта (= карты) с помощью миксина ... но модуль должен быть подготовлен для этого с помощью миксинов, а я не может реализовать преимущества файла конфигурации модуля ... и, похоже, это также нецелесообразно. Но, может быть, вам поможет эта шелковая нить: sass-lang.com/documentation/at-rules/use#with-mixins (было бы неплохо обратной связи)
1. Ошибка Я добавил фрагмент
_base-variables.scssв исходный пост для пояснения. Как видите, я объявил переменные с помощью!default, но почему-то они теряются при импорте с помощью@use.