Грамотное именование — основа поддерживаемости кода при работе с турами в интерфейсе. В контексте Shepherd.js важно учитывать, что туры и шаги становятся частью логики приложения, а значит должны быть читаемыми, предсказуемыми и масштабируемыми.
Тур (Tour) представляет собой последовательность шагов,
поэтому его имя должно отражать цель или сценарий использования:
onboardingTour — первичное знакомство пользователяprofileSetupTour — настройка профиляcheckoutGuideTour — процесс оформления заказаКлючевые правила:
mainTour,
testTourКаждый шаг внутри тура может иметь id, который
используется для управления:
tour.addStep({
id: 'enter-email',
text: 'Введите email',
attachTo: { element: '#email', on: 'bottom' }
});
Рекомендации:
enter-email, confirm-password)Примеры:
welcome-messageclick-settingssubmit-formЭкземпляры тура обычно создаются через:
const onboardingT our = new Shepherd.Tour({...});
Рекомендации:
const, так как тур редко
переопределяетсяtour1, t)С ростом количества туров важно организовать код так, чтобы он оставался понятным и легко расширяемым.
Каждый тур рекомендуется выносить в отдельный файл:
/tours
├── onboardingTour.js
├── dashboardTour.js
└── checkoutTour.js
Пример структуры файла:
import Shepherd from 'shepherd.js';
export function createOnboardingTour() {
const tour = new Shepherd.Tour({
defaultStepOptions: {
cancelIcon: { enabled: true },
classes: 'shepherd-theme-default'
}
});
tour.addStep({
id: 'welcome',
text: 'Добро пожаловать!',
attachTo: { element: '.header', on: 'bottom' }
});
return tour;
}
Преимущества:
Создание единой точки управления:
import { createOnboardingTour } from './tours/onboardingTour';
import { createCheckoutTour } from './tours/checkoutTour';
export const tours = {
onboarding: createOnboardingTour(),
checkout: createCheckoutTour()
};
Такой подход позволяет:
При большом количестве шагов важно избегать перегруженности.
Если тур содержит 10+ шагов, полезно разбить их по смыслу:
function addAuthSteps(tour) {
tour.addStep({ id: 'login', ... });
tour.addStep({ id: 'password', ... });
}
function addProfileSteps(tour) {
tour.addStep({ id: 'avatar', ... });
tour.addStep({ id: 'bio', ... });
}
Использование:
addAuthSteps(tour);
addProfileSteps(tour);
Преимущества:
Альтернативный подход — хранить шаги в виде массива:
const steps = [
{
id: 'step-1',
text: 'Шаг 1',
attachTo: { element: '#el1', on: 'bottom' }
},
{
id: 'step-2',
text: 'Шаг 2',
attachTo: { element: '#el2', on: 'right' }
}
];
steps.forEach(step => tour.addStep(step));
Плюсы:
Shepherd активно использует DOM-селекторы (attachTo),
поэтому важно соблюдать единый стиль.
Использовать BEM или аналогичную методологию:
.header__menu.profile__avatarИзбегать привязки к нестабильным селекторам:
.nth-child.dynamic-class-123Плохо:
attachTo: { element: '.btn', on: 'top' }
Хорошо:
attachTo: { element: '.checkout__submit-button', on: 'top' }
Shepherd позволяет добавлять действия через buttons:
buttons: [
{
text: 'Далее',
action: tour.next
}
]
При сложной логике:
buttons: [
{
text: 'Сохранить',
action: () => handleSaveAndNext()
}
]
Рекомендации по именованию функций:
handleNextStephandleFormSubmitgoToDashboardИзбегать:
doStuffclickHandler1Фабричный подход позволяет создавать туры с параметрами:
export function createFeatureTour(featureName) {
const tour = new Shepherd.Tour();
tour.addStep({
id: `${featureName}-intro`,
text: `Обзор функции ${featureName}`
});
return tour;
}
При использовании фреймворков (React, Vue):
Пример:
const [currentTour, setCurrentTour] = useState(null);
Каждый тур — часть UX, поэтому важно документировать:
Пример комментария:
// Тур для новых пользователей.
// Запускается после регистрации.
// Охватывает основные функции панели управления.
Плохо:
tour.addStep({
text: getDynamicTextFromAPI()
});
Лучше:
Повторяющиеся шаги стоит выносить в функции или конфигурации.
Если элемент может отсутствовать:
if (document.querySelector('#optional')) {
tour.addStep({...});
}
/src
/tours
/steps
authSteps.js
profileSteps.js
onboardingTour.js
dashboardTour.js
/services
tourManager.js
tourManager.js:
class TourManager {
constructor() {
this.tours = {};
}
register(name, tour) {
this.tours[name] = tour;
}
start(name) {
this.tours[name]?.start();
}
}
export const tourManager = new TourManager();
Такая организация позволяет масштабировать Shepherd.js от простых onboarding-сценариев до сложных интерактивных систем обучения внутри приложения.