๊ธฐ๊ฐ | 2023-11-02 ~ |
---|---|
๊ธฐ์ ์คํ | HTML, CSS, JavaScript(ES6), Fetch, Express |
ํผ์ฌ ๋์ด ์๋ ๊ฐ๋ ์ ๋ช ํํ๊ฒ ์ ๋ฆฌํ ์ ์๊ฒ ๋ ๊ธฐํ
React๋ฅผ ์ฌ์ฉํ๋ฉด์ ์ฝ๋์ ๋์ ์ฌ๋ถ์ ์ง์คํ ๋๋จธ์ง, React ์๋ ์๋ฆฌ์ ๋ํด์๋ ์ ๋๋ก ์๊ณ ์์ง ๋ชป ํ ๊ฒฝํฅ์ด ์์๋ค. ๋ฐ๋ผ์ SPA๋ฅผ ์ง์ ๊ตฌํํด๋ณด๋ฉฐ, React์ ๋ํด ๋ณด๋ค ๊น๊ฒ ์์๋ณด๋ ๊ธฐํ๋ฅผ ๊ฐ์ง๊ณ ์ ํ์๋ค.
๊ทธ ๊ฒฐ๊ณผ ๋ค์ด๋ณธ ์ ์ ์์ง๋ง ์ ํํ๊ฒ ์๋ค๊ณ ํ๋ตํ๊ธฐ ์ ๋งคํ ๊ฐ๋
๋ค์ ํ์คํ๊ฒ ์ ๋ฆฝํ ์ ์๋ ์๊ฐ์ด ๋์๋ค.
๋ํ์ ์ธ ์๋ก๋ ๋ค์๊ณผ ๊ฐ์ ๊ฐ๋
์ ์ธ๊ธํด ๋ณผ ์ ์์ ๊ฒ ๊ฐ๋ค. SPA์ ๋จ์ ์ผ๋ก๋ SEO์ ์ทจ์ฝํจ์ ๋ํ์ ์ผ๋ก ์ธ๊ธํ๋ค. ์ด๋ฅผ React ์๋ ์๋ฆฌ, ๋ค์ ๋งํด SPA ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋จํ๊ฒ ์ค๋ช
ํด ๋ณด๋ฉด, SPA๋ ์ด๊ธฐ ํ์ด์ง ๋ก๋ฉ ์ดํ์ ๋์ ์ผ๋ก ์ฝํ
์ธ ๋ฅผ ๋ถ๋ฌ์ค๋ ๋ฐฉ์์ ๊ทธ ์ด์ ๋ก ๋ตํ ์ ์๋ค. SPA๋ ํด๋ผ์ด์ธํธ ์ธก์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋์ ์ผ๋ก ํ์ด์ง๋ฅผ ์์ฑํ๋ฏ๋ก, ์ด๊ธฐ ํ์ด์ง ๋ก๋ฉ ์ดํ์ ์ฝํ
์ธ ๋ฅผ ๋ถ๋ฌ์ค๋ ๋ฐ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์๋ฒ์์ ๊ฐ์ ธ์์ผ ํ๋ค. ์ด ๋๋ฌธ์ ๊ฒ์ ์์ง์ด ์ ์ ํ๊ฒ ์์ธํํ๊ธฐ ์ด๋ ค์ SEO์ ์ทจ์ฝํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
[๋ฌธ์ ์ํฉ]
์๋์ gif๋ฅผ ํตํด ํ์ธํด ๋ณผ ์ ์๋ฏ์ด, Header์์ ํ์ฌ์๊ฐ์ ๊ฐ์ด a ํ๊ทธ๋ฅผ ํด๋ฆญํ๋ฉด SPA๊ฐ ์ ๋๋ก ๋์์ ํ๋ค. ํ์ง๋ง ๋น๊ทผ ๋ก๊ณ ์ด๋ฏธ์ง๋ฅผ ํด๋ฆญํ๋ฉด SPA๊ฐ ์๋ํ์ง ์๋ ์ด์๊ฐ ๋ฐ์ํ์๋ค.
document.addEventListener('DOMContentLoaded', () => {
document.body.addEventListener('click', (e) => {
if (e.target.matches('[data-link]')) {
e.preventDefault();
navigateTo(e.target.href);
console.log('SPA ์๋');
}
});
console.log('SPA ๋ฏธ์๋');
router();
});
[ํด๊ฒฐ ๋ฐฉ๋ฒ]
๋น๊ทผ ๋ก๊ณ ์ ๊ฒฝ์ฐ, a ํ๊ทธ ์์ svg ํ์ผ์ด ์๋๋ฐ ํด๋ฆญ์ ํ๋ฉด a ํ๊ทธ๊ฐ ์๋ svg๊ฐ target์ผ๋ก ๋ด๊ธฐ๊ฒ ๋๋ ๊ฒ์ ํ์ธํ์๋ค. ๋ฐ๋ผ์ a ํ๊ทธ์ ๋๋ฌํ ์ ์๋๋ก closest์ ํตํด ํด๋น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์๋ค.
document.addEventListener('DOMContentLoaded', () => {
document.body.addEventListener('click', (e) => {
const targetLink = e.target.closest('[data-link]');
if (targetLink) {
e.preventDefault();
navigateTo(targetLink.href);
}
});
router();
});