tip-archive icon indicating copy to clipboard operation
tip-archive copied to clipboard

Scroll restoration in SPA

Open jbee37142 opened this issue 6 years ago โ€ข 1 comments

๋ณต์›์„ ํ•œ๋‹ค.

  • ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๊ณ  ์žˆ๋˜ ํ™”๋ฉด์„ ์œ ์ง€ํ•ด๋ณด์ž.
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ์Šคํฌ๋กค ์œ ์ง€
  • ์™ธ๋ถ€ ๋งํฌ์—์„œ ๋ณต๊ท€ ์‹œ ์Šคํฌ๋กค ์œ ์ง€

์•ฑ ๋‚ด ์ด๋™ ์‹œ ์Šคํฌ๋กค ๋ณต์›์€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” router ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ scrollBehavior์— ์˜์กดํ•œ๋‹ค.

  • ์•ฑ ๋‚ด ๋’ค๋กœ๊ฐ€๊ธฐ ์‹œ, scrollBehavior ๊ฐ’์œผ๋กœ ๋ณต์›.
  • ์•ฑ ๋‚ด router link ํด๋ฆญ ์‹œ, [0,0]์œผ๋กœ ์ด๋™

์™ธ๋ถ€ ๋งํฌ์—์„œ ๋ณต๊ท€ํ•  ๊ฒฝ์šฐ์—๋Š” session storage์— ์ €์žฅ๋œ scroll position ๊ฐ’์„ ์‚ฌ์šฉํ•œ๋‹ค.

  • lazy loading๋˜๋Š” ์ด๋ฏธ์ง€ ์—˜๋ฆฌ๋จผํŠธ์—์„œ ์ œ๊ณตํ•˜๋Š” loaded ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์™ธ๋ถ€ ๋งํฌ๋กœ ๋ฒ—์–ด๋‚  ์ˆ˜ ์žˆ๋Š” created lifecycle hook์— ํ•ด๋‹น retore ๋กœ์ง์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

jbee37142 avatar Feb 14 '19 01:02 jbee37142

๋ณต์›์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋’ค๋กœ๊ฐ€๊ธฐ๋ฅผ ํ†ตํ•œ ์ ‘๊ทผ์ธ๊ฐ€ ์ƒˆ๋กœ์šด ์ ‘๊ทผ์ธ๊ฐ€

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

jbee37142 avatar Mar 15 '19 03:03 jbee37142