Ленивая загрузка компонентов — подход, позволяющий загружать и инициализировать части интерфейса только по необходимости. В Slim.js это особенно актуально при создании крупных приложений с множеством компонентов, где экономия ресурсов и ускорение начальной загрузки имеют критическое значение.
Slim.js работает на основе custom elements, где
каждый компонент представляет собой отдельный класс, наследующийся от
Slim. При стандартной загрузке все компоненты подключаются
сразу, что может замедлять время отображения страницы. Ленивая загрузка
позволяет:
Для ленивой загрузки создаётся отдельный файл компонента, например
UserCard.js:
import { Slim } from 'slim-js';
export default class UserCard extends Slim {
get template() {
return `
<div class="user-card">
<h2>{{name}}</h2>
<p>{{email}}</p>
</div>
`;
}
onBeforeCreated() {
this.name = '';
this.email = '';
}
onAfterCreated() {
fetch('/api/user/1')
.then(res => res.json())
.then(data => {
this.name = data.name;
this.email = data.email;
});
}
}
Компонент не регистрируется автоматически при подключении скрипта. Регистрация выполняется динамически в момент, когда требуется его отображение.
Для загрузки компонента только при необходимости используется динамический импорт:
function loadUserCard() {
import('./UserCard.js').then(module => {
customElements.define('user-card', module.default);
const userCard = document.createElement('user-card');
document.body.appendChild(userCard);
});
}
import() возвращает промис, что позволяет выполнять
асинхронную загрузку без блокировки основного потока.customElements.define.Если необходимо загружать несколько компонентов по мере прокрутки или действий пользователя, удобно создать менеджер ленивой загрузки:
const lazyComponents = {
'user-card': './UserCard.js',
'product-item': './ProductItem.js'
};
function loadComponent(tagName) {
if (!customElements.get(tagName) && lazyComponents[tagName]) {
return import(lazyComponents[tagName]).then(module => {
customElements.define(tagName, module.default);
});
}
return Promise.resolve();
}
Использование:
document.querySelector('#load-user').addEventListener('click', () => {
loadComponent('user-card').then(() => {
const userCard = document.createElement('user-card');
document.body.appendChild(userCard);
});
});
Для компонентов, которые появляются на экране при прокрутке, оптимально применять IntersectionObserver:
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const tag = entry.target.dataset.tag;
loadComponent(tag).then(() => {
const el = document.createElement(tag);
entry.target.replaceWith(el);
});
observer.unobserve(entry.target);
}
});
});
document.querySelectorAll('.lazy').forEach(el => observer.observe(el));
В HTML:
<div class="lazy" data-tag="user-card"></div>
Преимущества этого подхода:
При ленивой загрузке важно учитывать, что состояние компонента может зависеть от внешних данных. Рекомендуется:
Пример:
let userId = 1;
function showUserCard() {
loadComponent('user-card').then(() => {
const userCard = document.createElement('user-card');
userCard.userId = userId;
document.body.appendChild(userCard);
});
}
Ленивая загрузка в Slim.js позволяет управлять загрузкой интерфейса на уровне компонентов, делая приложения более быстрыми, отзывчивыми и эффективными по использованию ресурсов.