О каком подходе вы говорите? Тут же всё просто: перехватываем события с определенных ссылок и отменяем действие по умолчанию, делегируем обработку URL роутеру, который в зависимости от маршрута подгружает данные и обновляет связанные с ними view. Так же роутер должен «висеть» на событии popstate для обработки back/forward.
Если прям совсем просто, то так:
codeo.me/5rx