Constructable Stylesheets — это современный подход к управлению стилями компонентов в веб-разработке, который позволяет создавать, переиспользовать и динамически модифицировать CSSOM-объекты без необходимости повторного инжектирования стилей в DOM. В контексте Stencil этот механизм обеспечивает более эффективную работу с CSS, особенно в сложных приложениях с большим количеством компонентов.
Constructable Stylesheets основаны на интерфейсе
CSSStyleSheet, который позволяет создавать экземпляры
таблиц стилей напрямую в Jav * aScript:
const sheet = new CSSStyleSheet();
sheet.replaceSync(`
.button {
background-color: blue;
color: white;
}
`);
После создания такого объекта его можно прикрепить к shadow
DOM компонента с помощью свойства
adoptedStyleSheets:
this.shadowRoot.adoptedStyleSheets = [sheet];
Ключевые преимущества такого подхода:
CSSStyleSheet можно применять к нескольким
компонентам.Stencil по умолчанию использует механизм scoped CSS или shadow DOM для инкапсуляции стилей. Для работы с constructable stylesheets нужно следовать следующим шагам:
const globalStyles = new CSSStyleSheet();
globalStyles.replaceSync(`
body {
font-family: Arial, sans-serif;
margin: 0;
}
`);
componentWillLoad или connectedCallback можно
присвоить стили shadow root:import { Component, h } from '@stencil/core';
@Component({
tag: 'my-button',
shadow: true
})
export class MyButton {
connectedCallback() {
if (this.shadowRoot) {
this.shadowRoot.adoptedStyleSheets = [globalStyles];
}
}
render() {
return <button class="button">Click me</button>;
}
}
setTimeout(() => {
globalStyles.replaceSync(`
body {
font-family: 'Courier New', monospace;
margin: 0;
}
`);
}, 2000);
<style> или CSS-in-JS.Комбинация нескольких таблиц стилей:
const buttonStyles = new CSSStyleSheet();
buttonStyles.replaceSync(`
.button {
padding: 10px 20px;
border-radius: 4px;
}
`);
const themeStyles = new CSSStyleSheet();
themeStyles.replaceSync(`
.button {
background-color: green;
color: white;
}
`);
this.shadowRoot.adoptedStyleSheets = [buttonStyles, themeStyles];
Порядок подключения имеет значение: последняя таблица перекрывает свойства предыдущих.
Тематизация компонентов:
function createThemeSheet(color) {
const sheet = new CSSStyleSheet();
sheet.replaceSync(`
.button {
background-color: ${color};
}
`);
return sheet;
}
this.shadowRoot.adoptedStyleSheets = [createThemeSheet('red')];
replaceSync пересоздает CSSOM, что может быть затратным при
больших стилях.Constructable Stylesheets предоставляют в Stencil мощный инструмент для управления стилями на уровне компонентов, обеспечивая повторное использование, динамическое обновление и высокую производительность, особенно в больших приложениях с модульной архитектурой.