SkateJS — это библиотека для создания веб-компонентов на основе стандарта Custom Elements. Для интеграции с Rollup необходимо сначала установить SkateJS и необходимые зависимости:
npm install skatejs lit-html
npm install --save-dev rollup @rollup/plugin-node-resolve @rollup/plugin-commonjs rollup-plugin-terser
В rollup.config.js подключаются плагины для корректной
обработки модулей:
import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import { terser } from 'rollup-plugin-terser';
export default {
input: 'src/index.js',
output: {
file: 'dist/bundle.js',
format: 'iife', // можно использовать 'es' для модульного вывода
name: 'MyApp'
},
plugins: [
resolve(),
commonjs(),
terser()
]
};
Ключевой момент: формат iife позволяет
сразу использовать компонент в браузере без дополнительных загрузчиков
модулей.
Компоненты в SkateJS строятся вокруг функции define и
объекта с конфигурацией. Пример простого компонента:
import { define, props, Component } from 'skatejs';
class MyButton extends Component {
static get props() {
return {
label: props.string
};
}
renderCallback() {
return ;
}
}
define('my-button', MyButton);
Особенности структуры компонента:
props — объект с описанием свойств элемента. SkateJS
автоматически отслеживает изменения и перерисовывает компонент.renderCallback() — метод, вызываемый при каждой
отрисовке компонента. Он может возвращать JSX или lit-html
шаблон.define() — регистрирует компонент в DOM по указанному
имени.Rollup обеспечивает сборку всех зависимостей SkateJS и JSX в один
файл. Для работы с JSX или lit-html важно использовать
плагин @rollup/plugin-babel с нужными пресетами:
npm install --save-dev @rollup/plugin-babel @babel/core @babel/preset-env @babel/preset-react
Пример конфигурации Rollup с Babel:
import babel from '@rollup/plugin-babel';
plugins: [
resolve(),
commonjs(),
babel({
babelHelpers: 'bundled',
presets: ['@babel/preset-env', '@babel/preset-react']
}),
terser()
]
Ключевой момент: это позволяет использовать современный JavaScript и JSX-синтаксис внутри компонентов SkateJS.
SkateJS предоставляет встроенные механизмы для управления событиями и методами. Пример компонента с пользовательским событием:
class ClickCounter extends Component {
static get props() {
return { count: props.number };
}
constructor() {
super();
this.count = 0;
}
handleClick = () => {
this.count++;
this.emit('count-changed', { detail: { count: this.count } });
}
renderCallback() {
return ;
}
}
define('click-counter', ClickCounter);
Особенности:
this.emit() используется для генерации пользовательских
событий.props.SkateJS поддерживает несколько жизненных циклов:
connectedCallback() — вызов при добавлении элемента в
DOM.disconnectedCallback() — вызов при удалении элемента из
DOM.updatedCallback(prevProps, prevState) — вызов при
изменении свойств или состояния.Пример использования:
class LifecycleDemo extends Component {
static get props() { return { active: props.boolean }; }
connectedCallback() {
super.connectedCallback();
console.log('Компонент добавлен в DOM');
}
updatedCallback(prevProps) {
if (prevProps.active !== this.active) {
console.log('Свойство active изменилось');
}
}
}
define('lifecycle-demo', LifecycleDemo);
SkateJS поддерживает Shadow DOM и локальные стили. Пример с
использованием lit-html для стилей:
import { html, css } from 'lit-html';
class StyledComponent extends Component {
renderCallback() {
return html`
`;
}
}
define('styled-component', StyledComponent);
Ключевой момент: использование Shadow DOM гарантирует инкапсуляцию стилей, что предотвращает конфликт с глобальными CSS.
Структура проекта с SkateJS и Rollup может быть следующей:
/project
/src
index.js
components/
my-button.js
click-counter.js
/dist
bundle.js
rollup.config.js
package.json
index.js импортируются все компоненты.bundle.js, готовый для
использования в браузере.rollup -c -w для
автоматической пересборки при изменениях.Rollup позволяет минимизировать размер бандла и исключать ненужные зависимости:
terser уменьшает размер JS.external в конфигурации исключает внешние
библиотеки из сборки:export default {
input: 'src/index.js',
output: { file: 'dist/bundle.js', format: 'iife', name: 'App' },
external: ['lit-html'],
plugins: [resolve(), commonjs(), terser()]
};
tree-shaking удаляет неиспользуемый код, что важно при
использовании SkateJS с большим количеством компонентов.