SkateJS — библиотека для создания веб-компонентов, ориентированная на модульность и переиспользуемость. Одной из ключевых задач при внедрении SkateJS в существующие проекты является интеграция с legacy-кодом, написанным на чистом JavaScript, jQuery или других устаревших фреймворках. Рассмотрим основные подходы и тонкости, обеспечивающие плавное сосуществование новых компонентов с существующей архитектурой.
Для использования SkateJS в старом проекте достаточно подключить
библиотеку через <script>:
<script type="module">
import { define, component, props } from 'skatejs';
</script>
Важно учитывать:
import.define,
что гарантирует их совместимость с нативными веб-компонентами.Компоненты SkateJS можно внедрять в существующую разметку без полной переделки:
import { define, component, props } from 'skatejs';
const LegacyButton = component({
tag: 'legacy-button',
props: {
label: props.string
},
render(elem) {
elem.textContent = this.label;
}
});
define(LegacyButton);
После этого
<legacy-button label="Нажми меня"></legacy-button>
можно вставить в любой участок старой страницы.
Особенности:
props и обновляет DOM.SkateJS использует CustomEvent для передачи событий, что позволяет легко связывать компоненты с legacy-кодом:
elem.addEventListener('click', () => {
const event = new CustomEvent('legacy-action', { detail: { value: 42 } });
elem.dispatchEvent(event);
});
// В legacy-коде
document.querySelector('legacy-button').addEventListener('legacy-action', e => {
console.log(e.detail.value);
});
Рекомендации:
.on()
вместо addEventListener.SkateJS применяет Shadow DOM по умолчанию через свой рендерер, что защищает стили компонента от глобальных CSS. Для интеграции с legacy-проектом доступны два подхода:
import { h, component } from 'skatejs';
const StyledComponent = component({
tag: 'styled-component',
render(elem) {
return <div class="legacy-style">Контент</div>;
}
});
const NonShadow = component({
tag: 'non-shadow',
shadow: false,
render(elem) {
elem.textContent = 'Встроенный компонент';
}
});
SkateJS-компоненты можно использовать совместно с jQuery:
$('legacy-button').on('click', function() {
$(this).trigger('legacy-action', { value: 100 });
});
Особенности взаимодействия:
shadowRoot.querySelector(...).shadow: false при
интеграции с библиотеками, ожидающими обычный DOM.Часто legacy-приложения управляют состоянием через глобальные объекты или события. SkateJS позволяет связывать свойства компонента с внешними данными:
const state = { count: 0 };
const Counter = component({
tag: 'counter-component',
props: {
count: props.number
},
render(elem) {
elem.textContent = `Счёт: ${this.count}`;
}
});
define(Counter);
// Обновление из legacy-кода
setInterval(() => {
state.count += 1;
document.querySelector('counter-component').count = state.count;
}, 1000);
props.При постепенной интеграции важно:
props для
связи с существующими скриптами.Этот подход позволяет внедрять современные веб-компоненты постепенно, без полной переработки существующей кодовой базы, сохраняя стабильность и предсказуемость работы legacy-систем.