Узнайте, как использовать скрипты модулей CSS для импорта таблиц стилей CSS с использованием того же синтаксиса, что и модули JavaScript.
Новая функция скриптов модулей CSS позволяет загружать таблицы стилей CSS с помощью операторов import, как и модули JavaScript. Затем таблицы стилей можно применить к документам или корневым элементам Shadow DOM так же, как и создаваемые таблицы стилей. Это может быть удобнее и эффективнее, чем другие способы импорта и применения CSS.
Поддержка браузеров
Скрипты модулей CSS по умолчанию доступны в Chrome и Edge версии 93.
Поддержка Firefox и Safari пока не реализована. Прогресс внедрения можно отслеживать в ошибке Gecko и ошибке WebKit соответственно.
Требования
- Знание модулей JavaScript.
- Знание создаваемых таблиц стилей.
Использование скриптов модулей CSS
Импортируйте скрипт модуля CSS и примените его к документу или корню тени следующим образом:
import sheet from './styles.css' assert { type: 'css' };
document.adoptedStyleSheets = [sheet];
shadowRoot.adoptedStyleSheets = [sheet];
Экспорт по умолчанию скрипта модуля CSS – это создаваемая таблица стилей, содержимое которой совпадает с содержимым импортированного файла. Как и любая другая конструируемая таблица стилей, она применяется к документам или корням теневого дерева с помощью adoptedStyleSheets.
В отличие от других способов применения CSS из JavaScript, нет необходимости создавать элементы <style> или возиться со строками JavaScript текста CSS.
Модули CSS также имеют некоторые из тех же преимуществ, что и модули JavaScript.
- Дедупликация. Если один и тот же CSS-файл импортируется из нескольких мест в приложении, он все равно будет получен, создан и проанализирован только один раз.
- Последовательный порядок обработки. При выполнении импортирующего кода JavaScript можно полагаться на то, что импортируемая таблица стилей уже получена и обработана.
- Безопасность. Модули извлекаются с помощью CORS и используют строгую проверку MIME-типов.
Утверждения импорта (что означает assert?)
Часть assert { type: 'css' } оператора import – это утверждение импорта. Это обязательное условие. Без него import будет обрабатываться как обычный импорт модуля JavaScript и не будет работать, если у импортированного файла MIME-тип, отличный от JavaScript.
import sheet from './styles.css'; // Failed to load module script:
// Expected a JavaScript module
// script but the server responded
// with a MIME type of "text/css".
Динамически импортированные таблицы стилей
Вы также можете импортировать модуль CSS, используя динамический импорт с новым вторым параметром для утверждения импорта type:
'css':
const cssModule = await import('./style.css', {
assert: { type: 'css' }
});
document.adoptedStyleSheets = [cssModule.default];
Правила @import пока не разрешены.
В настоящее время правила CSS @import не работают в конструируемых таблицах стилей, включая скрипты модулей CSS. Если в создаваемой таблице стилей есть правила @import, они будут игнорироваться.
/* atImported.css */
div {
background-color: blue;
}
/* styles.css */
@import url('./atImported.css'); /* Ignored in CSS module */
div {
border: 1em solid green;
}
<!-- index.html -->
<script type="module">
import styles from './styles.css' assert { type: "css" };
document.adoptedStyleSheets = [styles];
</script>
<div>This div will have a green border but no background color.</div>
В спецификацию может быть добавлена поддержка @import в скриптах модулей CSS. Следить за обсуждением спецификации можно на странице GitHub.