Stencil — это фреймворк для создания компонентных библиотек, основанный на Web Components. Он позволяет разработчикам создавать высокопроизводительные, независимые от фреймворков компоненты, которые могут быть использованы в любом веб-приложении. С помощью Stencil можно создавать компоненты, которые будут работать как в React, так и в Vue, Angular или даже без каких-либо фреймворков. Эта особенность делает Stencil отличным инструментом для создания компонентных библиотек, которые легко интегрируются с различными технологиями.
Основным элементом в Stencil является компонент, который представляет
собой класс, помеченный с помощью декоратора @Component.
Каждый компонент Stencil является веб-компонентом, который реализует
интерфейс CustomElement. С помощью этого компонента можно
использовать стандартные HTML-теги и добавлять к ним
функциональность.
Пример базового компонента:
import { Component, h } from '@stencil/core';
@Component({
tag: 'my-component',
styleUrl: 'my-component.css',
shadow: true
})
export class MyComponent {
render() {
return <div>Hello, Stencil!</div>;
}
}
В этом примере создается компонент с тегом my-component,
который будет отображать текст “Hello, Stencil!”. Декоратор
@Component задает параметры компонента, включая тег, путь к
стилям и возможность использования Shadow DOM. Shadow DOM помогает
инкапсулировать стили и логику компонента, обеспечивая его независимость
от окружающего контекста.
При разработке компонентной библиотеки с помощью Stencil важно правильно организовать структуру проекта. Обычно компонентная библиотека состоит из множества компонентов, которые могут иметь свои стили, логику и зависимости. Для создания компонентов и библиотек с помощью Stencil используется следующая структура:
/src
/components
/my-component
my-component.tsx
my-component.css
/another-component
another-component.tsx
another-component.css
/utils
utils.ts
index.ts
Каждый компонент хранится в отдельной папке внутри каталога
components. В этой папке находятся файлы компонента, стили
и другие связанные ресурсы. Важно, чтобы компоненты были четко разделены
и инкапсулировали свою логику и стили, чтобы предотвратить взаимные
зависимости и облегчить повторное использование.
Stencil позволяет использовать Shadow DOM для изоляции стилей и
разметки компонента. Это особенно полезно, когда нужно избежать
конфликтов стилей между компонентами. Когда компонент использует
shadow: true в конфигурации, Stencil создает Shadow DOM,
который скрывает внутреннюю разметку и стили компонента от внешнего
мира.
Пример использования стилей внутри компонента:
@Component({
tag: 'my-component',
styleUrl: 'my-component.css',
shadow: true
})
export class MyComponent {
render() {
return <div class="my-class">Styled Component</div>;
}
}
В этом случае стили компонента будут применяться только внутри его Shadow DOM, предотвращая любые конфликтные ситуации с внешними стилями.
Stencil поддерживает использование слотов для создания компонентов с гибкой разметкой. Слоты позволяют пользователю компонента вставлять произвольный HTML в определенные места компонента, не изменяя его структуру.
Пример компонента с использованием слота:
@Component({
tag: 'my-card',
styleUrl: 'my-card.css',
shadow: true
})
export class MyCard {
render() {
return (
<div class="card">
<slot name="header"></slot>
<div class="content">
<slot></slot>
</div>
</div>
);
}
}
В этом примере компонент my-card имеет два слота: один
для заголовка (header), другой для основного содержимого.
При использовании компонента можно вставить произвольный HTML в эти
слоты:
<my-card>
<div slot="header">Card Header</div>
<div>Card Content</div>
</my-card>
Stencil компоненты поддерживают свойства и события, которые можно
использовать для взаимодействия с компонентами. Свойства компонента
определяются с помощью декоратора @Prop, а события — с
помощью @Event.
Пример компонента с свойствами и событиями:
import { Component, Prop, Event, EventEmitter, h } from '@stencil/core';
@Component({
tag: 'my-button',
styleUrl: 'my-button.css',
shadow: true
})
export class MyButton {
@Prop() label: string;
@Event() clicked: EventEmitter;
handleClick() {
this.clicked.emit();
}
render() {
return (
<button onCl ick={() => this.handleClick()}>
{this.label}
</button>
);
}
}
В этом примере компонент my-button принимает свойство
label, которое задает текст на кнопке, и генерирует событие
clicked при нажатии на кнопку. С помощью этого события
другие компоненты или страницы могут отслеживать взаимодействие с
кнопкой.
Stencil автоматически оптимизирует компоненты для максимальной производительности. Это включает в себя:
Кроме того, Stencil предоставляет механизм @Watch для
отслеживания изменений в свойствах компонента и обновления его состояния
только при необходимости, что повышает производительность при работе с
динамическими данными.
После создания компонентов в Stencil их можно собрать в библиотеку и
опубликовать. Для этого Stencil предоставляет команду
npm run build, которая создает компоненты в различных
форматах, включая стандартный ES Modules,
CommonJS и UMD.
Для публикации компонента на npm необходимо выполнить следующие шаги:
package.json с нужной конфигурацией.npm publish для загрузки компонента
на npm.Stencil также поддерживает создание документации и примеров использования для каждого компонента, что помогает пользователям быстро интегрировать компоненты в свои проекты.
Stencil компоненты могут быть использованы с различными популярными фреймворками, такими как React, Vue и Angular. Для этого Stencil автоматически генерирует адаптеры, которые позволяют использовать компоненты как нативные элементы фреймворка.
Пример интеграции компонента в React:
import { defineCustomElements } from 'my-component-library/loader';
defineCustomElements(window);
function App() {
return <my-component></my-component>;
}
Таким образом, компоненты, созданные с помощью Stencil, могут быть использованы не только в чистом HTML, но и в любых современных фреймворках, что значительно расширяет их применимость.
Stencil представляет собой мощный инструмент для создания компонентных библиотек с использованием стандартов веб-компонентов. Он обеспечивает гибкость, производительность и совместимость с различными фреймворками, что делает его идеальным выбором для разработки компонентов, которые должны работать в любых веб-приложениях. С помощью Stencil можно создавать компоненты, которые будут легко поддерживать и расширять, обеспечивая долгосрочную совместимость с различными веб-технологиями.