@use
- Dart Sass
- since 1.23.0
- LibSass
- ✗
- Ruby Sass
- ✗
В настоящее время только Dart Sass поддерживает @use
. Пользователи других реализаций должны использовать правило @import
rule вместо этого.
Правило @use
загружает миксины, функции и переменные из других таблиц стилей Sass и объединяет CSS из нескольких таблиц стилей вместе. Таблицы стилей, загруженные с помощью @use
, называются "модулями". Sass также предоставляет встроенные модули, полные полезных функций.
Простейшее правило @use
записывается как @use "<url>"
, которое загружает модуль по заданному URL. Любые стили, загруженные таким образом, будут включены ровно один раз в скомпилированный вывод CSS, независимо от того, сколько раз эти стили загружались.
⚠️ Внимание!
Правила таблицы стилей @use
должны стоять перед любыми правилами, кроме @forward
, включая правила стилей. Однако вы можете объявить переменные перед правилами @use
, которые будут использоваться при настройке модулей.
SCSS Syntax
// foundation/_code.scss
code {
padding: .25em;
line-height: 0;
}
// foundation/_lists.scss
ul, ol {
text-align: left;
& & {
padding: {
bottom: 0;
left: 0;
}
}
}
// style.scss
@use 'foundation/code';
@use 'foundation/lists';
Sass Syntax
// foundation/_code.sass
code
padding: .25em
line-height: 0
// foundation/_lists.sass
ul, ol
text-align: left
& &
padding:
bottom: 0
left: 0
// style.sass
@use 'foundation/code'
@use 'foundation/lists'
CSS Output
code {
padding: .25em;
line-height: 0;
}
ul, ol {
text-align: left;
}
ul ul, ol ol {
padding-bottom: 0;
padding-left: 0;
}
Загрузка участников permalinkЗагрузка участников
Вы можете получить доступ к переменным, функциям и миксинам из другого модуля, написав <namespace>.<variable>
, <namespace>.<function>()
или @include <namespace>.<mixin>()
. По умолчанию пространство имен - это только последний компонент URL-адреса модуля.
Участники (переменные, функции и миксины), загруженные с помощью @use
, видны только в таблице стилей, которая их загружает. Другим таблицам стилей потребуется написать свои собственные правила @use
, если они также хотят получить к ним доступ. Это помогает легко определить, откуда каждый участник. Если вы хотите загрузить участников из многих файлов одновременно, вы можете использовать правило @forward
, чтобы перенаправить их всех из одного общего файла.
💡 Интересный факт:
Поскольку @use
добавляет пространства имен к именам участников, можно безопасно выбирать очень простые имена, такие как $radius
или $width
, при написании таблицы стилей. Это отличается от старого правила @import
, которое поощряло пользователей писать длинные имена, такие как $mat-corner-radius
, чтобы избежать конфликтов с другими библиотеками, и это помогает сохранять ваши таблицы стилей ясными и удобными для чтения!
SCSS Syntax
// src/_corners.scss
$radius: 3px;
@mixin rounded {
border-radius: $radius;
}
// style.scss
@use "src/corners";
.button {
@include corners.rounded;
padding: 5px + corners.$radius;
}
Sass Syntax
// src/_corners.sass
$radius: 3px
@mixin rounded
border-radius: $radius
// style.sass
@use "src/corners"
.button
@include corners.rounded
padding: 5px + corners.$radius
CSS Output
.button {
border-radius: 3px;
padding: 8px;
}
Выбор пространства имен permalinkВыбор пространства имен
По умолчанию пространство имен модуля - это только последний компонент его URL без расширения файла. Однако иногда вам может потребоваться выбрать другое пространство имен - вы можете захотеть использовать более короткое имя для модуля, на который вы много ссылаетесь, или вы можете загружать несколько модулей с одним и тем же именем файла. Вы можете сделать это, написав @use "<url>" как <namespace>
.
SCSS Syntax
// src/_corners.scss
$radius: 3px;
@mixin rounded {
border-radius: $radius;
}
// style.scss
@use "src/corners" as c;
.button {
@include c.rounded;
padding: 5px + c.$radius;
}
Sass Syntax
// src/_corners.sass
$radius: 3px
@mixin rounded
border-radius: $radius
// style.sass
@use "src/corners" as c
.button
@include c.rounded
padding: 5px + c.$radius
CSS Output
.button {
border-radius: 3px;
padding: 8px;
}
Вы даже можете загрузить модуль без пространства имен, написав @use "<url>" as *
. Однако мы рекомендуем делать это только для таблиц стилей, написанных вами; в противном случае они могут ввести новых участников, что вызовет конфликты имен!
SCSS Syntax
// src/_corners.scss
$radius: 3px;
@mixin rounded {
border-radius: $radius;
}
// style.scss
@use "src/corners" as *;
.button {
@include rounded;
padding: 5px + $radius;
}
Sass Syntax
// src/_corners.sass
$radius: 3px
@mixin rounded
border-radius: $radius
// style.sass
@use "src/corners" as *
.button
@include rounded
padding: 5px + $radius
CSS Output
.button {
border-radius: 3px;
padding: 8px;
}
Частные участники permalinkЧастные участники
Как автор таблицы стилей вы можете не захотеть, чтобы все определяемые вами участники были доступны за пределами вашей таблицы стилей. Sass упрощает определение закрытого участника, начав его имя с символа -
или _
. Эти участники будут работать как обычно в таблице стилей, которая их определяет, но они не будут частью общедоступного API модуля. Это означает, что таблицы стилей, загружающие ваш модуль, не могут их видеть!
💡 Интересный факт:
Если вы хотите сделать участника закрытым для всего пакета, а не только для одного модуля, просто не пересылайте его модуль из любой точки входа вашего пакета (таблицы стилей, которые вы говорите своим пользователям загружать, чтобы использовать ваш упаковка). Вы даже можете скрыть этого участника при пересылке остальной части его модуля!
SCSS Syntax
// src/_corners.scss
$-radius: 3px;
@mixin rounded {
border-radius: $-radius;
}
// style.scss
@use "src/corners";
.button {
@include corners.rounded;
// Это ошибка! $-radius не отображается за пределами `_corners.scss`.
padding: 5px + corners.$-radius;
}
Sass Syntax
// src/_corners.sass
$-radius: 3px
@mixin rounded
border-radius: $-radius
// style.sass
@use "src/corners"
.button
@include corners.rounded
// Это ошибка! $-radius не отображается за пределами `_corners.scss`.
padding: 5px + corners.$-radius
Конфигурация permalinkКонфигурация
Таблица стилей может определять переменные с помощью флага !default
, чтобы сделать их настраиваемыми. Чтобы загрузить модуль с конфигурацией, напишите @use <url> с (<variable>: <value>, <variable>: <value>)
. Настроенные значения заменят значения переменных по умолчанию.
SCSS Syntax
// _library.scss
$black: #000 !default;
$border-radius: 0.25rem !default;
$box-shadow: 0 0.5rem 1rem rgba($black, 0.15) !default;
code {
border-radius: $border-radius;
box-shadow: $box-shadow;
}
// style.scss
@use 'library' with (
$black: #222,
$border-radius: 0.1rem
);
Sass Syntax
// _library.sass
$black: #000 !default
$border-radius: 0.25rem !default
$box-shadow: 0 0.5rem 1rem rgba($black, 0.15) !default
code
border-radius: $border-radius
box-shadow: $box-shadow
// style.sass
@use 'library' with ($black: #222, $border-radius: 0.1rem)
CSS Output
code {
border-radius: 0.1rem;
box-shadow: 0 0.5rem 1rem rgba(34, 34, 34, 0.15);
}
С миксинами permalinkС миксинами
Настройка модулей с помощью @use ... with
может быть очень удобной, особенно при использовании библиотек, которые изначально были написаны для работы с правилом @import
. Но он не особенно гибкий, и мы не рекомендуем его для более сложных случаев использования. Если вы обнаружите, что хотите настроить сразу несколько переменных, передать [карты]]maps в качестве конфигурации или обновить конфигурацию после загрузки модуля, подумайте о написании миксина для установки ваших переменных вместо этого и другого миксина для внедрения ваших стилей.
SCSS Syntax
// _library.scss
$-black: #000;
$-border-radius: 0.25rem;
$-box-shadow: null;
/// Если пользователь настроил `$-box-shadow`, возвращает их настроенное значение.
/// В противном случае возвращает значение, производное от `$-black`.
@function -box-shadow() {
@return $-box-shadow or (0 0.5rem 1rem rgba($-black, 0.15));
}
@mixin configure($black: null, $border-radius: null, $box-shadow: null) {
@if $black {
$-black: $black !global;
}
@if $border-radius {
$-border-radius: $border-radius !global;
}
@if $box-shadow {
$-box-shadow: $box-shadow !global;
}
}
@mixin styles {
code {
border-radius: $-border-radius;
box-shadow: -box-shadow();
}
}
// style.scss
@use 'library';
@include library.configure(
$black: #222,
$border-radius: 0.1rem
);
@include library.styles;
Sass Syntax
// _library.sass
$-black: #000
$-border-radius: 0.25rem
$-box-shadow: null
/// Если пользователь настроил `$-box-shadow`, возвращает их настроенное значение.
/// В противном случае возвращает значение, производное от `$-black`.
@function -box-shadow()
@return $-box-shadow or (0 0.5rem 1rem rgba($-black, 0.15))
@mixin configure($black: null, $border-radius: null, $box-shadow: null)
@if $black
$-black: $black !global
@if $border-radius
$-border-radius: $border-radius !global
@if $box-shadow
$-box-shadow: $box-shadow !global
@mixin styles
code
border-radius: $-border-radius
box-shadow: -box-shadow()
// style.sass
@use 'library'
@include library.configure($black: #222, $border-radius: 0.1rem)
@include library.styles
CSS Output
code {
border-radius: 0.1rem;
box-shadow: 0 0.5rem 1rem rgba(34, 34, 34, 0.15);
}
Переназначение переменных permalinkПереназначение переменных
После загрузки модуля вы можете переназначить его переменные.
SCSS Syntax
// _library.scss
$color: red;
// _override.scss
@use 'library';
library.$color: blue;
// style.scss
@use 'library';
@use 'override';
@debug library.$color; //=> blue
Sass Syntax
// _library.sass
$color: red
// _override.sass
@use 'library'
library.$color: blue
// style.sass
@use 'library'
@use 'override'
@debug library.$color //=> blue
Это работает, даже если вы импортируете модуль без пространства имен, используя as *
. Присвоение имени переменной, определенной в этом модуле, перезапишет ее значение в этом модуле.
⚠️ Внимание!
Встроенные переменные модуля (например, math.$pi
) нельзя переназначить.
Поиск модуля permalinkПоиск модуля
Было бы неинтересно выписывать абсолютные URL-адреса для каждой загружаемой таблицы стилей, поэтому алгоритм поиска модуля Sass делает это немного проще. Во-первых, вам не нужно явно указывать расширение файла, который вы хотите загрузить; @use "variables"
автоматически загрузит variables.scss
, variables.sass
или variables.css
.
⚠️ Внимание!
Чтобы таблицы стилей работали в любой операционной системе, Sass загружает файлы по URL, а не по пути к файлу. Это означает, что вам нужно использовать косую черту, а не обратную, даже в Windows.
Загрузка путей permalinkЗагрузка путей
Все реализации Sass позволяют пользователям указывать пути загрузки: пути в файловой системе, которые Sass будет искать при поиске модулей. Например, если вы передаете node_modules/susy/sass
в качестве пути загрузки, вы можете использовать @use "susy"
для загрузки node_modules/susy/sass/susy.scss
.
Однако модули всегда будут загружаться в первую очередь относительно текущего файла. Пути загрузки будут использоваться только в том случае, если не существует относительного файла, соответствующего URL-адресу модуля. Это гарантирует, что вы не сможете случайно испортить относительный импорт при добавлении новой библиотеки.
💡 Интересный факт:
В отличие от некоторых других языков, Sass не требует, чтобы вы использовали ./
для относительного импорта. Относительный импорт всегда доступен.
Составляющие permalinkСоставляющие
По соглашению, файлы Sass, которые предназначены только для загрузки в виде модулей, а не компилируются сами по себе, начинаются с _
(как в _code.scss
). Они называются частичными, и они говорят инструментам Sass не пытаться скомпилировать эти файлы самостоятельно. Вы можете не использовать символ _
при импорте частичного файла.
Индексные файлы permalinkИндексные файлы
Если вы напишете _index.scss
или _index.sass
в папке, индексный файл будет загружен автоматически, когда вы загрузите URL-адрес самой папки.
SCSS Syntax
// foundation/_code.scss
code {
padding: .25em;
line-height: 0;
}
// foundation/_lists.scss
ul, ol {
text-align: left;
& & {
padding: {
bottom: 0;
left: 0;
}
}
}
// foundation/_index.scss
@use 'code';
@use 'lists';
// style.scss
@use 'foundation';
Sass Syntax
// foundation/_code.sass
code
padding: .25em
line-height: 0
// foundation/_lists.sass
ul, ol
text-align: left
& &
padding:
bottom: 0
left: 0
// foundation/_index.sass
@use 'code'
@use 'lists'
// style.sass
@use 'foundation'
CSS Output
code {
padding: .25em;
line-height: 0;
}
ul, ol {
text-align: left;
}
ul ul, ol ol {
padding-bottom: 0;
padding-left: 0;
}
Загрузка CSS permalinkЗагрузка CSS
Помимо загрузки файлов .sass
и .scss
, Sass может загружать простые старые файлы .css
files.
SCSS Syntax
// code.css
code {
padding: .25em;
line-height: 0;
}
// style.scss
@use 'code';
Sass Syntax
// code.css
code {
padding: .25em;
line-height: 0;
}
// style.sass
@use 'code'
CSS Output
code {
padding: .25em;
line-height: 0;
}
Файлы CSS, загружаемые в виде модулей, не поддерживают никаких специальных функций Sass и поэтому не могут предоставлять какие-либо переменные, функции или миксины Sass. Чтобы гарантировать, что авторы случайно не напишут Sass в своем CSS, все функции Sass, которые также не являются корректным CSS, будут вызывать ошибки. В противном случае CSS будет отображаться как есть. Его можно даже расширить!