Next.js version 12 - TEAM-ARK/inflearn-clone-front GitHub Wiki
์ด๋ฒ์ Next.js์ ๋ฒ์ 12๊ฐ ๋์จ ๊ฒ์ ๋ํด ์์๋ณด์.
** Next.js 12 ๊ณต์ ์์ ๋ฐ ๋ฌธ์ **
Update today by running npm i next@latest
.
- ์ต๋ 3๋ฐฐ ๊น์ง ๋ ๋น ๋ฅธ ์๋ก๊ณ ์นจ
- ์ต๋ 5๋ฐฐ ๊น์ง ๋ ๋น ๋ฅธ ๋น๋
- Next.js์์ ์์ ์ ์ฐ์ฑ ํ์ฑํ
-
React 18 ๋ฒ์
- ๋ค์ ํฌ์คํธ์์ ์ ๋ฆฌํ์
- Suspense ๋ฟ๋ง ์๋๋ผ Native Next.js APIs๊ฐ ์ด์ ์ง์๋๋ค.
- webP๋ณด๋ค 20% ์์ถ๋ฅ ์ด ๋ ์ข์ AVIF ํฌ๋งท ์ง์
- ์น ํฌ๋กค๋ฌ์ ์ต์ ํ๋ SEO
- ํ์คํ๋ ๋ชจ๋ ์์คํ ๊ณผ์ ์ฐ๊ณ
- Import packages from any URL, no installs required
- cdn๊ฐ์ ๊ณณ์ ์๋ js ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์น์์ด ๋ ์ฝ๊ฒ importํ๋ ๋ฐฉ๋ฒ์ธ ๊ฒ ๊ฐ๋ค.
- ๋ณดํต head์์ scriptํ๊ทธ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ ๊ฐ์ ๊ฒ์ผ๋ก ์๊ฐ๋๋ค.
- ์ปดํฌ๋ํธ ๋ ๋ฒจ์์ ์๋ฒ ์ฌ์ด๋ ๋จ ๋ก์ง๊น์ง ์ฒ๋ฆฌํ ์ ์๋ค๋ ๋ด์ฉ.
- ๊ฐ์ฅ ํฅ๋ฏธ๋กญ๊ฒ ์๊ฐ๋๋ ๋ถ๋ถ์ด๋ค.
- ์ฌํ๊น์ง next.js๋ฅผ ์ ๋๋ก ํ์ฉ์ ๋ชป ํ์๋๋ฐ ์ด๊ฒ์ ๊ณต๋ถํ๋ฉด์ ์ง๊ธ ์งํ์ค์ธ ํ๋ก์ ํธ์๋ ์ ์ฉ์ ํด๋ด์ผ๊ฒ ๋ค.
์๋ Babel๋ก ์ปดํ์ผ ํ์๋ค๊ฐ ์ด๋ฒ์ ์ปดํ์ผ๋ฌ๋ฅผ Rust๋ก ์์ ํ ์๋กญ๊ฒ ๋ฐ๊พธ๋ฉด์ ๋น๋์ ์๋ก๊ณ ์นจ ์๋๊ฐ ๋นจ๋ผ์ก๋ค๋ ๋ด์ฉ
- ์ต๋ 3๋ฐฐ๊น์ง ๋ ๋นจ๋ผ์ง ์๋ก๊ณ ์นจ
- ์ต๋ 5๋ฐฐ๊น์ง ๋ ๋นจ๋ผ์ง ๋น๋
The Rust compiler is built on SWC, an open platform for the next generation of fast tooling.
- ์ด์ ๋ฒ์ ๊ณผ ํธํ์ด ๋๋ค
- ๊ธฐ์กด Babel ๊ตฌ์ฑ์ด ์๋ ๊ฒฝ์ฐ ์๋์ผ๋ก ์ ํ ํด์ ๊ฐ ๋๋ค
// next.config.js
module.exports = {
swcMinify: true
}
์์ฒญ์ด ์๋ฃ๋๊ธฐ ์ ์ ์ฝ๋๋ฅผ ์คํํ ์ ์์ผ๋ฏ๋ก Next.js์์ ์์ ํ ์ ์ฐ์ฑ(full flexibility)์ ์ป์ ์ ์์ต๋๋ค. ์ฌ์ฉ์์ ์์ฒญ์ ๋ฐ๋ผ ์ฌ์์ฑ, ๋ฆฌ๋๋ ์ , ํค๋ ์ถ๊ฐ ๋๋ HTML ์คํธ๋ฆฌ๋ฐ๊น์ง ์๋ต์ ์์ ํ ์ ์์ต๋๋ค.
Next.js์์ ๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด pages/_middleware.js
ํ์ผ์ ์์ฑํ ์ ์์ต๋๋ค. ์ด ์์์๋ ํ์ค Web API ์๋ต(MDN)์ ์ฌ์ฉํฉ๋๋ค.
export function middleware(req, ev) {
return new Response('Hello, world!')
}
(๋ฏธ๋ค์จ์ด๋ฅผ ์ด๋ค๋ฉด ํ์ด์ง ์ ๊ทผ ๊ถํ์ด ์๋ ๊ฒฝ์ฐ ๋ฆฌ๋ค์ด๋ ํธ ํ๋ ๊ฒ์ ์ฌ๊ธฐ์์ ์ฒ๋ฆฌํด๋ ๋ ๊ฒ ๊ฐ๋ค.)
React 18์ Suspense, ์ ๋ฐ์ดํธ ์๋ ์ผ๊ด ์ฒ๋ฆฌ, startTransition๊ณผ ๊ฐ์ API ๋ฐ React.lazy๋ฅผ ์ง์ํ๋ ์๋ฒ ๋ ๋๋ง์ ์ํ ์๋ก์ด ์คํธ๋ฆฌ๋ฐ API์ ๊ฐ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํฉ๋๋ค.
ํ์ด์ค๋ถ์ React ํ๊ณผ ๊ธด๋ฐํ ํ๋ ฅํ์ฌ React 18์ด ์์ ์ ์ธ ๋ฆด๋ฆฌ์ค๋ฅผ ํฅํด ๋์๊ฐ๊ธฐ ์ํด Next.js๋ฅผ ์ค๋นํ์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฌํ ๊ธฐ๋ฅ์ ์คํ์ ํ๋๊ทธ๋ก Next.js 12์์ ์ค๋ ์ฌ์ฉํ ์ ์๋๋ก ๋ง๋ค๊ณ ์์ต๋๋ค.
npm install react@alpha react-dom@alpha
React 18์ ๋์ ๊ธฐ๋ฅ์๋ ์๋ฒ ์ธก Suspense ๋ฐ SSR ์คํธ๋ฆฌ๋ฐ ์ง์์ ๋ํ ๊ธฐ๋ณธ ์ ๊ณต ์ง์์ด ํฌํจ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด HTTP ์คํธ๋ฆฌ๋ฐ์ ์ฌ์ฉํ์ฌ ํ์ด์ง๋ฅผ ์๋ฒ ๋ ๋๋งํ ์ ์์ต๋๋ค. ์ด๊ฒ์ Next.js 12์ ์คํ์ ์ธ ๊ธฐ๋ฅ์ด์ง๋ง ์ผ๋จ ํ์ฑํ๋๋ฉด SSR์ ๋ฏธ๋ค์จ์ด์ ๋์ผํ ์๊ฒฉํ ๋ฐํ์์ ์ฌ์ฉํฉ๋๋ค.
ํ์ฑํํ๋ ค๋ฉด ์คํ ํ๋๊ทธ์ธ concurrentFeatures: true๋ฅผ ์ฌ์ฉํ์ธ์.
// next.config.js
module.exports = {
experimental: {
concurrentFeatures: true
}
}
React Server Components๋ฅผ ์ฌ์ฉํ๋ฉด components ์์ฒด๋ฅผ ํฌํจํ ๋ชจ๋ ๊ฒ์ ์๋ฒ์์ ๋ ๋๋งํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์๋ฒ์์ HTML์ ๋ฏธ๋ฆฌ ์์ฑํ๋ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง๊ณผ ๊ทผ๋ณธ์ ์ผ๋ก ๋ค๋ฆ ๋๋ค. Server Components๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋ผ์ด์ธํธ ์ธก JavaScript๊ฐ ํ์ํ์ง ์์ผ๋ฏ๋ก ํ์ด์ง ๋ ๋๋ง์ด ๋นจ๋ผ์ง๋๋ค. ์ด๊ฒ์ ์๋ฒ ๋ ๋๋ง์ ๊ฐ์ฅ ์ข์ ๋ถ๋ถ์ ํด๋ผ์ด์ธํธ ์ธก ์ํธ ์์ฉ๊ณผ ๊ฒฐํฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํฉ๋๋ค.
// next.config.js
module.exports = {
experimental: {
concurrentFeatures: true,
serverComponents: true
}
}
Next.js now enables you to do data fetching at the component level, all expressed as JSX. By using React Server components, we can simplify things. Special functions like getServerSideProps or getStaticProps are no longer needed. This aligns with the React Hooks model of colocating data fetching with your components.
- React Server components๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ, ์ปดํฌ๋ํธ ๋ ๋ฒจ์์ ๋ฐ์ดํฐ fetching์ ๊ฐ๋จํ๊ฒ ํฉ๋๋ค.(getServerSideProps, getStaticProps ๋๋ค ๋์ด์ ํ์์์ต๋๋ค.) ์ด๋ components์ ํจ๊ป ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ๋ฐฐ์นํ๋ React Hooks ๋ชจ๋ธ๊ณผ ์ผ์นํฉ๋๋ค.
You can rename any Next.js page to .server.js to create a Server Component and import client components directly inside your Server Components. These client components will hydrate and become interactive, so you add functionality like upvotes.
- ์ด๊ฒ ์ง๊ธ pages/ ์์ ์๋ .tsx ํ์ผ๋ค์ .server.ts ํ์ผ๋ก ๋ง๋ค๋ฉด ์๋ฒ์ปดํฌ๋ํธ๊ฐ ๋๊ณ JSXํ์ผ๋ก ํํ๋๋ค๋ ๊ฒ ๊ฐ๋ค.
Next.js 11.1๋ถํฐ CommonJS ๋ชจ๋๋ณด๋ค ์ฐ์ ์์๊ฐ ๋์ ES ๋ชจ๋์ ๋ํ ์คํ ์ง์์ ์ถ๊ฐํ์ต๋๋ค. Next.js 12์์๋ ์ด๊ฒ์ด ์ด์ ๊ธฐ๋ณธ๊ฐ์ ๋๋ค. CommonJS๋ง ์ ๊ณตํ๋ NPM ๋ชจ๋ ๊ฐ์ ธ์ค๊ธฐ๋ ๊ณ์ ์ง์๋ฉ๋๋ค.
Next.js 12์๋ URL์ ํตํด ES ๋ชจ๋์ ๊ฐ์ ธ์ค๊ธฐ ์ํ ์คํ์ ์ง์์ด ํฌํจ๋์ด ์์ผ๋ฏ๋ก ์ค์น ๋๋ ๋ณ๋์ ๋น๋ ๋จ๊ณ๊ฐ ํ์ํ์ง ์์ต๋๋ค. ์ด๋ฅผ ํตํด Next.js๋ ๋ก์ปฌ ์ข ์์ฑ๊ณผ ๋๊ฐ์ด ์๊ฒฉ HTTP(S) ๋ฆฌ์์ค๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. URL ๊ฐ์ ธ์ค๊ธฐ๊ฐ ๊ฐ์ง๋๋ฉด Next.js๋ ์๊ฒฉ ๋ฆฌ์์ค๋ฅผ ์ถ์ ํ๊ธฐ ์ํด next.lock ํ์ผ์ ์์ฑํฉ๋๋ค. URL ๊ฐ์ ธ์ค๊ธฐ๋ ์คํ๋ผ์ธ์์ ๊ณ์ ์์ ํ ์ ์๋๋ก ๋ก์ปฌ๋ก ์บ์๋ฉ๋๋ค. Next.js๋ ํด๋ผ์ด์ธํธ ๋ฐ ์๋ฒ URL ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ๋ชจ๋ ์ง์ํฉ๋๋ค.
module.exports = {
experimental: {
urlImports: ['https://cdn.skypack.dev']
}
}
๊ทธ๋ฐ ๋ค์ URL์์ ์ง์ ๋ชจ๋์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
import confetti from 'https://cdn.skypack.dev/canvas-confetti'
- Next.js์์ ํน์ ํ์ด์ง๋ฅผ ์ ์ ํ์ด์ง๋ก ๋น๋ ํ์์ ๋ ๋๋ง์ ํด๋ฒ๋ฆฌ๋ getStaticProps()๊ฐ ์๋๋ฐ, ์ด๋ ๊ฒ ๋ฏธ๋ฆฌ ๋น๋ ํ์์ ๋ ๋๋ง์ ํ๋ฉด, ๋น๋ ์ ์์ฒญํ๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ค์ ๊ทธ๋๋ก ๊ณ ์ ์ด ๋๋ค. ๋ฐ๋ผ์ ๊ทธ ๋น์ APi ์์ฒญ ๋ฑ์ผ๋ก ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๊ฐ ์ดํ์ ์
๋ฐ์ดํธ๊ฐ ๋์ด๋, ํด๋น ํ์ด์ง์์๋ ๋ณํจ์์ด ์ ์ ํ์ด์ง๋ก ์ ์ ์๊ฒ ๋ด๋ ค์ค๋ค.
- ๊ทธ๋ฌ๋ ISR ์ฒ๋ฆฌ๋ฅผ ํ๋ฉด, ์ฃผ๊ธฐ์ ์ผ๋ก ํด๋น ํ์ด์ง๋ฅผ ์๋กญ๊ฒ ๋ ๋๋ง์ ํด์ ์ ๋ฐ์ดํธ๋ฅผ ํด์ ์ฃผ๊ธฐ์ ์ ์ ํ์ด์ง๋ฅผ ์ต์ ์ผ๋ก ์ ๋ฐ์ดํธ์ํฌ ์ ์๋ค.
- ISR ํ์ด์ง์์ Fallback: true ์ฒ๋ฆฌ๋ฅผ ํ๋ฉด, ์ ์ ์์ฒญ ํ ์์ง ์๋กญ๊ฒ ๋ ๋๋ง ๋ ํ์ด์ง๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ ์, ๋ ๋๋ง์ด ์๋ฃํ๊ธฐ ์ ๊น์ง๋ ์ด์ ์ ๊ฐ์ง๊ณ ์๋ ์ ์ ํ์ด์ง๋ฅผ ์์๋ก ๋จผ์ ๋ณด์ฌ์ฃผ๊ฒ ๋๋ค. -๊ทธ๋ฌ๋ ๋ง์ฝ ํฌ๋กค๋ฌ ๋ด์ด ํด๋น ํ์ด์ง์ ๋ฐฉ๋ฌธํ์ฌ ํฌ๋กค๋งํ๋๋ฐ ๋์ค์ ํ์ด์ง๊ฐ ๋ณ๊ฒฝ๋์ด ๋ฒ๋ฆฌ๋ฉด ์๋ํ์ง ์์ ํฌ๋กค๋ง ์์ง์ด ๋์ด๋ฒ๋ฆฌ๊ณ ๋ง๋ค.
- Next.js 12์์ ์น ํฌ๋กค๋ฌ(์: ๊ฒ์ ๋ด)๋ ํฌ๋กค๋ฌ๊ฐ ์๋ ์ผ๋ฐ ์ ์ ์๊ฒ๋ ISR ํ์ด์ง์ ๊ธฐ์กด ๋์์ ๊ทธ๋๋ก ์ํํ๋๋ก ํ์ง๋ง, ์ผ๋ฐ ์ ์ ์๊ฒ๋ User-Agent๋ฅผ ํตํด ์ ์ ์ธ์ง ํ๋จํ๊ณ ๊ธฐ์กด๋๋ก ํด๋ฐฑ ์ํ์ ๋์์ ์ํํ ์ ์๋ค.
-
๋ด์ฅ๋ Image Optimization API๋ ์ด์ AVIF ์ด๋ฏธ์ง๋ฅผ ์ง์ํ์ฌ WebP์ ๋นํด 20% ๋ ์์ ์ด๋ฏธ์ง๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
-
AVIF ์ด๋ฏธ์ง๋ WebP์ ๋นํด ์ต์ ํํ๋ ๋ฐ ์๊ฐ์ด ๋ ์ค๋ ๊ฑธ๋ฆด ์ ์์ผ๋ฏ๋ก next.config.js์ ์๋ก์ด images.formats ์์ฑ์ ์ฌ์ฉํ์ฌ ์ด ๊ธฐ๋ฅ์ ์ ํํ๋๋ก ํฉ๋๋ค.
module.exports = {
images: {
formats: ['image/avif', 'image/webp']
}
}
- page/_app.js ๋๋ _document.js๋ฅผ ์ถ๊ฐํ๋ ๊ฒ๋ CLI rebootํ ํ์ ์์ด ์๋์ผ๋ก ์ ์ฉ๋๋ค.
- The ESLint integration now supports single-file linting in next lint with the --file flag.
- Next.js 12 now supports setting a custom tsconfig.json path.
- tsconfig.json ์์น๋ฅผ ์ฎ๊ธธ ์ ์๋ค๋ ๊ฒ ๊ฐ๋ค.(๊ทธ๋ด์ผ ์์ ๊ฒ ๊ฐ์ง๋ง)
- next.config.mjs is now supported for writing the configuration as ES modules.
- In-flight requests are now de-duped for getStaticProps.
- Checking for static pages now runs using a shared worker pool.
- ๋น ๋ฅธ ์๋ก ๊ณ ์นจ์ ์ด์ EventSource ์ฐ๊ฒฐ ๋์ WebSocket ์ฐ๊ฒฐ์ ์ฌ์ฉํฉ๋๋ค.
- Next.js 11์์ webpack 5๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ํ ํ ์ด์ ๊ณต์์ ์ผ๋ก webpack 4๋ฅผ ์ ๊ฑฐํ์ต๋๋ค. ์ฐ๋ฆฌ๋ webpack 5๋ก์ ์ํํ ์ ํ์ ์ํด ์ปค๋ฎค๋ํฐ์ ๊ธด๋ฐํ ํ๋ ฅํ์ต๋๋ค.
- target in next.config.js is no longer needed.
- next/image now uses a span as the wrapping element instead of a div.
- The minimum Node.js version has been bumped from 12.0.0 to 12.22.0, which is the first version of Node.js with native ES modules support.
- https://youtu.be/dMBYI7pTR4Q
- https://nextjs.org/blog/next-12
- https://helloinyong.tistory.com/321
- https://reactjs.org/blog/2021/06/08/the-plan-for-react-18.html
- https://ko.wikipedia.org/wiki/%EB%9F%AC%EC%8A%A4%ED%8A%B8_(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%96%B8%EC%96%B4)
- AVIF ์ด๋ฏธ์ง ๋?
- https://velog.io/@gth1123/Next.js-version-12