Dart Sass: загрузите переменные темы в новую систему модулей

Я работаю над стилями для мультитенантных приложений, для которых был выбран 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.

Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
0
0
15
1

Ответы 1

Сначала ошибка:

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, которые все используют разные файлы конфигурации модуля.

1. Ошибка Я добавил фрагмент _base-variables.scss в исходный пост для пояснения. Как видите, я объявил переменные с помощью !default, но почему-то они теряются при импорте с помощью @use.

mtk 08.04.2021 18:21

2. Знаете ли вы, как хранить базовые переменные в отдельном файле вместо встроенных в module/file: ../base/index.scss? Кроме того, как я могу передать объект в аргумент with вместо длинного списка ($var: value ...)?

mtk 08.04.2021 18:23

Ошибка: устранение неполадок может быть отчаянным процессом ... и я ВЕРЮ, что вы записали вары в файл как !defaults. Но, тем не менее, ошибка и ПОДСКАЗКА от этой ошибки ясны: вы пытались использовать модуль / файл с конфигурационными vars ... но конфигурации var вообще не существуют в модуле / файле или по умолчанию. Может быть, так вы включаете файл var: @use "./base-variables" as *; Это тот же каталог (!?), так что, может быть, попробуйте @use "base-variables" as *; ... или это при другом использовании @use?

Brebber 08.04.2021 19:29

Храните конфигурационные переменные в отдельном файле: Нет, я не нашел рабочего способа до сих пор, но многие намекают, что это нежелательно разработчикам проекта SASS ... бог знает почему. Я думаю, что есть много программистов, которые ищут ... Но на самом деле в документации есть тонкий намек на передачу объекта (= карты) с помощью миксина ... но модуль должен быть подготовлен для этого с помощью миксинов, а я не может реализовать преимущества файла конфигурации модуля ... и, похоже, это также нецелесообразно. Но, может быть, вам поможет эта шелковая нить: sass-lang.com/documentation/at-rules/use#with-mixins (было бы неплохо обратной связи)

Brebber 08.04.2021 19:54

Другие вопросы по теме