SkateJS — это библиотека для создания веб-компонентов на JavaScript,
основанная на стандартах Custom Elements и Shadow DOM. Она обеспечивает
декларативное описание компонентов через объект Component,
позволяя отделять структуру, поведение и стили. Основная цель —
упрощение организации кода и поддержка масштабируемых приложений.
В SkateJS компоненты создаются с помощью функции
defineComponent, которая принимает имя компонента и объект
конфигурации. Ключевые свойства конфигурации включают
props, render, events и
lifecycle.
import { defineComponent, h } from 'skatejs';
const MyButton = defineComponent({
tag: 'my-button',
props: {
disabled: Boolean
},
render(elem) {
return <button disabled={elem.disabled}>Click me</button>;
}
});
Правильное разделение кода в SkateJS помогает поддерживать чистоту проекта и облегчает тестирование, повторное использование и поддержку. Основные подходы:
h. Не содержит бизнес-логики.Такое разделение помогает избежать смешивания логики и интерфейса, что особенно важно в крупных приложениях с десятками компонентов.
Props в SkateJS определяют входные данные компонента и являются
реактивными. Любое изменение пропса автоматически вызывает повторный
рендер. Для локального состояния используют обычные поля класса или
реактивные свойства через this.props.
import { defineComponent, h } from 'skatejs';
class Counter extends HTMLElement {
static props = {
count: Number
};
constructor() {
super();
this.count = 0;
}
increment() {
this.count++;
this.render();
}
render() {
return <button oncl ick={() => this.increment()}>Count: {this.count}</button>;
}
}
customElements.define('my-counter', Counter);
SkateJS поддерживает стандартные методы жизненного цикла:
connectedCallback — выполняется при подключении
элемента к DOM.disconnectedCallback — при удалении компонента.attributeChangedCallback — при изменении
атрибутов.render — используется для повторного обновления
интерфейса при изменении состояния или пропсов.Разделение кода по методам жизненного цикла позволяет локализовать логику и не смешивать обработку данных с рендером.
SkateJS поддерживает Shadow DOM, что позволяет инкапсулировать стили и HTML. Для разделения шаблонов и логики удобно использовать отдельные файлы:
// counterTemplate.js
import { h } from 'skatejs';
export function counterTemplate(count, onClick) {
return <button oncl ick={onClick}>Count: {count}</button>;
}
// Counter.js
import { defineComponent } from 'skatejs';
import { counterTemplate } from './counterTemplate.js';
const Counter = defineComponent({
tag: 'my-counter',
props: {
count: Number
},
render(elem) {
return counterTemplate(elem.count, () => elem.count++);
}
});
Такой подход позволяет изменять визуальную часть без вмешательства в бизнес-логику и повторно использовать шаблоны в разных компонентах.
my-button.js).utils или
services, чтобы не дублировать код.SkateJS позволяет привязывать обработчики через JSX или через события Custom Event. Рекомендуется отделять обработку события от интерфейса:
function handleClick(event) {
console.log('Button clicked', event.target);
}
const MyButton = defineComponent({
tag: 'my-button',
render(elem) {
return <button oncl ick={handleClick}>Click me</button>;
}
});
При более сложной логике обработчик лучше вынести в отдельный модуль, чтобы его можно было тестировать независимо.
Четкое разделение кода облегчает написание unit-тестов:
Пример структуры:
/components
/counter
Counter.js
counterTemplate.js
counter.css
Counter.test.js
Такой подход обеспечивает предсказуемость, повторное использование и легкость поддержки кода при росте проекта.
Такое разделение кода позволяет строить масштабируемые, читаемые и тестируемые веб-компоненты с использованием SkateJS.