@import

Sass расширяет CSS правило @import возможностью импортировать таблицы стилей Sass и CSS, обеспечивая доступ к миксинам, функциям и переменным и объединение CSS нескольких таблиц стилей вместе. В отличие от простого импорта CSS, который требует, чтобы браузер выполнял несколько HTTP-запросов при отображении вашей страницы, импорт Sass полностью обрабатывается во время компиляции.

Импорт Sass имеет тот же синтаксис, что и импорт CSS, за исключением того, что он позволяет разделять несколько операций импорта запятыми, а не требует, чтобы каждый из них имел собственный @import. Кроме того, в синтаксисе с отступом импортированные URL-адреса не обязательно должны иметь кавычки.

⚠️ Внимание!

Команда Sass не рекомендует продолжать использовать правило @import. Sass будет постепенно отказываться от него в течение следующих нескольких лет и в конечном итоге полностью удалит его из языка. Вместо этого предпочтите правило @use. (Обратите внимание, что только Dart Sass в настоящее время поддерживает @use. Пользователи других реализаций должны вместо этого использовать правило @import.)

Что не так с @import?

Правило @import имеет ряд серьезных проблем:

  • @import делает все переменные, миксины и функции глобально доступными. Из-за этого людям (или инструментам) очень сложно сказать, где что-то определено.

  • Поскольку все глобально, библиотеки должны добавлять префиксы ко всем своим участникам, чтобы избежать конфликтов имен.

  • Правила @extend также являются глобальными, что затрудняет прогнозирование того, какие правила стиля будут расширены.

  • Каждая таблица стилей выполняется и ее CSS генерируется каждый раз при добавлении @import, что увеличивает время компиляции и приводит к раздутому выводу.

  • Не было способа определить частные участники или селекторы заполнителей, которые были недоступны для последующих таблиц стилей.

Новая модульная система и правило @use решают все эти проблемы.

Как мне мигрировать?

Мы написали инструмент миграции который автоматически преобразует большую часть кода на основе @import в код на основе @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
@import 'foundation/code', '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
@import foundation/code, 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;
}










Когда Sass импортирует файл, этот файл оценивается так, как если бы его содержимое появилось непосредственно вместо @import. Любые примеси, функции и переменные из импортированного файла становятся доступными, и весь его CSS включается в тот момент, когда был написан @import. Более того, любые миксины, функции или переменные, которые были определены до @import (в том числе из других @import), доступны в импортированной таблице стилей.

⚠️ Внимание!

Если одна и та же таблица стилей импортируется более одного раза, она будет оцениваться каждый раз заново. Если он просто определяет функции и миксины, это обычно не имеет большого значения, но если он содержит правила стиля, они будут скомпилированы в CSS более одного раза.

Поиск файла permalinkПоиск файла

Было бы неинтересно записывать абсолютные URL-адреса для каждой импортируемой таблицы стилей, поэтому алгоритм Sass для поиска файла для импорта делает это немного проще. Во-первых, вам не нужно явно указывать расширение файла, который вы хотите импортировать; @import "variables" автоматически загрузит variables.scss, variables.sass или variables.css.

⚠️ Внимание!

Чтобы таблицы стилей работали в каждой операционной системе, Sass импортирует файлы по URL, а не по пути к файлу. Это означает, что вам нужно использовать косую черту, а не обратную косую черту, даже если вы работаете в Windows.

Загрузка путей permalinkЗагрузка путей

Все реализации Sass позволяют пользователям указывать пути загрузки: пути в файловой системе, которые Sass будет искать при разрешении импорта. Например, если вы передаете node_modules/susy/sass в качестве пути загрузки, вы можете использовать @import "susy" для загрузки node_modules/susy/sass/susy.scss.

Однако импорт всегда будет сначала разрешаться относительно текущего файла. Пути загрузки будут использоваться только в том случае, если не существует относительного файла, соответствующего импорту. Это гарантирует, что вы не сможете случайно испортить относительный импорт при добавлении новой библиотеки.

💡 Интересный факт:

В отличие от некоторых других языков, Sass не требует, чтобы вы использовали ./ для относительного импорта. Относительный импорт всегда доступен.

Частичные permalinkЧастичные

По соглашению, файлы Sass, которые предназначены только для импорта, а не для компиляции, начинаются с _ (как в _code.scss). Они называются частичными, и они говорят инструментам Sass не пытаться скомпилировать эти файлы самостоятельно. Вы можете не использовать символ _ при импорте частичного файла.

Индексные файлы permalinkИндексные файлы

Совместимость:
Dart Sass
LibSass
since 3.6.0
Ruby Sass
since 3.6.0

Если вы напишете в папке _index.scss или _index.sass, то при импорте самой папки этот файл будет загружен на свое место.

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
@import 'code', 'lists';
// style.scss
@import '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
@import code, lists
// style.sass
@import foundation

CSS Output

code {
  padding: .25em;
  line-height: 0;
}

ul, ol {
  text-align: left;
}
ul ul, ol ol {
  padding-bottom: 0;
  padding-left: 0;
}














