Today, What I learned?
๋ฆฌ์กํธ ํ๋ ์์ํฌ์ธ Next.js์ ๋ํ ๊ณต๋ถ๋ฅผ ์์ํ๋ค.
Next.js๊ฐ ์ด๋ค ์ด์ ๋ก ๋์ ๋๊ฒ ๋์๋์ง์ ๋ฆฌ์กํธ ํ๋ก์ ํธ ๊ตฌ์กฐ์ ๋ค๋ฅธ ์ ๋ค์ ๋ํด ์ ๋ฆฌํด ๋ณธ๋ค.
Next.js ๋ ์ด์ฉ๋ค๊ฐ ํ์ํ์๊น?
Next.js๋ ๋ฆฌ์กํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์๋ฒ์ฌ์ด๋ ๋ ๋๋ง ํ๋ ์์ํฌ(SSR)๋ค.
๊ธฐ์กด ๋ฆฌ์กํธ๋ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง(CSR)์ธ๋ฐ, CSR์ SPA๋ฅผ ๋ฐํ์ผ๋ก ์๋ก๊ณ ์นจ ์์ด ์นํ์ด์ง๋ฅผ ์ด์ฉํ ์ ์๋ ์ ์ ์ ํธ์์ฑ์ด ๊ฐ์ ๋์์ง๋ง ์๋ฐ์คํฌ๋ฆฝํธ ๋ฒ๋ค ์ฌ์ด์ฆ๊ฐ ์ปค์ ธ์ ์ด๊ธฐ ๋ก๋ฉ์๋๊ฐ ์ฆ๊ฐ๋์๋ค๋ ๋จ์ ์ด ์์๋ค.
์ด๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ํ์ฌ ํ์ด์ง์์ ํ์ํ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ๋ง์ ๋ก๋ฉํ๋ ์ฝ๋๋ถํ (Code Split, Lazy-loading)์ ์ ์ฉํ๊ธฐ ์์ํ๋ค. ํ์ง๋ง!.. CSR์ ๋งค๋ฒ ํด๋ผ์ด์ธํธ๊ฐ index.html์ ๋ ๋๋ง ํ๊ธฐ ๋๋ฌธ์ ํฌ๋กค๋ง์ ํ์ํ ์ฌ์ดํธ ์ ๋ณด๊ฐ ๋ถ์กฑํ์ฌ SEO์ ๋ถ๋ฆฌํ๋ค๋ ์ ์ด ์์๋ค.
์๋๊ฐ ๋น ๋ฅด๋ฉด์ SEO๋ฅผ ์ต์ ํํ ์ ์๋ ๊ฒ์ ์์๊น?.. ๐ค ๋ฅผ ์์์ผ๋ก ๋ฆฌ์กํธ ๊ธฐ๋ฐ์ Next.js, ๋ทฐ ๊ธฐ๋ฐ์ Nuxt.js ๊ฐ์ ํ๋ ์์ํฌ๊ฐ ๋ฑ์ฅํ๋ค.
Next.js ์์ํ๊ธฐ
Next.js ๊ณต์๋ฌธ์์ ๊ฐ๋ฉด ์ด๋ฌํ ๊ฒ๋ค์ ์ ๊ณตํ๋ ์์ฃผ ๋ฉ์ง ํ๋ ์์ํฌ์์ ์ ์ ์๋ค.
ํ์ด์ง ๊ธฐ๋ฐ ๋ผ์ฐํ ์์คํ ๊ณผ ๋์ ๋ผ์ฐํธ๋ฅผ ์ ๊ณตํ๊ณ ,
๊ฐ ํ์ด์ง์ HTML์ ๋ฏธ๋ฆฌ ๋ ๋๋ง(pre-rendering)ํ๋ ๊ฒ๊ณผ SSG์ SSR์ ๋ชจ๋ ์ ๊ณตํ๋ค.
๋ API Routes๋ฅผ ํตํด ์๋ฒ ์์ด ๊ฐ๋จํ API๋ฅผ ๋ง๋ค ์๋ ์๋ค.
์๋ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด ํ๋ก์ ํธ๋ฅผ ์์ฑํ ์ ์๋ค.
npx create-next-app ํ๋ก์ ํธ๋ช
yarn create next-app ํ๋ก์ ํธ๋ช
Next.js ํ๋ก์ ํธ ๊ตฌ์กฐ ๋ฏ์ด๋ณด๊ธฐ
package.json
ํ๋ก์ ํธ๋ฅผ ์ด๊ณ ๋์ package.json์ script๋ฅผ ๋ณด๋ฉด ๋ฆฌ์กํธ ํ๋ก์ ํธ์ ์กฐ๊ธ ๋ค๋ฅธ ๊ฒ์ ์ ์ ์๋๋ฐ, ๊ฐ๊ฐ ์ด๋ ๋ค.
- dev : ๊ฐ๋ฐ๋ชจ๋๋ก ํ๋ก์ ํธ ์คํ. ๊ฐ๋ฐ ํ๊ฒฝ์์ ์ ์ฉํ๊ฒ ์ฐ์ด๋ ๊ธฐ๋ฅ๋ค์ ์ ๊ณตํ๋ค.
- build : ํ๋ก๋์
๋ชจ๋(๋ฐฐํฌ์ฉ)๋ก ๋น๋ํ์ฌ
.next
ํด๋๋ฅผ ์์ฑํ๋ค. ๋ฐฐํฌ์ฉ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ๋ชจ๋์ ๊ธฐ๋ฅ๋ค์ด ๋น ์ง๋ค. - start : ๋น๋๋ ํ์ผ์ ์ค์ ๋ฐฐํฌ ํ๊ฒฝ์์ ๋์ผํ๊ฒ ์คํํด ์ค๋ค. (๋จผ์ ๋น๋๊ฐ ๋์ด์์ด์ผ ํจ)
pages ํด๋
์์๋ ์ธ๊ธํ๋ค์ํผ next.js๋ ํ์ด์ง ๊ธฐ๋ฐ ๋ผ์ฐํ
์ด๋ค. pages
์์ ๊ฐ ํด๋๋ช
์ด ์ฃผ์ ์ญํ ์ ํ๊ณ , ๋ด๋ถ ํ์ผ๋ค์ด ๊ฒฝ๋ก๊ฐ ๋๋ค.
์์ ๊ฐ์ ๊ตฌ์กฐ์ผ ๋ post ํ์ด์ง์ ๊ฒฝ์ฐ http://localhost:3000/post/1
์ด ๊ฒฝ๋ก๊ฐ ๋ ์ ์๊ฒ ๋ค.
_app.js
pages ํด๋ ๋ด์์๋ ๊ฐ์ฅ ๋จผ์ ๋ ๋๋ง ๋๋ ํ์ผ์ด๋ค.
import '../styles/globals.css'
function MyApp({ Component, pageProps }) {
return <Component {...pageProps} />
}
export default MyApp
<Component> ์ปดํฌ๋ํธ๊ฐ ์ค์ ํ์ด์ง ์ปดํฌ๋ํธ์ ํด๋นํ๋ค.
์ฌ๊ธฐ์๋ ๊ณตํต์ ์ธ ๋ ์ด์์(ํค๋๋ ํธํฐ.. ๋ฑ)๊ณผ global CSS๋ฅผ ์ ์ฉํ ์ ์๋ค๋ ํน์ง์ด ์๋ค.
index.html์ ๋ถ์ฌ
next.js๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ก๋ง ์ด๋ฃจ์ด์ง ํ๋ก์ ํธ์ด๊ธฐ ๋๋ฌธ์ ๋ฆฌ์กํธ์ฒ๋ผ index.html
ํ์ผ์ ๋ฐ๋ก ํ์ธํด ๋ณผ ์ ์๋ค.
๊ทธ๋ผ index.html
์ <head> ํ๊ทธ ์์ ๋ค์ด๊ฐ๋ ๊ฒ๋ค์ ์ด๋ป๊ฒ ๋ฃ์ด์ฃผ๋์ง?...๐ค
๋ด์ฅ ์ปดํฌ๋ํธ์ธ <Head>
์ปดํฌ๋ํธ๋ก ๋ฃ์ด์ค ์ ์๋ค.
import '../styles/globals.css';
import Head from 'next/head';
function MyApp({ Component, pageProps }) {
return (
<div>
<Head>
<title>My page title</title>
<meta property="og:title" content="My page title" key="title" />
</Head>
<Head>
<meta property="og:title" content="My new title" key="title" />
</Head>
<p>Hello world!</p>
<Component {...pageProps} />
</div>
);
}
export default MyApp;
Next.js์ ๊ธฐ์ด ๊ฐ๋
์ ๋ํด์ ๊ฐ๋ตํ๊ฒ ์ ๋ฆฌํด ๋ณด์๋ค.
๋ฆฌ์กํธ์ ๊ตฌ์กฐ๊ฐ ์ด์ง ๋ค๋ฅด๊ธด ํ์ง๋ง ์ต์ํด์ง ์ ์์ผ๋ฆฌ๋ผ ์๊ฐํ๋ฉฐ!.. ๐ฅบ
'๐ Studying > ๐ TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํฌ๋๋ฆฌ์คํธ Recoil๋ก ๋ฆฌํฉํ ๋ง (0) | 2023.02.02 |
---|---|
[Next.js] Next.js์ SSG, ISR (0) | 2023.02.01 |
[TypeScript] ๊ฒ์ ๊ธฐ๋ฅ ๊ตฌํํ๊ธฐ (0) | 2023.01.27 |
[TypeScript] redux-toolkit๊ณผ redux-thunk ๊ฐ์ด ์ฌ์ฉํ๊ธฐ (0) | 2023.01.26 |
[TypeScript] ๋ฆฌ์กํธ ํ์ด์ด๋ฒ ์ด์ค ์์ ๋ก๊ทธ์ธ ํธ์ํฐ ์ถ๊ฐํ๊ธฐ (1) | 2023.01.25 |
Comment