์ฃผ์š” ์ž‘์—…

  • ์ดˆ๊ธฐ ํ™˜๊ฒฝ ์„ธํŒ…
    • ์„œ๋ฒ„, ํด๋ผ์ด์–ธํŠธ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ถ„๋ฆฌ ์„ธํŒ…
    • ํด๋ผ์ด์–ธํŠธ
      • ๋ฐ”๋ฒจ ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง ํ™˜๊ฒฝ ๊ตฌ์ถ•
    • ์„œ๋ฒ„
      • ๊ธฐ๋ณธ์ ์ธ ์ดˆ๊ธฐ ์„ธํŒ…
    • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
      • npm publish ํ›„ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ ์‚ฌ์šฉ
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • createElement
      • jsx ํŒŒ์ผ์—์„œ ์ž‘์„ฑ๋œ html element์— ๋Œ€ํ•ด์„œ babel ํŠธ๋žœ์ŠคํŒŒ์ผ์„ ํ†ตํ•ด ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜
    • navigate
      • historyAPI๋ฅผ ์ด์šฉํ•˜์—ฌ uri๋งŒ ๋ณ€๊ฒฝํ•˜๋˜, ์‹ค์ œ๋กœ ํŽ˜์ด์ง€ ์ „ํ™˜์€ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š๋„๋ก ์„ค๊ณ„์ค‘

ํ•™์Šต ํ‚ค์›Œ๋“œ

  • Virtual DOM
  • babel๊ณผ webpack
    • ํŠธ๋žœ์Šค์ปดํŒŒ์ผ ๊ณผ์ •
    • jsx ํŠธ๋žœ์Šค์ปดํŒŒ์ผ

๊ณ ๋ฏผ ๋ฐ ํ•ด๊ฒฐ๊ณผ์ •

HistoryAPI๋ฅผ ์ด์šฉํ•œ SPA ๊ตฌํ˜„ํ•˜๊ธฐ

์ง€๋‚œ taskify ๋ฏธ์…˜์—์„œ ๋‚˜๋Š” SPA ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ๋‹ค๋Š” ๋งˆ์Œ์ด ๋“ค์–ด historyAPI๋ฅผ ๋”ฐ๋กœ ์ฐพ์•„๋ณธ ์ ์ด ์žˆ์—ˆ๊ณ , ์ด๋ฅผ ํ†ตํ•ด ๋ถ€์กฑํ•˜์ง€๋งŒ SPA๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด์•˜๋‹ค.

import Main from "../../pages/main/index.js";
import Login from "../../pages/login/index.js";
import EventManager from "../../feature/index.js";
 
export default (function navigation() {
  const navigator = {
    "/": Main.render,
    "/login": Login.render,
  };
  function navigate(pathname, prev) {
    document.body.innerHTML = "";
    history.pushState({ pathname: prev }, null, pathname);
    navigator[pathname]();
  }
  function onPageChanged(event) {
    document.body.innerHTML = "";
    EventManager.detachEvent(event.pathname);
    navigator[window.location.pathname]();
  }
  return {
    navigate,
    onPageChanged,
  };
})();

ํ•ด๋‹น ๋ฏธ์…˜์—์„œ ๋‚˜๋Š” SPA ๊ตฌํ˜„ ์ž์ฒด๋ฅผ ํด๋ผ์ด์–ธํŠธ ๋‹จ์—์„œ ๋ชจ๋‘ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€๋‹ค. ๋”ฐ๋ผ์„œ ์œ ํ‹ธํ•จ์ˆ˜์— navigation์„ ๋„ฃ์–ด๋†“๊ณ  navigator๋ฅผ ํด๋กœ์ €๋กœ ๊ด€๋ฆฌํ•˜๋ฉด์„œ ํŽ˜์ด์ง€ ๋ณ„๋กœ renderํ•จ์ˆ˜๋ฅผ ๋‘์—ˆ๋‹ค(ํŽ˜์ด์ง€๋ณ„ render ํ•จ์ˆ˜ ๋‚ด๋ถ€์—๋Š” ๋‹ค์‹œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋“ค์˜ render ํ•จ์ˆ˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค).

ํ•˜์ง€๋งŒ ์ด๋ฒˆ ๋ฏธ์…˜์˜ ๊ฒฝ์šฐ ๋”ฐ๋กœ ์ด๋Ÿฌํ•œ SPA๋ฅผ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ํ•จ์ˆ˜๋“ค์„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋А๊ผˆ์œผ๋ฉฐ, ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ์— ๊ธฐ์กด์— ๋“ฑ๋กํ•ด๋†จ๋˜ uri๋ณ„ render ํ•จ์ˆ˜๋Š” virtualDOM๊ณผ ์—ฐ๊ฒฐ์‹œ์ผœ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ• ์ง€์— ๋Œ€ํ•ด์„œ ๊ณ ๋ฏผ์ด ๋˜์—ˆ๋‹ค.

์•„์ง๊นŒ์ง€๋Š” virtualDOM๋˜ํ•œ ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง์„ ํ†ตํ•ด ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜์‹œํ‚ค๋Š” ์ž‘์—…๋ฐ–์— ํ•˜์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ์ ์„ ๊ณ ๋ คํ•˜๋ฉด์„œ navigate์˜ ์ž‘๋™ ๋ฐฉ์‹์ด ์–ด๋–ป๊ฒŒ ๊ฐ€์•ผํ•  ์ง€์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์€ ์•„์ง๊นŒ์ง€๋Š” ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜๋‹ค. virtual DOM์˜ ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„ ๋ฐฉ์‹์—์„œ navigate๋˜ํ•œ ์—ผ๋‘์— ๋‘๊ณ  ์„ค๊ณ„ํ•  ์˜ˆ์ •์ด๋‹ค.