Ленивая загрузка (lazy loading) и код-сплиттинг (code splitting) — методы оптимизации веб-приложений, направленные на сокращение времени первоначальной загрузки и уменьшение объёма передаваемого кода. В контексте Lit эти методы позволяют загружать компоненты только при необходимости, снижая нагрузку на сеть и ускоряя рендеринг.
Код-сплиттинг подразумевает разбиение приложения на отдельные модули, которые могут загружаться динамически. Ленивая загрузка — это практика, при которой эти модули подгружаются в момент их использования.
В Lit для ленивой загрузки компонентов используется стандартный
синтаксис Jav * aScript: import(). Динамический импорт
возвращает промис, который разрешается при загрузке модуля.
let lazyComponent;
async function loadComponent() {
if (!lazyComponent) {
const module = await import('./my-lazy-component.js');
lazyComponent = module.MyLazyComponent;
}
return lazyComponent;
}
LitElement упрощает использование динамически импортированных
компонентов через render() и условные выражения:
import { LitElement, html } from 'lit';
class AppRoot extends LitElement {
static properties = {
showLazy: { type: Boolean },
lazyLoaded: { type: Boolean }
};
constructor() {
super();
this.showLazy = false;
this.lazyLoaded = false;
}
async loadLazy() {
const { MyLazyComponent } = await import('./my-lazy-component.js');
this.lazyLoaded = true;
this.lazyComponent = MyLazyComponent;
}
render() {
return html`
<button @click=${() => { this.showLazy = true; this.loadLazy(); }}>
Загрузить компонент
</button>
${this.showLazy && this.lazyLoaded ? html`<${this.lazyComponent}></${this.lazyComponent}>` : ''}
`;
}
}
customElements.define('app-root', AppRoot);
Особенности:
lazyComponent хранит ссылку на динамически загруженный
класс.При использовании сборщиков, таких как Webpack или Vite, динамический импорт автоматически создает отдельные чанки (chunks):
const MyLazyComponent = () => import('./my-lazy-component.js');
my-lazy-component.[hash].js.import().Эти инструменты позволяют:
Lit позволяет использовать асинхронные шаблоны с помощью промисов:
import { until } from 'lit/directives/until.js';
render() {
return html`
${until(
import('./my-lazy-component.js').then(module => html`<${module.MyLazyComponent}></${module.MyLazyComponent}>`),
html`<span>Загрузка...</span>`
)}
`;
}
until позволяет отобразить запасной
шаблон до завершения промиса.В приложениях с маршрутизацией динамический импорт используется для ленивой подгрузки страниц:
const routes = {
'/': () => import('./home-page.js'),
'/about': () => import('./about-page.js')
};
async function navigate(path) {
const module = await routes[path]();
const page = new module.default();
document.body.appendChild(page);
}
Ленивая загрузка и код-сплиттинг позволяют создавать быстрые и масштабируемые приложения на Lit, делая пользовательский интерфейс отзывчивым даже при сложной структуре компонентов и больших объёмах кода.