Stencil — это современный фреймворк для создания веб-компонентов. Его основная цель — предоставить разработчикам инструмент для создания повторно используемых, высокоэффективных пользовательских интерфейсов, которые могут работать с любым JavaScript-окружением, включая фреймворки как Angular, React и Vue. Одной из ключевых особенностей Stencil является использование Web Components стандартов, что позволяет интегрировать компоненты в любой проект.
Проект, созданный с помощью Stencil, имеет четко организованную структуру, которая упрощает поддержку и развитие компонентов. Обычно структура выглядит следующим образом:
my-component/
├── src/
│ ├── components/
│ ├── global/
│ ├── index.ts
│ └── style/
├── www/
│ ├── index.html
│ └── assets/
├── stencil.config.ts
└── package.json
В этой папке находятся все исходные файлы приложения. Компоненты и стили лежат в соответствующих подкаталогах.
Эта директория содержит файлы, которые будут скомпилированы и размещены в результирующем проекте.
Это основной конфигурационный файл Stencil, который управляет процессом сборки и настройками проекта.
Файл, который описывает зависимости проекта, команды и скрипты для запуска сборки и разработки.
Компоненты в Stencil представляют собой элементы, реализующие стандарт Web Components. Эти компоненты инкапсулируют логику, разметку и стили, обеспечивая повторное использование и изоляцию от остальной части приложения.
Компонент создается с помощью декоратора @Component(),
который предоставляет информацию о метаданных компонента:
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>;
}
}
Stencil поддерживает два типа свойств для компонентов: Props и States.
Для создания этих свойств используются декораторы:
@Component({ /* параметры компонента */ })
export class MyComponent {
@Prop() name: string;
@State() count: number;
render() {
return (
<div>
<p>Hello, {this.name}</p>
<p>Count: {this.count}</p>
</div>
);
}
}
События можно использовать для отправки сообщений от компонента
родительским элементам. Для этого используется декоратор
@Event():
import { Component, Event, EventEmitter } from '@stencil/core';
@Component({
tag: 'my-button',
})
export class MyButton {
@Event() buttonClick: EventEmitter;
handleClick() {
this.buttonClick.emit('clicked');
}
render() {
return <button onCl ick={() => this.handleClick()}>Click me</button>;
}
}
Stencil поддерживает различные подходы к стилизации компонентов. Основные методы включают:
Stencil поддерживает препроцессоры, такие как Sass и Less, а также позволяет интегрировать сторонние библиотеки стилей.
Stencil поддерживает директивы, которые можно использовать для добавления дополнительной функциональности к компонентам. Директивы могут быть использованы для обработки DOM-элементов и управления состоянием компонента. Примеры включают директивы для асинхронной загрузки контента или для работы с анимациями.
Жизненный цикл компонента включает в себя несколько ключевых методов, таких как:
Эти методы позволяют управлять состоянием компонента и выполнять необходимые действия в нужный момент жизненного цикла.
Файл конфигурации Stencil позволяет настроить множество аспектов сборки проекта. В нем можно указать параметры, такие как:
Пример базовой конфигурации:
import { Config } from '@stencil/core';
export const config: Config = {
namespace: 'my-components',
outputTargets: [
{
type: 'dist',
dir: 'dist',
},
{
type: 'www',
dir: 'www',
serviceWorker: null, // не использовать сервис-воркеры
},
],
};
Stencil предоставляет набор команд для работы с проектом, которые можно запускать через npm или Yarn:
Stencil поддерживает тестирование компонентов с использованием Jest. Для каждого компонента автоматически создается базовая настройка тестов, что позволяет писать юнит-тесты и проверять корректность работы компонентов.
Пример теста для компонента:
import { newSpecPage } from '@stencil/core/testing';
import { MyButton } from './my-button';
describe('my-button', () => {
it('renders the button with correct text', async () => {
const page = await newSpecPage({
components: [MyButton],
html: `<my-button></my-button>`,
});
expect(page.root).toEqualHtml(`
<my-button>
<button>Click me</button>
</my-button>
`);
});
});
Stencil обладает подробной официальной документацией, которая охватывает все аспекты работы с фреймворком, включая создание компонентов, настройку сборки, работу с состоянием и событиями, а также расширенные темы, такие как серверный рендеринг и интеграция с другими фреймворками.
Официальная документация доступна на сайте: https://stenciljs.com/docs. Также полезны такие ресурсы, как GitHub-репозиторий фреймворка, форумы и различные обучающие материалы, которые позволяют быстро освоить Stencil и использовать его в реальных проектах.
Stencil представляет собой мощный инструмент для создания веб-компонентов с возможностью их повторного использования в любых веб-приложениях. Его гибкость и интеграция с другими JavaScript-библиотеками и фреймворками делают его отличным выбором для разработки современных, высокоэффективных пользовательских интерфейсов.