В библиотеке Slim.js маршрутизация реализуется через
встроенный механизм Router, который позволяет создавать и
управлять состояниями приложения, реагировать на изменения URL и
динамически подгружать контент. Одной из ключевых возможностей является
использование вложенных маршрутов, что обеспечивает
структурированное построение сложных интерфейсов с несколькими уровнями
навигации.
В Slim.js маршруты определяются с помощью метода route
объекта Router. Вложенные маршруты создаются путем
регистрации дочерних маршрутов внутри родительского. Родительский
маршрут может задавать базовый путь и общую логику отображения, а
дочерние маршруты уточняют путь и добавляют специфический
функционал.
Пример базовой структуры:
import { Router } from 'slim-js';
const router = new Router();
router.route('/users', {
onEnter: () => console.log('Вход в раздел пользователей'),
children: [
{
path: '/:id',
onEnter: (params) => console.log(`Просмотр пользователя ${params.id}`)
},
{
path: '/:id/edit',
onEnter: (params) => console.log(`Редактирование пользователя ${params.id}`)
}
]
});
router.start();
Здесь /users — родительский маршрут, а /:id
и /:id/edit — дочерние. params автоматически
передает значения динамических сегментов пути.
Вложенные маршруты могут содержать динамические параметры, которые
доступны через объект params. Это позволяет создавать
гибкую навигацию без дублирования кода.
Пример обработки параметров:
router.route('/projects', {
children: [
{
path: '/:projectId',
onEnter: (params) => {
console.log(`Проект: ${params.projectId}`);
},
children: [
{
path: '/tasks/:taskId',
onEnter: (params) => {
console.log(`Задача: ${params.taskId} в проекте ${params.projectId}`);
}
}
]
}
]
});
В этом примере вложенные маршруты позволяют одновременно работать с параметрами родительского и дочернего маршрута.
Для оптимизации производительности Slim.js поддерживает ленивую загрузку компонентов в рамках вложенных маршрутов. Вместо загрузки всех компонентов сразу, Slim.js может подгружать их только при входе на конкретный дочерний маршрут.
Пример:
router.route('/dashboard', {
onEnter: () => console.log('Главная панель'),
children: [
{
path: '/analytics',
lazy: () => import('./analyticsComponent.js'),
onEnter: (component) => {
component.render();
}
},
{
path: '/settings',
lazy: () => import('./settingsComponent.js'),
onEnter: (component) => {
component.render();
}
}
]
});
Ключевое преимущество — экономия ресурсов при работе с крупными приложениями и модульное построение интерфейса.
Вложенные маршруты позволяют создавать сложные навигационные сценарии с сохранением состояния родительского маршрута. Например, при переходе к дочернему маршруту родительский компонент может сохранять состояние формы или списка, что обеспечивает непрерывный пользовательский опыт.
Пример:
router.route('/catalog', {
onEnter: () => loadCatalog(),
children: [
{
path: '/category/:categoryId',
onEnter: (params) => loadCategory(params.categoryId),
children: [
{
path: '/item/:itemId',
onEnter: (params) => loadItem(params.itemId)
}
]
}
]
});
При такой организации при переходе к конкретному товару
(/catalog/category/5/item/42) Slim.js сохраняет контекст
категории и каталога.
Для вложенных маршрутов важно предусматривать обработку
несуществующих дочерних путей. Slim.js позволяет задать маршрут
по умолчанию с использованием * или
notFound.
Пример:
router.route('/blog', {
children: [
{
path: '/:postId',
onEnter: (params) => loadPost(params.postId)
},
{
path: '*',
onEnter: () => showNotFound()
}
]
});
Любой путь, не соответствующий /blog/:postId, будет
перенаправлен на функцию showNotFound, что обеспечивает
устойчивость приложения.
Вложенные маршруты в Slim.js являются мощным инструментом для построения модульных интерфейсов с поддержкой динамических параметров, ленивой загрузки и сохранения состояния. При правильной архитектуре они позволяют создавать приложения с высокой структурированностью и гибкой навигацией.