@budarin/use-route 1.3.0 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/README.md +15 -13
- package/demo/package.json +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,12 @@
|
|
|
5
5
|
Формат основан на [Keep a Changelog](https://keepachangelog.com/ru/1.1.0/),
|
|
6
6
|
версионирование — [Semantic Versioning](https://semver.org/lang/ru/).
|
|
7
7
|
|
|
8
|
+
## [1.3.1] - 2025-01-30
|
|
9
|
+
|
|
10
|
+
### Документация
|
|
11
|
+
|
|
12
|
+
Внесены не значимые правки в документацию.
|
|
13
|
+
|
|
8
14
|
## [1.3.0] - 2025-01-30
|
|
9
15
|
|
|
10
16
|
### Изменено
|
package/README.md
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
**Минимум кода. Максимум SPA-навигации.**
|
|
4
4
|
|
|
5
|
-
Инфраструктурный хук для React. **Требует Navigation API и URLPattern** — работает только в браузерах и средах, где они есть (см. таблицу версий).
|
|
5
|
+
Инфраструктурный хук для React. **Требует Navigation API и URLPattern** — работает только в браузерах и средах, где они есть (см. таблицу версий). Без провайдеров, без контекста, без бизнес-логики.
|
|
6
6
|
|
|
7
7
|
**Сферы применения:**
|
|
8
8
|
|
|
9
|
-
- **Чистая архитектура** — загрузка данных в use cases и сервисах, не в роутере; хук даёт только состояние маршрута и навигацию, без loaders и встроенной загрузки
|
|
9
|
+
- **Чистая архитектура** — загрузка данных в use cases и сервисах, не в роутере; хук даёт только состояние маршрута и навигацию, без loaders и встроенной загрузки данных, без бизнес-логики.
|
|
10
10
|
- **Динамическое дерево компонентов** — что рендерить определяется в рантайме по URL (`pathname`, `params`, `matched`), а не статичным деревом маршрутов. Подходит, когда маршруты зависят от ролей, фич-флагов, CMS или конфига с бэка.
|
|
11
11
|
- **Иерархия URL без вложенных роутов** — плоская, графовая или условная структура путей; один паттерн (или PathMatcher) и проверка по `params` вместо вложенных `<Route>`.
|
|
12
12
|
- **SPA по подпути** — приложение располагается не в корне домена, а по подпути (например `/app/`); глобальный `base` в конфиге и опция `base` в `navigate`/`replace` для переходов «вне» этого пути.
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
[](https://bundlephobia.com/result?p=@budarin/use-route)
|
|
22
22
|
[](https://github.com/budarin/use-route)
|
|
23
23
|
|
|
24
|
-
**Живое демо:** запуск в браузере без
|
|
24
|
+
**Живое демо:** запуск в браузере без установки.
|
|
25
25
|
|
|
26
26
|
- [Open in StackBlitz](https://stackblitz.com/github/budarin/use-route/tree/master/demo)
|
|
27
27
|
- [Open in CodeSandbox](https://codesandbox.io/p/sandbox/github/budarin/use-route/tree/master/demo)
|
|
@@ -30,13 +30,12 @@
|
|
|
30
30
|
|
|
31
31
|
- ✅ **Динамическое дерево** — маршрутизация в рантайме по pathname/params, без статичного route tree
|
|
32
32
|
- ✅ **Динамическая история** — при каждом `navigate`/`replace` выбирается `push` или `replace`
|
|
33
|
-
- ✅ **Navigation API** — `navigation.navigate()`, `back()`, `forward()`, `traverseTo()
|
|
34
|
-
- ✅ **URLPattern** для парсинга `:params`
|
|
33
|
+
- ✅ **Navigation API** — `navigation.navigate()`, `back()`, `forward()`, `traverseTo()`
|
|
34
|
+
- ✅ **URLPattern** для парсинга `:params`
|
|
35
35
|
- ✅ `useSyncExternalStore` — concurrent-safe, SSR-ready
|
|
36
36
|
- ✅ `canGoBack(n)`, `canGoForward(n)` — точная проверка по истории
|
|
37
37
|
- ✅ **LRU кэш URL** с настраиваемым лимитом (по умолчанию 50)
|
|
38
38
|
- ✅ **O(1) поиск** `historyIndex` через Map
|
|
39
|
-
- ✅ **Только актуальные браузеры и Node.js** (Navigation API + URLPattern), без fallback
|
|
40
39
|
- ✅ **0 провайдеров** — просто `useRoute()`
|
|
41
40
|
- ✅ **~4 kB** gzipped (исходный код; с минификацией в бандле меньше)
|
|
42
41
|
|
|
@@ -47,7 +46,7 @@
|
|
|
47
46
|
- **Нужно декларативное дерево маршрутов** — хук не предоставляет `<Route>` / `<Routes>`; что рендерить, вы решаете в коде по `pathname`/`params`. Если важна именно декларативная вложенная структура маршрутов — используйте один из перечисленных роутеров.
|
|
48
47
|
- **Нужны встроенные guards, redirects, lazy-роуты** — этого в пакете нет; реализуется в приложении поверх хука.
|
|
49
48
|
|
|
50
|
-
В остальных случаях (современные браузеры, чистая архитектура, динамические
|
|
49
|
+
В остальных случаях (современные браузеры, чистая архитектура, динамические маршруты) пакет подходит.
|
|
51
50
|
|
|
52
51
|
## 🚀 Быстрый старт
|
|
53
52
|
|
|
@@ -100,7 +99,9 @@ function App() {
|
|
|
100
99
|
**Параметры:**
|
|
101
100
|
|
|
102
101
|
- **`pattern`** (опционально) — строка-паттерн (URLPattern) или PathMatcher для парсинга `params` и `matched`.
|
|
103
|
-
- **`options`** (опционально)
|
|
102
|
+
- **`options`** (опционально)
|
|
103
|
+
|
|
104
|
+
**`section`**: путь раздела под глобальным base (например `/dashboard`). `navigate(to)` по умолчанию добавляет к путям полный префикс (base + section). Комбинируется с глобальным `base` из `configureRouter`, не заменяет его. В компонентах раздела вызывайте `useRoute({ section: '/dashboard' })` и работайте с путями относительно раздела.
|
|
104
105
|
|
|
105
106
|
**Возвращает:**
|
|
106
107
|
|
|
@@ -180,7 +181,7 @@ configureRouter({
|
|
|
180
181
|
|
|
181
182
|
**`initialLocation`** — при SSR (нет `window`) хук не знает URL запроса. Задайте `initialLocation: request.url` (или полный URL страницы) один раз перед рендером запроса — тогда `pathname` и `searchParams` будут соответствовать запросу. На клиенте не используется. **По умолчанию задавать не нужно:** если на SSR `initialLocation` не задан, используется `'/'` (pathname и searchParams для корня).
|
|
182
183
|
|
|
183
|
-
|
|
184
|
+
**`logger`** тип `Logger` — объект с методами `trace`, `debug`, `info`, `warn`, `error` (как у `console`). Уровни: `LoggerLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error'`. Если не передан — используется `console`.
|
|
184
185
|
|
|
185
186
|
**`pattern` (опционально):** строка-шаблон пути (нативный **URLPattern**) или функция **PathMatcher**. См. ниже.
|
|
186
187
|
|
|
@@ -403,7 +404,7 @@ function UserPostsExample() {
|
|
|
403
404
|
|
|
404
405
|
### 8. Глобальный base (приложение по подпути, не в корне домена)
|
|
405
406
|
|
|
406
|
-
Когда приложение располагается **не в корне домена**, а по подпути (например `https://example.com/app/` — все маршруты под `/app`), задайте в конфиге `base: '/app'`. Тогда `
|
|
407
|
+
Когда приложение располагается **не в корне домена**, а по подпути (например `https://example.com/app/` — все маршруты под `/app`), задайте в конфиге `base: '/app'`. Тогда `navigate(to)` добавляет base к относительным путям. Для одноразового перехода «вне» этого пути (например на `/login`) используйте опцию `base` в `navigate` или `replace`: `navigate('/login', { base: '' })`.
|
|
407
408
|
|
|
408
409
|
```tsx
|
|
409
410
|
import { useRoute, configureRouter } from '@budarin/use-route';
|
|
@@ -434,7 +435,9 @@ function AppUnderBase() {
|
|
|
434
435
|
|
|
435
436
|
### 9. Section в хуке (options.section)
|
|
436
437
|
|
|
437
|
-
Когда у приложения несколько разделов по своим подпутям (`/dashboard`, `/admin`, `/auth`), в компонентах раздела задайте **section**: вызовите `useRoute({ section: '/dashboard' })`. Тогда `
|
|
438
|
+
Когда у приложения несколько разделов по своим подпутям (`/dashboard`, `/admin`, `/auth`), в компонентах раздела задайте **section**: вызовите `useRoute({ section: '/dashboard' })`. Тогда `navigate(to)` по умолчанию добавляет полный префикс (base + section). <br />
|
|
439
|
+
Переход в корень приложения (без секции): `navigate('/', { section: '' })`. <br />
|
|
440
|
+
Переход «вне» приложения: `navigate('/login', { base: '' })`.
|
|
438
441
|
|
|
439
442
|
```tsx
|
|
440
443
|
import { useRoute } from '@budarin/use-route';
|
|
@@ -577,11 +580,10 @@ import 'urlpattern-polyfill';
|
|
|
577
580
|
| Navigation API | 102+ | 109+ | 16.4+ | — |
|
|
578
581
|
| URLPattern | 110+ | 115+ | 16.4+ | 23.8+ |
|
|
579
582
|
|
|
580
|
-
Для same-document навигации (без перезагрузки) хук перехватывает событие `navigate` и вызывает `event.intercept()`. Fallback на среды без Navigation API или URLPattern нет.
|
|
581
583
|
|
|
582
584
|
## 🎛 Под капотом
|
|
583
585
|
|
|
584
|
-
- **Navigation API:** подписка на события `navigate`, `currententrychange`; для same-origin навигации — перехват `navigate` и вызов `event.intercept()`
|
|
586
|
+
- **Navigation API:** подписка на события `navigate`, `currententrychange`; для same-origin навигации — перехват `navigate` и вызов `event.intercept()`
|
|
585
587
|
- `useSyncExternalStore` на navigation события
|
|
586
588
|
- LRU кэш parsed URL (настраиваемый лимит)
|
|
587
589
|
- Map для O(1) поиска `historyIndex`
|
package/demo/package.json
CHANGED