При переходе с крупных JavaScript-фреймворков, таких как React, Vue или Angular, на Slim.js, ключевое отличие заключается в минималистичном подходе к структуре приложения и управлению состоянием. Slim.js не требует обширной архитектуры или сложных систем роутинга и управления зависимостями, что значительно упрощает начальный порог освоения, но требует понимания фундаментальных принципов реактивного обновления DOM и жизненного цикла компонентов.
В Slim.js компоненты определяются через класс с расширением
Slim. Каждый компонент имеет собственный шаблон, методы
жизненного цикла и реактивные свойства.
Пример компонента:
class MyComponent extends Slim {
get template() {
return `<div>Hello, {name}!</div>`;
}
constructor() {
super();
this.name = 'Slim.js';
}
}
customElements.define('my-component', MyComponent);
Ключевые особенности по сравнению с React или Vue:
state, props или
ref.{property}.Slim.js использует несколько стандартных методов жизненного цикла, аналогичных хук-ориентированным фреймворкам:
onBeforeCreated(): вызывается перед созданием
компонента.onCreated(): компонент создан, но DOM ещё не
привязан.onBeforeRender(): вызывается перед рендерингом
шаблона.onAfterRender(): DOM уже обновлён и готов к
взаимодействию.onAttributeChanged(name, oldValue, newValue):
отслеживание изменений атрибутов компонента.Пример использования:
class Counter extends Slim {
get template() {
return `<button oncl ick="{increment}">{count}</button>`;
}
constructor() {
super();
this.count = 0;
}
increment() {
this.count++;
}
onAfterRender() {
console.log('Компонент отрендерен, текущий счёт: ', this.count);
}
}
customElements.define('my-counter', Counter);
Переходя с React или Vue, следует учитывать, что Slim.js не требует
использования useEffect, watchers или
computed. Все свойства автоматически реагируют на
изменения.
Slim.js не навязывает глобальные менеджеры состояния, такие как Redux или Vuex. Для хранения и обмена данными между компонентами можно использовать:
this.dispatchEvent(new CustomEvent('update', { detail: this.count }));
const state = { value: 0 };
Slim.observe(state, 'value', () => console.log('Value changed:', state.value));
В отличие от JSX или шаблонов Vue, Slim.js использует синтаксис
{property} для динамических данных. Поддерживаются:
{methodName}.{{#if condition}} ... {{/if}}.{{#each items}} ... {{/each}}.Пример цикла:
class ListComponent extends Slim {
get template() {
return `
<ul>
{{#each items}}
<li>{this}</li>
{{/each}}
</ul>
`;
}
constructor() {
super();
this.items = ['Slim', 'React', 'Vue'];
}
}
customElements.define('my-list', ListComponent);
Slim.js не содержит встроенного роутера, поэтому при миграции нужно:
Navigo или
Page.js.Пример интеграции с Navigo:
const router = new Navigo('/');
router.on('/home', () => {
document.querySelector('#app').innerHTML = `<home-page></home-page>`;
});
router.resolve();
{methodName} или стандартные
DOM-события, а не addEventListener внутри
render().{{#each}} для реактивного обновления вместо прямого
DOM-манипулирования.Slim.js сочетает легковесность с мощной реактивностью, позволяя постепенно заменять части существующего приложения без полной реорганизации. Понимание жизненного цикла, реактивных свойств и событийной модели становится ключевым фактором успешной миграции.