😓 Роутинг в SPA — боль
Классика: слушаем click, ставим preventDefault(), делаем history.pushState(), потом ловим popstate и рендерим контент.
Работает, но это куча бойлерплейта и расхождений между состоянием, URL и историей.
❔ Почему так:
History API не создавался под SPA. Он не умеет централизованно управлять всеми типами навигации и не даёт понять, когда переход «завершён», чтобы безопасно менять UI и скролл.
🔤 Нормальное решение — Navigation API (эксперимент, Chrome 102+):
✅ Fallback:
Если window.navigation нет, остаёмся на старом pushState.
📦 Поддержка:
Chromium 102+, Safari (новые версии), Firefox — пока нет.
API экспериментальный, используйте feature-detect.
📎 Официальная спецификация
🐸 Библиотека фронтендера
#hotfix #js
Классика: слушаем click, ставим preventDefault(), делаем history.pushState(), потом ловим popstate и рендерим контент.
Работает, но это куча бойлерплейта и расхождений между состоянием, URL и историей.
History API не создавался под SPA. Он не умеет централизованно управлять всеми типами навигации и не даёт понять, когда переход «завершён», чтобы безопасно менять UI и скролл.
• navigate — единое событие для всех переходов
• event.intercept() — перехват и свой обработчик (загрузили данные, отрисовали, проверили доступ)
• event.scroll() — нативный скролл
• { committed, finished } — когда менять URL и когда переход реально завершён
• entries() и currentEntry — история как нормальные объекты со state
Если window.navigation нет, остаёмся на старом pushState.
if ('navigation' in window) {
navigation.addEventListener('navigate', (event) => {
if (shouldNotIntercept(event)) return;
const url = new URL(event.destination.url);
event.intercept({
async handler() {
renderSkeleton();
const html = await fetchPage(url.pathname);
render(html);
event.scroll();
},
});
});
const { committed, finished } = navigation.navigate('/profile');
committed.then(() => showLoading());
finished.finally(() => hideLoading());
}
📦 Поддержка:
Chromium 102+, Safari (новые версии), Firefox — пока нет.
API экспериментальный, используйте feature-detect.
#hotfix #js
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰5❤3🔥1
JavaScript js reference.pdf
4.1 MB
📘 Справочник по JavaScript
400+ страниц решений на все случаи жизни:
〰️ Как правильно работать с массивами? — 30+ методов с примерами
〰️ Что такое замыкания и зачем они нужны? — объясняем на пальцах
〰️ Почему промисы лучше колбэков? — сравнение с кодом
〰️ Как отловить баг в консоли? — 9 способов debugging
105 глав. От переменных до unit-тестирования. Каждая тема — с примерами кода и пояснениями.
Ставь ❤️, если было полезно
🐸 Библиотека фронтендера
#readme #js
400+ страниц решений на все случаи жизни:
105 глав. От переменных до unit-тестирования. Каждая тема — с примерами кода и пояснениями.
Ставь ❤️, если было полезно
#readme #js
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍2🥰2