Slim.js — это лёгкая библиотека для создания веб-компонентов, построенная на основе стандарта Custom Elements. Она предоставляет декларативный синтаксис для связывания данных с DOM и упрощает создание повторно используемых компонентов. Центральная концепция Slim.js — объединение реактивности и веб-компонентов без лишнего «шумного» кода.
Компоненты в Slim.js создаются через расширение базового класса
Slim и определение шаблона через строку HTML.
class MyComponent extends Slim {
get template() {
return `Hello, ${this.name}!`;
}
constructor() {
super();
this.name = 'World';
}
}
customElements.define('my-component', MyComponent);
Здесь ключевым моментом является использование свойств класса для реактивного обновления DOM. Любое изменение свойства автоматически отражается в шаблоне.
Slim.js использует внутренний механизм слежения за изменениями свойств объекта. Основные принципы реактивности:
this.
${this.name}
Здесь {{name}} связывает значение инпута с внутренним
состоянием компонента. Изменение инпута автоматически обновляет свойство
name, и, следовательно, текстовый блок
.
Шаблоны в Slim.js строятся с использованием ES6-шаблонных
строк. Любой выражение в ${} вычисляется
динамически при обновлении свойств.
Поддерживаются следующие виды привязки:
if
и unless:
Содержимое отображается только если show = true
Альтернативное содержимое
each:
- ${item}
Эта конструкция автоматически обновляет DOM при изменении массива
items.
Slim.js позволяет легко связывать DOM-события с методами компонента:
${this.counter}
Метод increment изменяет свойство counter,
что автоматически отражается на DOM. Поддерживаются стандартные события
браузера, а также кастомные события:
this.dispatchEvent(new CustomEvent('update', { detail: { value: this.counter } }));
Slim.js реализует стандартные хуки жизненного цикла Web Components с некоторыми расширениями:
onBeforeCreated() — выполняется до инициализации
компонента.onCreated() — после создания экземпляра, до
рендеринга.onAfterCreated() — после первичной отрисовки DOM.onRemoved() — вызывается при удалении компонента из
DOM.Эти методы позволяют контролировать инициализацию данных, привязку событий и очистку ресурсов.
Slim.js поддерживает как глобальные, так и локальные стили. Для локальных стилей используется Shadow DOM:
class StyledComponent extends Slim {
get template() {
return `
Красный текст
`;
}
}
customElements.define('styled-component', StyledComponent);
Локальные стили применяются только к данному компоненту и не затрагивают остальной DOM.
Slim.js легко интегрируется с внешними библиотеками и фреймворками благодаря простому API и стандарту Custom Elements. Можно использовать сторонние компоненты внутри Slim-шаблонов:
Также поддерживаются динамические загрузки данных через
fetch и реактивное обновление интерфейса без сложного
состояния.
Slim.js минимизирует количество обновлений DOM за счёт умного сравнения значений. Если свойство не изменилось, перерисовка не происходит. В сочетании с легковесной реактивной системой это делает библиотеку особенно подходящей для больших приложений с множеством компонентов.
Для массивов предусмотрены оптимизированные операции: добавление, удаление и перестановка элементов обновляет только необходимые DOM-узлы.
Одной из ключевых особенностей Slim.js является поддержка плюрализации — правильного отображения множественных форм слов в зависимости от числовых значений.
Пример использования для русского языка:
${this.items.length} ${this.pluralize('элемент', 'элемента', 'элементов', this.items.length)}
Метод pluralize принимает:
Реализованная логика учитывает правила русского языка и позволяет автоматически изменять формы слов в интерфейсе, избегая ошибок при динамическом изменении массивов данных.
Преимущество Slim.js в этом контексте заключается в том, что плюрализация интегрирована с реактивной системой. Изменение количества элементов в массиве мгновенно корректирует текстовые представления, обеспечивая правильное склонение слов в пользовательском интерфейсе без дополнительной логики.