SkateJS — это современная библиотека для создания Web Components на чистом JavaScript, обеспечивающая реактивность, лёгкую интеграцию с существующими проектами и поддержку стандартов Web Components. Основой любого проекта на SkateJS является правильная организация файлов и компонентов, что позволяет масштабировать код и упрощает поддержку.
Типичная структура проекта на SkateJS может выглядеть следующим образом:
project-root/
│
├─ src/
│ ├─ components/
│ │ ├─ my-button/
│ │ │ ├─ index.js
│ │ │ ├─ my-button.js
│ │ │ └─ my-button.css
│ │ ├─ my-modal/
│ │ │ ├─ index.js
│ │ │ ├─ my-modal.js
│ │ │ └─ my-modal.css
│ ├─ utils/
│ │ └─ helpers.js
│ └─ app.js
│
├─ public/
│ └─ index.html
│
├─ package.json
└─ webpack.config.js
Ключевые моменты:
src/components/ — каталог для всех
компонентов. Каждый компонент хранится в отдельной папке, содержащей
основной JS-файл, CSS и индексный файл для экспорта.src/utils/ — вспомогательные функции и
утилиты, используемые компонентами.public/ — статические файлы, включая
HTML и изображения.app.js — точка входа для всего
приложения, где подключаются компоненты и настраивается логика
приложения.Каждый компонент в SkateJS создаётся через функцию
skate, которая принимает объект конфигурации с описанием
поведения компонента. Структурно компонент состоит из нескольких
частей:
Определение класса компонента Создаётся класс,
наследующийся от HTMLElement, или используется фабрика
SkateJS для создания элемента:
import { skate } from 'skatejs';
skate('my-button', {
props: {
label: String
},
render(elem) {
elem.textContent = elem.label || 'Default';
}
});Стилизация компонента Для поддержки инкапсуляции рекомендуется использовать Shadow DOM и подключать CSS напрямую к компоненту:
const style = document.createElement('style');
style.textContent = `
button {
background-color: #007bff;
color: white;
border: none;
padding: 10px 20px;
border-radius: 4px;
cursor: pointer;
}
button:hover {
background-color: #0056b3;
}
`;
elem.shadowRoot.appendChild(style);Индексация и экспорт Для упрощения импорта компонентов используется индексный файл:
import './my-button';
export * from './my-button';SkateJS поддерживает реактивные свойства и наблюдатели, что позволяет разделять логику и представление компонента. Например, можно определить реактивное свойство и функцию обновления DOM при его изменении:
skate('my-counter', {
props: {
count: Number
},
updated(elem) {
elem.textContent = `Счётчик: ${elem.count}`;
}
});
Это обеспечивает чистый код и упрощает тестирование компонентов.
В отдельной папке utils/ рекомендуется хранить функции,
которые используются в нескольких компонентах. Например, форматирование
даты, работа с API или обработка событий. Это позволяет избежать
дублирования кода и делает проект более модульным.
// src/utils/helpers.js
export function formatDate(date) {
return new Intl.DateTimeFormat('ru-RU').format(date);
}
Компоненты могут импортировать эти функции и использовать их в
методах render или updated.
Для сборки проекта обычно используют Webpack, Rollup или Vite. Точка
входа (app.js) подключает все компоненты:
import './components/my-button';
import './components/my-modal';
document.body.appendChild(document.createElement('my-button'));
Webpack конфигурируется с поддержкой ES-модулей и CSS, чтобы компоненты могли быть импортированы как отдельные модули. Это обеспечивает совместимость с любыми современными браузерами и облегчает масштабирование проекта.
Правильная структура проекта позволяет:
Организация кода в папки по типу «components», «utils», «public» и точка входа с импортами всех компонентов является стандартной практикой, позволяющей эффективно управлять проектом на SkateJS.