๋ชฉ๋กNextJS (10)
๐ค ์์งlog ๐ค
Warning: Function components cannot be given refs. Attempts to access this ref will fail. Did you mean to use React.forwardRef()? - Next/Link์ children์ผ๋ก component๋ฅผ ์คฌ์๋ ์๊ธฐ๋ error ์ ๋๋ค. ์ด ์ฝ๋์์ error๊ฐ ๋ฐ์ํ์์ , 1. component๋ฅผ a tag๋ก ๊ฐ์ธ์ค๋๋ค. // ์์ ๋ ์ฝ๋ 2. aํ๊ทธ๋ฅผ styledComponents๋ก ๊ฐ์ธ์ฃผ๋ฉด a tag์ lint error๊ฐ ์ฌ๋ผ์ง๋๋ค. const CustomLink = styled.a``; // styled-components ๋ถ๋ถ 3. ๊ณต์๋ฌธ์์ ์ฃผ์์ฌํญ์ ์ฐธ๊ณ ํ์ฌ passHref๋ฅผ ์ถ๊ฐํด์ค๋๋ค.
๐ ํ๋ก์ ํธ ์ธํ ํ์ํ ๋ํ๋์๋ฅผ ์ค์นํฉ๋๋ค. npm i -D babel-plugin-styled-component ๐ .babelrc ๋จผ์ ๋ฐ๋ฒจ ํ์ผ์ ์์ ํฉ๋๋ค. ์๋ ํ์ผ์ next.js์ ssr๊ณผ ์ฐ๊ด์ด ์๋๋ฐ, ssr์ ์ํด styled-components ์คํ์ผ์ด ์ ์ฉ ์ ์ ํ๋ฉด ๋ ๋๋ง์ด ๋๋ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํจ์ ๋๋ค. { "presets": ["next/babel"], "plugins": [ [ "babel-plugin-styled-components", { "fileName": true, "displayName": true, "pure": true, "ssr": true } ] ] } NextJS์์ Styled-components ์ฌ์ฉํ๊ธฐ npm i styled-components n..
๐ ํ๋ก์ ํธ ์ธํ next ํ๋ก์ ํธ๋ฅผ ์ค์นํ๊ณ ์ดํ ํ์ํ ๋ํ๋์๋ฅผ ์ค์นํฉ๋๋ค. npx create-next-app my-app cd my-app npm i @emotion/react @emotion/styled @mui/icons-material @mui/material @mui/styles nextjs๋ ์๋ฒ์ฌ์ด๋๋๋๋ง์ ํ๊ธฐ ๋๋ฌธ์ react์์ mui๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ์ฒ๋ผ ์์ฝ๊ฒ ๋ฐ์ ๋์ง ์์ต๋๋ค. ๊ทธ๋์ ๋ช๊ฐ์ง ์ฌ์ ์์ ์ ํด์ผํฉ๋๋ค. ๐ _document.tsx _document๋ ์๋ฒ์ฌ์ด๋์ ๊ด์ฌํ๋ ๋ก์ง ๋๋ staticํ ๋ก์ง์ ์ถ๊ฐํ๋๋ฐ ์ฌ์ฉํฉ๋๋ค. (_document๊ฐ ํ๋ ์ผ์ ์ ๋ชจ๋ฅด๊ฒ ๋ค๋ฉด nextjs ๊ธฐ๋ณธ (opens new window)์ด ํฌ์คํ ์ ์ฐธ์กฐํด์ฃผ์ธ์.) ssr ์ง์์..
Next.js์ getStaticProps์ getStaticPaths api๋ฅผ ์ฌ์ฉํ๋ฉด static ํ์ด์ง๋ฅผ ์์ฑํ ์ ์๋ค. getStaticProps: ๋น๋ ์ ๋ฐ์ดํฐ๋ฅผ fetchํ์ฌ static ํ์ด์ง๋ฅผ ์์ฑ getStaticPaths: pages/**/[id].tsx ํํ์ ๋์ ๋ผ์ฐํ ํ์ด์ง ์ค, ๋น๋ ์์ staticํ๊ฒ ์์ฑํ ํ์ด์ง๋ฅผ ์ ํจ ๐ getStaticProps .tsx์์ export async function getStaticProps(context) ํํ๋ก ์ฌ์ฉ. context.params๋ก ๋์ ๋ผ์ฐํ ์ ๊ฒฝ๋ก ์ด๋ฆ์ ๊ฐ์ ธ์จ๋ค. pages/posts/[id].tsx ํ์ด์ง๋ฅผ /posts/123์ผ๋ก ์ ๊ทผํ๋ค๋ฉด context.params๋ { id: "123" }์ด ๋๋ค. { p..
Warning: Expected server HTML to contain a matching in . ์ด ์๋ฌ๋ ์๋ฒ์ฌ์ด๋ ๋ ๋๋ง ์์ html๊ณผ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง ์์ html์ด ์ผ์นํ์ง ์์์ ๋ฐ์ํ๋ ์๋ฌ๋ก ์ถ์ธก๋๋ค. ๊ทธ๋์ ์ค์ ๋ก ๋ธ๋ผ์ฐ์ ์ ์ฟ ํค๋ฅผ ์ญ์ ํ๋ฉด ํด๋น ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๋๋ค๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค. ํด๊ฒฐ๋ฐฉ์ ๋ธ๋ผ์ฐ์ ์ฟ ํค ์ญ์ ๋ธ๋ผ์ฐ์ ์ ์ฟ ํค๋ฅผ ์ญ์ ํด์ html์ ์์ ์๋กญ๊ฒ ๋ ๋๋งํ๋ฉด ํด๋น ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ ๊ธฐ์ตํ๊ณ ์๋ html์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ค๋ง ๊ณ์ ํ ์คํธ๋ฅผ ํ๋ฉด์ ์์ ์ ํ ๋๋ ๋ธ๋ผ์ฐ์ ์ ์ฟ ํค๋ฅผ ๊ณ์ ์ญ์ ํ๋ค๋ ๊ฒ ๋ฒ๊ฑฐ๋กญ๊ธฐ ๋๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์ถ๊ฐํด ํด๋น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค. useEffect๋ฅผ ์ฌ์ฉํด์ ๋ ๋๋ง ํ ์ํ ์ ๋ฐ์ดํธ use..
Next.js์์ ์ ๊ณตํ๋ SSR, ํ์ง๋ง ์ฐ๋ฆฌ๋ SSR์์ ์ฌ์ฉํ์ง ๋ชปํ๋ ๊ฐ์ฒด์ธ window ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ๋๊ฐ ๋ง์ต๋๋ค. ๊ทธ๋ด๋ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ ! 1. typeof ๋ฅผ ์ฌ์ฉ. if(window){...} // window is not definde ์๋ฌ๋ฐ์ if(typeof window !== undefined) {...} // ์ ์๋์ง์์ window์ ํ์ ์ด๊ธฐ๋๋ฌธ์ undefied๊ฐ ๋ฐ์ -> ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค. ๊ฐ๋จํ๊ฒ ์ด๋ฌํ ๋ฐฉ๋ฒ์ผ๋ก window๊ฐ์ฒด๊ฐ ์๋์ง ์ฒดํฌํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. 2. useEffect๋ฅผ ์ฌ์ฉ. useEffect(()=>{ // ์์์ window ๊ฐ์ฒด๋ฅผ ์ฌ์ฉ },[]) useEffect๋ DOMํ์ฑ ํ์ ์คํ์ด ๋๋ hook์ ๋๋ค. ๊ณ ๋ก ๋ธ๋ผ์ฐ์ ๊ฐ์๋ ์๋ฒ์์ ..
npm install -D @svgr/webpack webpack์ ์ค์นํฉ๋๋ค. // next.config.js ์ค์ module.exports = { webpack(config) { config.module.rules.push({ test: /\\.svg$/, use: ["@svgr/webpack"], }); return config; }, }; next.js ํ๋ก์ ํธ๋ฅผ ์ฒ์ ์์ฑ์ ๊ฐ์ด ์์ฑ๋๋ next.config.js๋ฅผ ์ค์ ํด์ค๋๋ค. // ํ๋ก์ ํธ ๋ฃจํธ ํด๋์ custom.d.ts ํ์ผ ์์ฑ declare module "*.svg" { import React from "react"; const svg: React.FC; export default svg; } ํ๋ก์ ํธ ๋ฃจํธ ํด๋์ custom.d...
npm i styled-components npm i @types/styled-components styled-components ๋ฅผ ์ค์นํฉ๋๋ค. npm install babel-plugin-styled-components npm i babe-preset-next babel plugin ์ ์ค์นํ๊ณ .babelrc ํ์ผ์ ๋ง๋ค์ด ์ค๋๋ค. Next.js๋ ํ์ด์ง ์ ์ ์ SSR๋ฅผ ์ด์ฉํ๊ณ ์ดํ ํ์ด์ง ์ด๋ ์ CSR๋ฅผ ์ด์ฉํ์ฌ ํ์ด์ง๋ฅผ ๋ ๋๋งํฉ๋๋ค. ์ด๋ server์ client์์ ์์ฑํ๋ class ํด์๊ฐ์ด ๋ฌ๋ผ ์ถฉ๋๋ก ์ธํด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. babel ์ค์ ์ผ๋ก ์ถฉ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. ํ๋ก์ ํธ ๋ฃจํธ ํด๋์ .babelrc ํ์ผ ์์ฑ { "presets": ["next/babel"],..
Next JS ์ค์น npm create-next-app . / npm create-next-app —typescript . โ๏ธ * name can no longer contain capital letters ๋ผ๋ ์๋ฌ๊ฐ ๋จ๋ฉด ํด๋๋ช ์ " ๋๋ฌธ์ " ๊ฐ ์์ด์ ๋จ๋๊ฒ์ด๋ฏ๋ก " ์๋ฌธ์ " ๋ก ๋ณ๊ฒฝ Next.. eun-jii.tistory.com .module.css ํ์ผ ์์ฑ CSS ๋ฅผ ์ ์ฉํ ํ์ผ๊ณผ ๊ฐ์ ํด๋์ ํ์ผ๋ช .module.css ํ์ผ ์์ฑ ex) NavBar.js NavBar.module.css .active { color: tomato; } .link { text-decoration: none; } ์ฝ๋๋ฅผ css์ ์ ๊ณ import styles from "./NavBar.module.css";..
์ค์น npx create-next-app@latest . npx create-next-app@latest --ts . โ๏ธ * name can no longer contain capital letters ๋ผ๋ ์๋ฌ๊ฐ ๋จ๋ฉด ํด๋๋ช ์ " ๋๋ฌธ์ " ๊ฐ ์์ด์ ๋จ๋๊ฒ์ด๋ฏ๋ก " ์๋ฌธ์ " ๋ก ๋ณ๊ฒฝ npm run dev ์คํ NextJS ์ React react = library , CSR(client-side-rendering) Nextjs = framework , SSR(server-side-rendering) โ๏ธ CSR : ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง ์ด๋ ์ฌ์ฉ์์ ์์ฒญ์ ๋ฐ๋ผ ํ์ํ ๋ถ๋ถ๋ง ์๋ต ๋ฐ์ ๋ ๋๋ง ํ๋ ๋ฐฉ์ SSR : ์๋ฒ์ฌ์ด๋ ๋ ๋๋ง์ ์ฝ์๋ก ์๋ฒ๋ก๋ถํฐ ์์ ํ๊ฒ ๋ง๋ค์ด์ง htmlํ์ผ์ ๋ฐ์์ ํ..