Scroll restoration in SPA
๋ณต์์ ํ๋ค.
- ์ฌ์ฉ์๊ฐ ๋ณด๊ณ ์๋ ํ๋ฉด์ ์ ์งํด๋ณด์.
- ์ ํ๋ฆฌ์ผ์ด์ ๋ด์์ ์คํฌ๋กค ์ ์ง
- ์ธ๋ถ ๋งํฌ์์ ๋ณต๊ท ์ ์คํฌ๋กค ์ ์ง
์ฑ ๋ด ์ด๋ ์ ์คํฌ๋กค ๋ณต์์ ์ฌ์ฉํ๊ณ ์๋ router ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ scrollBehavior์ ์์กดํ๋ค.
- ์ฑ ๋ด ๋ค๋ก๊ฐ๊ธฐ ์, scrollBehavior ๊ฐ์ผ๋ก ๋ณต์.
- ์ฑ ๋ด router link ํด๋ฆญ ์, [0,0]์ผ๋ก ์ด๋
์ธ๋ถ ๋งํฌ์์ ๋ณต๊ทํ ๊ฒฝ์ฐ์๋ session storage์ ์ ์ฅ๋ scroll position ๊ฐ์ ์ฌ์ฉํ๋ค.
- lazy loading๋๋ ์ด๋ฏธ์ง ์๋ฆฌ๋จผํธ์์ ์ ๊ณตํ๋ loaded ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ๋ค.
- ์ธ๋ถ ๋งํฌ๋ก ๋ฒ์ด๋ ์ ์๋
createdlifecycle hook์ ํด๋น retore ๋ก์ง์ ์ถ๊ฐํ๋ค.
๋ณต์์ ํ์ง ์๋๋ค.
๋ค๋ก๊ฐ๊ธฐ๋ฅผ ํตํ ์ ๊ทผ์ธ๊ฐ ์๋ก์ด ์ ๊ทผ์ธ๊ฐ
session storage๋ฅผ ์ด์ฉํด์ ๋ณต์์ ํ๋ฉด ์์ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ์ฐ๋ฆฌ๋ ์๋ก์ด ์ ๊ทผ๊ณผ ๋ฆฌํ๋ ์ฌ์ ๋ค๋ก ๊ฐ๊ธฐ ๋๋ ์์ผ๋ก ๊ฐ๊ธฐ๋ฅผ ํ๋จํด์ผ ํ๋ค. ์ด ๋ถ๋ถ์ ์ด๋ป๊ฒ ํ๋จํ ์ ์์๊น.
์ด์ ๋ํ ๋ต์ performance.navigation ๊ฐ์ฒด์ ์๋ค.
์ฐ๋ฆฌ๋ ์ด ๊ฐ์ฒด๋ฅผ ํตํ์ฌ ๋ค์๊ณผ ๊ฐ์ ์ ๋ณด๋ฅผ ์ป์ ์ ์๋ค.
const navigation = performance && performance.navigation
export const TYPE_NAVIGATE = (navigation && navigation.TYPE_NAVIGATE) || 0
export const TYPE_RELOAD = (navigation && navigation.TYPE_RELOAD) || 1
export const TYPE_BACK_FORWARD = (navigation && navigation.TYPE_BACK_FORWARD) || 2
export function getNavigationType () {
return performance && performance.navigation && performance.navigation.type
}
ํ์ฌ navigation type์ ๋ฐ์์ ๋ถ๊ธฐ๋ฅผ ํ๋ค. ์ฆ backward๋ forward ์ผ ๋๋ง ๋ณต์์ ํด์ฃผ๋ฉด ๋๋ค.
์ด๋ ๊ฒ๋ง ๋๋ฉด ํ๋ณตํ ์ค ์์์ง๋ง.
iOS์์๋ performance.navigation.type์ด ๋ฌด์กฐ๊ฑด 0์ด๋ค.
bf cache ๋ผ๋ ๊ฒ๋ ์กด์ฌ.
์ด๊ฒ๋ค์ ์ ๋ถ ๊ณ ๋ คํ์ฌ ๋ณต์ํด์ผ ํ๋ค.
const [nav] = performance.getEntriesByType(โnavigationโ)
console.log(nav.type)
enum NavigationType {
'navigate',
'reload',
'back_forward',
'prerender',
}
Reference
- https://developer.mozilla.org/en-US/docs/Web/API/Navigation_timing_API
- https://developer.mozilla.org/en-US/docs/Web/API/Performance/navigation
- https://w3c.github.io/navigation-timing/#sec-PerformanceNavigationTiming