์ฃผ์ ์์
- ์ด๊ธฐ ํ๊ฒฝ ์ธํ
- ์๋ฒ, ํด๋ผ์ด์ธํธ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ถ๋ฆฌ ์ธํ
- ํด๋ผ์ด์ธํธ
- ๋ฐ๋ฒจ ํธ๋์คํ์ผ๋ง ํ๊ฒฝ ๊ตฌ์ถ
- ์๋ฒ
- ๊ธฐ๋ณธ์ ์ธ ์ด๊ธฐ ์ธํ
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- npm publish ํ ํด๋ผ์ด์ธํธ์์ ๋ค์ด๋ก๋ํ์ฌ ์ฌ์ฉ
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- createElement
- jsx ํ์ผ์์ ์์ฑ๋ html element์ ๋ํด์ babel ํธ๋์คํ์ผ์ ํตํด ๊ฐ์ฒด๋ก ๋ณํ
- navigate
- historyAPI๋ฅผ ์ด์ฉํ์ฌ uri๋ง ๋ณ๊ฒฝํ๋, ์ค์ ๋ก ํ์ด์ง ์ ํ์ ์ด๋ฃจ์ด์ง์ง ์๋๋ก ์ค๊ณ์ค
- createElement
ํ์ต ํค์๋
- 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๋ํ ์ผ๋์ ๋๊ณ ์ค๊ณํ ์์ ์ด๋ค.