Пользовательские импортеры permalinkПользовательские импортеры

Все реализации Sass предоставляют способ определения пользовательских импортеров, которые управляют тем, как @import находит таблицы стилей:

Вложенность permalinkВложенность

Импорт обычно записывается на верхнем уровне таблицы стилей, но это не обязательно. Они также могут быть вложены в правила стиля или простые правила CSS. Импортированный CSS вложен в этот контекст, что делает вложенный импорт полезным для привязки фрагмента CSS к определенному элементу или медиа-запросу. Обратите внимание, что примеси, функции и переменные верхнего уровня, определенные во вложенном импорте, по-прежнему определены глобально.

SCSS Syntax

// _theme.scss
pre, code {
  font-family: 'Source Code Pro', Helvetica, Arial;
  border-radius: 4px;
}
// style.scss
.theme-sample {
  @import "theme";
}

Sass Syntax

// _theme.sass
pre, code
  font-family: 'Source Code Pro', Helvetica, Arial
  border-radius: 4px

// style.sass
.theme-sample
  @import theme

CSS Output

.theme-sample pre, .theme-sample code {
  font-family: 'Source Code Pro', Helvetica, Arial;
  border-radius: 4px;
}







💡 Интересный факт:

Вложенный импорт очень полезен для определения сторонних таблиц стилей, но если вы являетесь автором импортируемой таблицы стилей, обычно лучше записать свои стили в примесь и включить этот миксин во вложенные контекст. Примесь можно использовать более гибкими способами, и при взгляде на импортированную таблицу стилей становится понятнее, как она предназначена для использования.

⚠️ Внимание!

CSS во вложенном импорте оценивается как миксин, что означает, что любые родительские селекторы будут ссылаться на селектор, в который вложена таблица стилей.

SCSS Syntax

// _theme.scss
ul li {
  $padding: 16px;
  padding-left: $padding;
  [dir=rtl] & {
    padding: {
      left: 0;
      right: $padding;
    }
  }
}
// style.scss
.theme-sample {
  @import "theme";
}

Sass Syntax

// _theme.sass
ul li
  $padding: 16px
  padding-left: $padding
  [dir=rtl] &
    padding:
      left: 0
      right: $padding



// style.sass
.theme-sample
  @import theme

CSS Output

.theme-sample ul li {
  padding-left: 16px;
}
[dir=rtl] .theme-sample ul li {
  padding-left: 0;
  padding-right: 16px;
}










Импорт CSS permalinkИмпорт CSS

Совместимость:
Dart Sass
since 1.11.0
LibSass
partial
Ruby Sass

LibSass поддерживает импорт файлов с расширением .css, но вопреки спецификации они обрабатываются как файлы SCSS, а не анализируются как CSS. Это поведение устарело, и в настоящее время разрабатывается обновление для поддержки поведения, описанного ниже.

Помимо импорта файлов .sass и .scss, Sass может импортировать простые старые файлы .css. Единственное правило состоит в том, что импорт не должен явно включать расширение .css, потому что оно используется для обозначения простого CSS @import.

SCSS Syntax

// code.css
code {
  padding: .25em;
  line-height: 0;
}
// style.scss
@import 'code';

Sass Syntax

// code.css
code {
  padding: .25em;
  line-height: 0;
}
// style.sass
@import code

CSS Output

code {
  padding: .25em;
  line-height: 0;
}





Файлы CSS, импортированные Sass, не поддерживают никаких специальных функций Sass. Чтобы гарантировать, что авторы случайно не напишут Sass в своем CSS, все функции Sass, которые также не являются корректным CSS, будут вызывать ошибки. В противном случае CSS будет отображаться как есть. Его можно даже расширить!

Простой CSS @import permalinkПростой CSS @import

Совместимость:
Dart Sass
LibSass
partial
Ruby Sass

По умолчанию LibSass правильно обрабатывает простой импорт CSS. Однако любые пользовательские импортеры будут неправильно применяться к правилам простого CSS @import, что позволяет этим правилам загружать файлы Sass.

Поскольку @import также определен в CSS, Sass нужен способ компиляции простого CSS @import без попытки импортировать файлы во время компиляции. Чтобы добиться этого и гарантировать, что SCSS является как можно большей частью надмножества CSS, Sass будет компилировать любой @import со следующими характеристиками в простой импорт CSS:

  • Импортирует, где URL заканчивается на .css.
  • Импортирует, где URL начинается с http:// или https://.
  • Импортирует, где URL-адрес записан как url().
  • Импорт с медиа-запросами.

SCSS Syntax

@import "theme.css";
@import "http://fonts.googleapis.com/css?family=Droid+Sans";
@import url(theme);
@import "landscape" screen and (orientation: landscape);

Sass Syntax

@import "theme.css"
@import "http://fonts.googleapis.com/css?family=Droid+Sans"
@import url(theme)
@import "landscape" screen and (orientation: landscape)

CSS Output

@import url(theme.css);
@import "http://fonts.googleapis.com/css?family=Droid+Sans";
@import url(theme);
@import "landscape" screen and (orientation: landscape);

