[TIL] 11_JS | Hashbang, History API

MJ Kimยท2021๋…„ 8์›” 31์ผ
2

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
11/12
post-thumbnail

๐Ÿ’ก์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ ๋œ ๊ฒƒ


1. Hashbang

url์— #์„ ์ด์šฉํ•ด ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
#์€ ๊ฐ™์€ ํŽ˜์ด์ง€ ๋‚ด์˜ ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ๋•Œ ๋งŽ์ด ์‚ฌ์šฉ๋˜์—ˆ๋‹ค.

-> ํ•ด์‹œ๋ฑ…์˜ ์›๋ฆฌ๋Š” html์˜ ๋„ค์ž„ ์•ต์ปค๋ฅผ ์ด์šฉํ•œ ๊ฒƒ์ด๋‹ค.

์˜ˆ์‹œ

<a href="/">Home</a>
<a href="/#About">About</a>
<a href="/#Contact">Contact</a>
// hashchange ์ด๋ฒคํŠธ์™€ hash๋ฅผ ์ถ”์ ํ•ด ๋ Œ๋”๋  ํŽ˜์ด์ง€๋ฅผ ์„ ์ •ํ•œ๋‹ค.  

const { hash } = window.location
//...
window.addEventListener('hashchange', () => {
    //...
  }

์ตœ๊ทผ์—๋Š” SPA์—์„œ ๊ฑฐ์˜ ์“ฐ์ด์ง€ ์•Š๋Š”๋‹ค.

๋‹จ์ 

  • url์—์„œ ์˜ค๋Š” ๊ดด๋ฆฌ๊ฐ
  • ๊ฒ€์ƒ‰์—”์ง„ ํฌ๋กค๋Ÿฌ๊ฐ€ hashbang์„ ์ด์šฉํ•œ SPA์›น์„ ์ธ์‹ํ•˜๊ธฐ ์–ด๋ ต๋‹ค.

๊ทธ๋Ÿฌํ•œ ์ด์œ ๋กœ ์š”์ฆ˜์€ history API๋ฅผ ์ด์šฉํ•ด SPA๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.



2.history API

  • ๋ธŒ๋ผ์šฐ์ €์—์„œ ํŽ˜์ด์ง€ ๋กœ๋”ฉ์„ ํ•˜๋ฉด, ์„ธ์…˜ ํžˆ์Šคํ† ๋ฆฌ๋ผ๋Š” ๊ฒƒ์„ ๊ฐ–๋Š”๋‹ค.

  • ์„ธ์…˜ ํžˆ์Šคํ† ๋ฆฌ๋Š” ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•  ๋•Œ๋งˆ๋‹ค ์Œ“์ด๊ฒŒ ๋˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๋’ค๋กœ๊ฐ€๊ธฐ ์‹œ ์ด์ „ ํŽ˜์ด์ง€๋กœ ๊ฐ€๊ฑฐ๋‚˜ ๋’ค๋กœ ๊ฐ„ ์ดํ›„ ๋‹ค์‹œ ์•ž์œผ๋กœ ๊ฐ€๋Š” ๋“ฑ์˜ ์ด๋™์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

  • pushState, replaceState ๋‘๊ฐœ์˜ ํ•จ์ˆ˜๋กœ ํ™”๋ฉด ์ด๋™์—†์ด ํ˜„์žฌ url์„ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

    history.pushState(state, title[, url])

    : ์„ธ์…˜ ํžˆ์Šคํ† ๋ฆฌ์— ์ƒˆ url ์ƒํƒœ๋ฅผ ์Œ“๋Š”๋‹ค.

    history.replaceState(state, title[, url])

    : ์„ธ์…˜ ํžˆ์Šคํ† ๋ฆฌ์— ์ƒˆ url ์ƒํƒœ๋ฅผ ์Œ“์ง€ ์•Š๊ณ , ํ˜„์žฌ url์„ ๋Œ€์ฒดํ•œ๋‹ค.
    (์ด์ „ ํŽ˜์ด์ง€๋กœ ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ ๋ฐฉ์ง€!)

    • state : history.state์—์„œ ๊บผ๋‚ด์“ธ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์ด๋‹ค.
    • title : ๋ณ€๊ฒฝ๋  ํŽ˜์ด์ง€์˜ title์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’์ธ๊ฒƒ ๊ฐ™์ง€๋งŒ, ๊ฑฐ์˜ ๋Œ€๋ถ€๋ถ„์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง€์›X. ๋นˆ string๋„ฃ์œผ๋ฉด ๋œ๋‹ค.
    • url : ์„ธ์…˜ ํžˆ์Šคํ† ๋ฆฌ์— ์ƒˆ๋กœ ๋„ฃ์„ url์ด๋‹ค. aํƒœ๊ทธ๋ฅผ ํด๋ฆญํ•˜๊ฑฐ๋‚˜ location.href๋กœ url์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ, ์ด url์ด ๋ณ€๊ฒฝ๋œ๋‹ค๊ณ  ํ•ด์„œ ํ™”๋ฉด์ด ๋ฆฌ๋กœ๋“œ(์ƒˆ๋กœ๊ณ ์นจ) ๋˜๊ฑฐ๋‚˜ ํ•˜์ง„ ์•Š๋Š”๋‹ค.
  • ๋‹ค๋งŒ, pushState()๋Š” ์ด์ „ URL๊ณผ ์‹ ๊ทœ URL์˜ ํ•ด์‹œ๊ฐ€ ๋‹ค๋ฅด๋”๋ผ๋„ ์ ˆ๋Œ€ hashchange ์ด๋ฒคํŠธ๋ฅผ ์œ ๋ฐœํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • ์œ„์™€ ๊ฐ™์€ ์ด์œ ๋กœ, popstate()๋‚˜ ๊ธฐํƒ€ ์ด๋ฒคํŠธ๋ฅผ ์ด์šฉํ•ด pathname์„ ์ถ”์ ํ•˜๊ฒŒ ๋œ๋‹ค.

์˜ˆ์‹œ

<a href="/" class="link">Home</a>
<a href="/About" class="link">About</a>
<a href="/Contact" class="link">Contact</a>
// link์—์„œ ๋ฐœ์ƒํ•˜๋Š” click ์ด๋ฒคํŠธ์™€ pathname๋ฅผ ์ถ”์ ํ•ด ๋ Œ๋”๋  ํŽ˜์ด์ง€๋ฅผ ์„ ์ •ํ•œ๋‹ค. 

const { pathname } = location
//...
window.addEventListener('click', (event) => {
    if (event.target.className === 'link') {
      const href = e.target.getAttribute('href')
      history.pushState(null, null, href)

      event.preventDefault()
	//...
    }
  }



์ฐธ๊ณ 
๋ฐ๋ธŒ์ฝ”์Šค๊ฐ•์˜
https://developer.mozilla.org/ko/docs/Web/API/History_API
https://poiemaweb.com/es6-modulehttps://developer.mozilla.org/ko/docs/Web/API/History_API
https://www.zerocho.com/category/HTML&DOM/post/599d2fb635814200189fe1a7
http://spectrumdig.blogspot.com/2015/06/history-client-router.html
profile
๊ธฐ์ดˆ๊ฐ€ ํŠผํŠผํ•œ ๊ฐœ๋ฐœ์ž๋กœ ์„ฑ์žฅํ•˜๊ธฐ ๐Ÿ’ป ๐Ÿคž

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด