Driver.js — это мощная библиотека для создания интерактивных пользовательских туров в веб-приложениях. Одной из ключевых особенностей является возможность ленивой загрузки шагов туров, что позволяет оптимизировать производительность, уменьшить время инициализации и динамически формировать шаги в зависимости от состояния приложения.
Ленивая загрузка (lazy loading) подразумевает, что шаги тура создаются или загружаются только в момент необходимости, а не при инициализации всей последовательности. Это особенно актуально для крупных интерфейсов с множеством элементов, некоторые из которых могут быть добавлены динамически (через AJAX, React/Vue компоненты или при прокрутке страницы).
В классическом подходе массив steps передаётся сразу при
создании объекта Driver:
const driver = new Driver({
steps: [
{
element: '#button1',
popover: {
title: 'Кнопка 1',
description: 'Описание кнопки 1'
}
},
{
element: '#button2',
popover: {
title: 'Кнопка 2',
description: 'Описание кнопки 2'
}
}
]
});
При ленивой загрузке массив шагов формируется по мере прохождения тура, что снижает нагрузку на браузер и позволяет учитывать текущие условия приложения.
Вместо статического массива можно использовать функцию, которая возвращает шаги динамически:
const driver = new Driver();
async function getStep(index) {
const steps = [
{
element: '#button1',
popover: { title: 'Кнопка 1', description: 'Описание кнопки 1' }
},
{
element: '#button2',
popover: { title: 'Кнопка 2', description: 'Описание кнопки 2' }
},
{
element: '#dynamicElement',
popover: { title: 'Динамический элемент', description: 'Появляется позже' }
}
];
return steps[index];
}
async function startTour() {
let index = 0;
driver.start(await getStep(index));
driver.on('next', async () => {
index++;
const step = await getStep(index);
if (step) {
driver.highlight(step.element);
driver.moveNext();
} else {
driver.reset();
}
});
}
startTour();
Ключевой момент: шаги не создаются заранее. Они подгружаются и отображаются только при переходе к следующему элементу.
Ленивая загрузка особенно удобна при интеграции с внешними API. Например, если шаги зависят от ответа сервера:
async function getStepFromAPI(index) {
const response = await fetch(`/api/tour-step/${index}`);
if (!response.ok) return null;
const data = await response.json();
return {
element: data.selector,
popover: {
title: data.title,
description: data.description
}
};
}
let currentIndex = 0;
driver.start(await getStepFromAPI(currentIndex));
driver.on('next', async () => {
currentIndex++;
const step = await getStepFromAPI(currentIndex);
if (step) driver.highlight(step.element);
else driver.reset();
});
Это позволяет создавать туры, которые адаптируются под пользователя, показывая только релевантные шаги.
При ленивой загрузке легко реализовать условное отображение шагов. Например, если определённый элемент отсутствует на странице, шаг пропускается:
async function getStepConditional(index) {
const stepCandidates = [
{ element: '#feature1', title: 'Фича 1', description: 'Описание 1' },
{ element: '#feature2', title: 'Фича 2', description: 'Описание 2' }
];
for (let i = index; i < stepCandidates.length; i++) {
const el = document.querySelector(stepCandidates[i].element);
if (el) return stepCandidates[i];
}
return null; // больше шагов нет
}
Такой подход предотвращает ошибки и исключает попытки подсветить несуществующие элементы.
Для динамических туров важно корректно управлять состоянием текущего шага. Driver.js предоставляет события:
next — переход к следующему шагу.previous — возврат к предыдущему.reset — завершение тура.highlighted — элемент подсвечен.Комбинация этих событий с ленивой загрузкой позволяет строить сложные сценарии:
driver.on('next', async () => {
const step = await getStepDynamic(driver.getCurrentStepIndex() + 1);
if (step) driver.highlight(step.element);
else driver.reset();
});
next и previous для
управления навигацией.Ленивая загрузка делает Driver.js универсальным инструментом для динамических и больших интерфейсов, позволяя создавать адаптивные туры без потери производительности.