SkateJS — это библиотека для создания веб-компонентов, которая полностью основана на нативных возможностях Custom Elements и Shadow DOM. Vite, в свою очередь, является современным сборщиком и сервером разработки, обеспечивающим мгновенную перезагрузку модулей и оптимизированную сборку. Совмещение SkateJS с Vite позволяет создавать высокопроизводительные компоненты с быстрым откликом при разработке.
Для начала необходимо установить зависимости:
npm install skatejs lit-html
lit-html используется в качестве рендерера для шаблонов
внутри компонентов, хотя SkateJS поддерживает и другие рендереры. После
этого создаётся структура проекта Vite, например:
project/
├─ index.html
├─ src/
│ ├─ main.js
│ └─ components/
│ └─ MyComponent.js
├─ vite.config.js
└─ package.json
Компоненты в SkateJS создаются через функцию define и
объект конфигурации. Простейший пример:
import { define, h } from 'skatejs';
class MyComponent extends HTMLElement {
static get props() {
return {
count: { attribute: true, type: Number }
};
}
render() {
return h('div', {}, `Count: ${this.count}`);
}
}
define('my-component', MyComponent);
Ключевые моменты:
h из SkateJS.При использовании Vite такой компонент автоматически поддерживает модульную структуру ES и горячую перезагрузку при изменениях.
Для подключения компонента в Vite достаточно импортировать его в точке входа проекта:
import './components/MyComponent.js';
document.body.innerHTML = '<my-component count="10"></my-component>';
Vite корректно обрабатывает ES-модули, поэтому import
работает напрямую без дополнительных транспилеров. Это упрощает процесс
разработки и уменьшает накладные расходы на конфигурацию.
SkateJS поддерживает JSX-синтаксис через Babel или TypeScript, что позволяет создавать более сложные структуры компонентов:
/** @jsx h */
import { h, define } from 'skatejs';
class Counter extends HTMLElement {
static get props() {
return {
value: { type: Number, attribute: true }
};
}
render() {
return (
<div>
<p>Value: {this.value}</p>
<button oncl ick={() => this.value++}>Increment</button>
</div>
);
}
}
define('x-counter', Counter);
Для работы с JSX необходимо настроить Vite с плагином для Babel или TypeScript:
// vite.config.js
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue'; // пример для JSX можно использовать аналогичные плагины
export default defineConfig({
esbuild: {
jsxFactory: 'h',
jsxFragment: 'Fragment'
}
});
SkateJS позволяет инкапсулировать стили через Shadow DOM. В Vite стили можно подключать напрямую или через CSS-модули:
import { define, h } from 'skatejs';
import styles from './MyStyledComponent.css';
class MyStyledComponent extends HTMLElement {
render() {
return h('div', { class: styles.container }, 'Styled content');
}
}
define('my-styled-component', MyStyledComponent);
Особенности:
index.html
или в точке входа проекта.Vite поддерживает динамический импорт, что особенно полезно для больших приложений:
const loadComponent = async () => {
const module = await import('./components/LazyComponent.js');
document.body.appendChild(new module.LazyComponent());
};
loadComponent();
Преимущество такой схемы — уменьшение начального бандла и ускорение загрузки страницы.
SkateJS в связке с Vite позволяет:
SkateJS-компоненты можно использовать внутри React, Vue или других фреймворков благодаря стандартам Custom Elements:
// В React
function App() {
return <my-component count={5}></my-component>;
}
Vite обеспечивает корректную работу таких интеграций, автоматически транслируя ES-модули и поддерживая HMR для внешних компонентов.
project/
├─ index.html // точка входа
├─ src/
│ ├─ main.js // импорт компонентов
│ └─ components/
│ ├─ MyComponent.js
│ ├─ MyStyledComponent.js
│ └─ LazyComponent.js
├─ vite.config.js
├─ package.json
└─ node_modules/
Такое сочетание обеспечивает модульность, высокую производительность и простоту разработки при работе с веб-компонентами SkateJS в современном окружении Vite.