Один из вариантов - фреймворки(angular к примеру).
Как я сделал для одного сайта - сначала писался просто сайт, обычный php сайт, потом захотелось осуществлять переходы без перезагрузки и сделал так:
Если в браузере есть поддержка history api, то загружаем динамически, то есть просто ajax запрос на ту страницу, на которую ведет ссылка(с preventDefault(), чтоб переход не осуществлялся , а происходило все без перезагрузки), забираем оттуда данные и меняем нужный блок на нужные данные(в моем случае - основной блок и заголовок) и все, сайт работает как с JS, так и без, как в старых , так и в новых браузерах.
а если history api нет, то обычная загрузка(лень было возиться с location.hash)
И напоследок -
html5doctor.com/history-api - там же и есть примеры работы