Для использования Navigo в приложении на Svelte сначала необходимо установить библиотеку через npm:
npm install navigo
Затем в нужном компоненте импортируется класс
Navigo:
import Navigo from 'navigo';
Создание экземпляра роутера обычно выполняется в основном файле
приложения, например, App.svelte:
const router = new Navigo('/', { hash: true });
Параметр '/' задаёт базовый URL, а
hash: true позволяет использовать хеш-маршрутизацию, что
удобно для SPA без настройки серверной части.
Маршруты задаются с помощью метода .on(). Для Svelte это
чаще всего связано с отображением разных компонентов в зависимости от
URL:
import Home from './routes/Home.svelte';
import About from './routes/About.svelte';
import Contact from './routes/Contact.svelte';
router
.on({
'/': () => currentComponent = Home,
'/about': () => currentComponent = About,
'/contact': () => currentComponent = Contact
})
.resolve();
Здесь currentComponent — это реактивная переменная
Svelte, которая определяет, какой компонент будет отображён:
<script>
import { onMount } from 'svelte';
import Navigo from 'navigo';
import Home from './routes/Home.svelte';
import About from './routes/About.svelte';
import Contact from './routes/Contact.svelte';
let currentComponent = Home;
const router = new Navigo('/', { hash: true });
onMount(() => {
router
.on({
'/': () => currentComponent = Home,
'/about': () => currentComponent = About,
'/contact': () => currentComponent = Contact
})
.resolve();
});
</script>
<svelte:component this={currentComponent} />
Navigo поддерживает динамические сегменты в URL, что позволяет передавать параметры:
router.on('/profile/:id', ({ data }) => {
currentComponent = Profile;
userId = data.id;
});
В компоненте Profile.svelte можно использовать
переданный параметр через реактивную переменную userId:
<script>
export let userId;
</script>
<h1>Профиль пользователя {userId}</h1>
Для изменения маршрута без перезагрузки страницы используется метод
.navigate():
router.navigate('/about');
Это позволяет создавать кнопки или ссылки, которые управляют отображением компонентов:
<button on:click={() => router.navigate('/')}>Главная</button>
<button on:click={() => router.navigate('/contact')}>Контакты</button>
hash: true) –
проще, не требует серверной конфигурации, URL выглядит как
/#/about.hash: false) – чистый URL
без хеша, например /about, но требует настройки сервера для
корректного ответа на прямые переходы.Выбор зависит от структуры приложения и серверной поддержки.
Navigo позволяет определять вложенные маршруты с использованием объектов:
router.on({
'/dashboard': () => currentComponent = Dashboard,
'/dashboard/settings': () => currentComponent = Settings
});
Можно также использовать функцию resolve() после
изменения маршрутов для синхронизации:
router.updatePageLinks();
router.resolve();
Метод updatePageLinks() автоматически связывает все
<a href> внутри приложения с Navigo.
Navigo не обрабатывает query-параметры автоматически, но их можно получить из URL:
router.on('/search', () => {
const params = new URLSearchParams(window.location.search);
const query = params.get('q');
currentComponent = Search;
searchQuery = query;
});
В компоненте Search.svelte:
<script>
export let searchQuery;
</script>
<h2>Результаты поиска по: {searchQuery}</h2>
Для оптимизации можно использовать динамический импорт:
router.on('/about', async () => {
const module = await import('./routes/About.svelte');
currentComponent = module.default;
});
Это позволяет создавать ленивую загрузку компонентов, уменьшая начальный размер бандла.
Navigo легко сочетается с Svelte stores для глобального состояния:
import { writable } from 'svelte/store';
export const currentRoute = writable('/');
В роутере:
router.on({
'/': () => currentRoute.set('/'),
'/about': () => currentRoute.set('/about')
});
В компоненте:
<script>
import { currentRoute } from './stores.js';
</script>
{#if $currentRoute === '/about'}
<About />
{:else}
<Home />
{/if}
Это создаёт реактивную связь между маршрутом и состоянием приложения, что удобно для сложных SPA.
Чтобы обрабатывать неизвестные маршруты, используется метод
.notFound():
import NotFound from './routes/NotFound.svelte';
router.notFound(() => currentComponent = NotFound);
Любой URL, не соответствующий определённым маршрутам, автоматически направит на компонент ошибки.
Использование Navigo в сочетании с Svelte позволяет:
Эта комбинация обеспечивает простую и гибкую архитектуру маршрутизации для любых проектов на Svelte.