Slim.js — это лёгкая библиотека для построения веб-компонентов на основе стандартов Web Components. Она позволяет создавать высокопроизводительные, реактивные компоненты с минимальной нагрузкой на DOM. Основной принцип работы Slim.js — декларативное связывание данных и шаблонов через встроенные директивы и реактивные свойства.
Ключевые особенности Slim.js:
Компоненты в Slim.js создаются с помощью функции
Slim.tag, которая регистрирует новый кастомный элемент:
Slim.tag('my-component', class extends Slim {
get template() {
return `
<div>
<h2>{{title}}</h2>
<p>{{description}}</p>
</div>
`;
}
constructor() {
super();
this.title = 'Заголовок';
this.description = 'Описание компонента';
}
});
Разбор кода:
Slim.tag принимает имя тега и класс компонента.template возвращает HTML-шаблон с привязкой
данных через {{}}.Slim.js поддерживает одностороннюю привязку данных из класса в шаблон. Любое изменение значения свойства немедленно отражается в DOM:
this.title = 'Новый заголовок';
Для обработки событий используется стандартный
синтаксис HTML с атрибутами onclick, oninput и
т.д.:
<button oncl ick="this.updateTitle()">Изменить заголовок</button>
Метод внутри класса компонента может изменять свойства:
updateTitle() {
this.title = 'Обновлённый заголовок';
}
Slim.js поддерживает условные конструкции и циклы:
{{#if condition}}...{{/if}} — условное
отображение.{{#each array}}...{{/each}} — итерация по
массивам.Пример условного рендеринга:
get template() {
return `
<div>
{{#if isVisible}}
<p>Этот текст виден</p>
{{/if}}
</div>
`;
}
Итерация по массиву:
get template() {
return `
<ul>
{{#each items}}
<li>{{this}}</li>
{{/each}}
</ul>
`;
}
constructor() {
super();
this.items = ['Элемент 1', 'Элемент 2', 'Элемент 3'];
}
Slim.js предоставляет несколько хуков жизненного цикла, которые позволяют управлять состоянием компонента:
onBeforeCreated() — выполняется перед созданием
компонента.onCreated() — после инициализации и привязки
свойств.onAfterCreated() — после рендеринга DOM.onRemoved() — перед удалением компонента из DOM.Пример использования:
onCreated() {
console.log('Компонент создан', this);
}
Slim.js совместим с любыми веб-страницами без необходимости сборки. Компоненты можно вставлять через обычный HTML:
<my-component></my-component>
Для интеграции с другими библиотеками (например, React или Vue) рекомендуется использовать Slim.js как легковесный слой для веб-компонентов, предоставляя изолированные и реактивные UI-блоки.
Компоненты Slim.js могут взаимодействовать с API через
fetch или любые другие методы асинхронной загрузки
данных:
async loadData() {
const response = await fetch('https://api.example.com/data');
this.items = await response.json();
}
Изменение свойства items автоматически обновит
привязанный шаблон.
Slim.js поддерживает локальные стили через тег
<style> внутри шаблона:
get template() {
return `
<style>
p { color: blue; font-weight: bold; }
</style>
<p>{{description}}</p>
`;
}
Все стили изолированы от глобального CSS, что предотвращает конфликты.
При интеграционном тестировании Slim.js важно проверять:
Для тестирования можно использовать фреймворки вроде Jest или Mocha, создавая тестовые контейнеры:
describe('MyComponent', () => {
let element;
beforeEach(() => {
element = document.createElement('my-component');
document.body.appendChild(element);
});
afterEach(() => {
document.body.removeChild(element);
});
it('должен отображать начальный заголовок', () => {
expect(element.shadowRoot.querySelector('h2').textContent).toBe('Заголовок');
});
it('обновляет DOM при изменении свойства', () => {
element.title = 'Новый заголовок';
expect(element.shadowRoot.querySelector('h2').textContent).toBe('Новый заголовок');
});
});
Такая методика позволяет гарантировать стабильность компонентов и их корректную работу в составе сложных приложений.
<slot> для
гибкой композиции.this.dispatchEvent(new CustomEvent('update', { detail: { value: this.title } }));
Эта архитектура делает Slim.js удобным инструментом для построения модульных и реактивных веб-приложений, где компоненты легко тестировать и интегрировать.