Интерполяция permalinkИнтерполяция

Хотя при импорте Sass нельзя использовать интерполяцию (чтобы всегда можно было определить, откуда берутся примеси, функции и переменные), простой импорт CSS может. Это позволяет динамически генерировать импорт, например, на основе параметров миксина.

SCSS Syntax

@mixin google-font($family) {
  @import url("http://fonts.googleapis.com/css?family=#{$family}");
}

@include google-font("Droid Sans");

Sass Syntax

@mixin google-font($family)
  @import url("http://fonts.googleapis.com/css?family=#{$family}")


@include google-font("Droid Sans")

CSS Output

@import url("http://fonts.googleapis.com/css?family=Droid Sans");




Импорт и модули permalinkИмпорт и модули

Совместимость:
Dart Sass
since 1.23.0
LibSass
Ruby Sass

В настоящее время только Dart Sass поддерживает @use. Пользователи других реализаций должны использовать правило @import rule вместо этого.

Модульная система Sass легко интегрируется с @import, импортируете ли вы файл, содержащий правила @use, или загружаете файл, содержащий импорт, как модуль. Мы хотим сделать переход от @import к @use как можно более плавным.

Импорт файла модуля-системы permalinkИмпорт файла модуля-системы

Когда вы импортируете файл, содержащий правила @use, импортирующий файл имеет доступ ко всем участникам (даже частным участникам), определенным непосредственно в этом файле, но не ни к каким участникам из модулей, загруженных этим файлом. Однако, если этот файл содержит правила @forward, импортируемый файл будет иметь доступ к перенаправленным участникам. Это означает, что вы можете импортировать библиотеку, которая была написана для использования с модульной системой.

⚠️ Внимание!

Когда импортируется файл с правилами @use, весь CSS, транзитивно загруженный ими, включается в результирующую таблицу стилей, даже если он уже был включен другим импортом. Если вы не будете осторожны, это может привести к раздуванию вывода CSS!

Файлы только для импорта permalinkФайлы только для импорта

API, который имеет смысл для @use, может не иметь смысла для @import. Например, @use по умолчанию добавляет пространство имен всем участникам, так что вы можете безопасно использовать короткие имена, но @import не делает, поэтому вам может понадобиться что-то более длинное. Если вы являетесь автором библиотеки, вы можете быть обеспокоены тем, что если вы обновите свою библиотеку для использования новой системы модулей, ваши существующие пользователи, основанные на @import, сломаются.

Чтобы упростить эту задачу, Sass также поддерживает файлы только для импорта. Если вы назовете файл <name>.import.scss, он будет загружен только для импорта, а не для @use. Таким образом, вы можете сохранить совместимость для пользователей @import, в то же время предоставляя удобный API для пользователей новой модульной системы.

SCSS Syntax

// _reset.scss

// Пользователи системы модулей пишут `@include reset.list()`.
@mixin list() {
  ul {
    margin: 0;
    padding: 0;
    list-style: none;
  }
}
// _reset.import.scss

// Устаревшие пользователи импорта могут продолжать писать `@include reset-list()`.
@forward "reset" as reset-*;

Sass Syntax

// _reset.sass

// Пользователи системы модулей пишут `@include reset.list()`.
@mixin list()
  ul
    margin: 0
    padding: 0
    list-style: none


// _reset.import.sass

// Устаревшие пользователи импорта могут продолжать писать `@include reset-list()`.
@forward "reset" as reset-*

Настройка модулей с помощью импорта permalinkНастройка модулей с помощью импорта

Совместимость:
Dart Sass
since 1.24.0
LibSass
Ruby Sass

Вы можете настроить модули, которые загружаются через @import, определяя глобальные переменные до @import, который первым загружает этот модуль.

SCSS Syntax

// _library.scss
$color: blue !default;

a {
  color: $color;
}
// _library.import.scss
@forward 'library' as lib-*;
// style.sass
$lib-color: green;
@import "library";

Sass Syntax

$color: blue !default

a
  color: $color


// _library.import.sass
@forward 'library' as lib-*
// style.sass
$lib-color: green
@import "library"

CSS Output

a {
  color: green;
}












⚠️ Внимание!

Модули загружаются только один раз, поэтому, если вы измените конфигурацию после того, как вы @import модуля в первый раз (даже косвенно), изменение будет проигнорировано, если вы @import модуль снова.

Загрузка модуля, содержащего импорт permalinkЗагрузка модуля, содержащего импорт

Когда вы используете @use (или @forward), загружаете модуль, который использует @import, этот модуль будет содержать все открытые участники, определенные таблицей стилей, которую вы загружаете, и все, что таблица стилей транзитивно импортирует. Другими словами, все, что импортируется, обрабатывается так, как если бы оно было записано в одной большой таблице стилей.

Это упрощает преобразование start с использованием @use в таблице стилей даже до того, как все библиотеки, от которых вы зависите, будут преобразованы в новую модульную систему. Однако имейте в виду, что если они все-таки конвертируют, их API-интерфейсы могут измениться!