Всё оказалось проще чем я думал. Просто надо было прикрепить replaceState к событию прокрутки и немного подтроттлить его:
let scrollE = () => {
scrollP = window.scrollY;;
history.replaceState({name: cp(), scroll: scrollP, path: window.location.pathname},"",window.location.pathname);
}
let throttle = (callee, timeout) => {
let timer = null;
return function perform(...arg){
if(timer) return;
timer = setTimeout(() => {
callee(...arg);
timer = null;
}, timeout);
}
}
let scrollET = throttle(scrollE, 100);
window.addEventListener("scroll", scrollET);
window.addEventListener("popstate", async(e) => {
if (e.state) {
switch(e.state.name){
case 'relax':
relaxWork("y");
break;
case 'main':
await res("y");
break;
default:
await contentF(e.state.name, "y");
}
window.scrollTo(0, e.state.scroll);
}
});