Next.js version 12 - TEAM-ARK/inflearn-clone-front GitHub Wiki

Next.js 12

์ด๋ฒˆ์— Next.js์˜ ๋ฒ„์ „ 12๊ฐ€ ๋‚˜์˜จ ๊ฒƒ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

** Next.js 12 ๊ณต์‹ ์˜์ƒ ๋ฐ ๋ฌธ์„œ **

https://youtu.be/dMBYI7pTR4Q

https://nextjs.org/blog/next-12

Update today by running npm i next@latest.

์ฃผ์š” ๋ฆด๋ฆฌ์ฆˆ

1. ๋Ÿฌ์ŠคํŠธ ์ปดํŒŒ์ผ๋Ÿฌ

  • ์ตœ๋Œ€ 3๋ฐฐ ๊นŒ์ง€ ๋” ๋น ๋ฅธ ์ƒˆ๋กœ๊ณ ์นจ
  • ์ตœ๋Œ€ 5๋ฐฐ ๊นŒ์ง€ ๋” ๋น ๋ฅธ ๋นŒ๋“œ

2. ๋ฏธ๋“ค์›จ์–ด(๋ฒ ํƒ€)

  • Next.js์—์„œ ์™„์ „ ์œ ์—ฐ์„ฑ ํ™œ์„ฑํ™”

3. React 18 ๋ฒ„์ „ ์ง€์›

  • React 18 ๋ฒ„์ „
    • ๋‹ค์Œ ํฌ์ŠคํŠธ์—์„œ ์ •๋ฆฌํ•˜์ž
  • Suspense ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Native Next.js APIs๊ฐ€ ์ด์ œ ์ง€์›๋œ๋‹ค.

4. <Image /> AVIF ์ง€์›

  • webP๋ณด๋‹ค 20% ์••์ถœ๋ฅ ์ด ๋” ์ข‹์€ AVIF ํฌ๋งท ์ง€์›

5. Bot-aware ISR Fallback

  • ์›น ํฌ๋กค๋Ÿฌ์— ์ตœ์ ํ™”๋œ SEO

6. Native ES Modules Support

  • ํ‘œ์ค€ํ™”๋œ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ๊ณผ์˜ ์—ฐ๊ณ„

7. URL Imports (alpha)

  • Import packages from any URL, no installs required
  • cdn๊ฐ™์€ ๊ณณ์— ์žˆ๋Š” js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜์—†์ด ๋” ์‰ฝ๊ฒŒ importํ•˜๋Š” ๋ฐฉ๋ฒ•์ธ ๊ฒƒ ๊ฐ™๋‹ค.
    • ๋ณดํ†ต head์—์„œ scriptํƒœ๊ทธ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐ๋œ๋‹ค.

8. React Server Components (alpha)

  • ์ปดํฌ๋„ŒํŠธ ๋ ˆ๋ฒจ์—์„œ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋‹จ ๋กœ์ง๊นŒ์ง€ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‚ด์šฉ.
    • ๊ฐ€์žฅ ํฅ๋ฏธ๋กญ๊ฒŒ ์ƒ๊ฐ๋˜๋Š” ๋ถ€๋ถ„์ด๋‹ค.
    • ์—ฌํƒœ๊นŒ์ง€ next.js๋ฅผ ์ œ๋Œ€๋กœ ํ™œ์šฉ์„ ๋ชป ํ–ˆ์—ˆ๋Š”๋ฐ ์ด๊ฒƒ์„ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์ง€๊ธˆ ์ง„ํ–‰์ค‘์ธ ํ”„๋กœ์ ํŠธ์—๋„ ์ ์šฉ์„ ํ•ด๋ด์•ผ๊ฒ ๋‹ค.

Faster builds and Fast Refresh with Rust compiler

์›๋ž˜ 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
}

Introducting Middleware

์š”์ฒญ์ด ์™„๋ฃŒ๋˜๊ธฐ ์ „์— ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ Next.js์—์„œ ์™„์ „ํ•œ ์œ ์—ฐ์„ฑ(full flexibility)์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์— ๋”ฐ๋ผ ์žฌ์ž‘์„ฑ, ๋ฆฌ๋””๋ ‰์…˜, ํ—ค๋” ์ถ”๊ฐ€ ๋˜๋Š” HTML ์ŠคํŠธ๋ฆฌ๋ฐ๊นŒ์ง€ ์‘๋‹ต์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Next.js์—์„œ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด pages/_middleware.js ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ๋Š” ํ‘œ์ค€ Web API ์‘๋‹ต(MDN)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

export function middleware(req, ev) {
  return new Response('Hello, world!')
}

(๋ฏธ๋“ค์›จ์–ด๋ฅผ ์“ด๋‹ค๋ฉด ํŽ˜์ด์ง€ ์ ‘๊ทผ ๊ถŒํ•œ์ด ์—†๋Š” ๊ฒฝ์šฐ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ํ•˜๋Š” ๊ฒƒ์„ ์—ฌ๊ธฐ์—์„œ ์ฒ˜๋ฆฌํ•ด๋„ ๋  ๊ฒƒ ๊ฐ™๋‹ค.)

๋ฏธ๋“ค์›จ์–ด์— ๋Œ€ํ•œ ์ •๋ณด ๋” ๋ณด๊ธฐ

Preparing for React 18

React 18์€ Suspense, ์—…๋ฐ์ดํŠธ ์ž๋™ ์ผ๊ด„ ์ฒ˜๋ฆฌ, startTransition๊ณผ ๊ฐ™์€ API ๋ฐ React.lazy๋ฅผ ์ง€์›ํ•˜๋Š” ์„œ๋ฒ„ ๋ Œ๋”๋ง์„ ์œ„ํ•œ ์ƒˆ๋กœ์šด ์ŠคํŠธ๋ฆฌ๋ฐ API์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

ํŽ˜์ด์Šค๋ถ์˜ React ํŒ€๊ณผ ๊ธด๋ฐ€ํžˆ ํ˜‘๋ ฅํ•˜์—ฌ React 18์ด ์•ˆ์ •์ ์ธ ๋ฆด๋ฆฌ์Šค๋ฅผ ํ–ฅํ•ด ๋‚˜์•„๊ฐ€๊ธฐ ์œ„ํ•ด Next.js๋ฅผ ์ค€๋น„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์‹คํ—˜์  ํ”Œ๋ž˜๊ทธ๋กœ Next.js 12์—์„œ ์˜ค๋Š˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. npm install react@alpha react-dom@alpha

Server-Side Streaming

React 18์˜ ๋™์‹œ ๊ธฐ๋Šฅ์—๋Š” ์„œ๋ฒ„ ์ธก Suspense ๋ฐ SSR ์ŠคํŠธ๋ฆฌ๋ฐ ์ง€์›์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ œ๊ณต ์ง€์›์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด HTTP ์ŠคํŠธ๋ฆฌ๋ฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€๋ฅผ ์„œ๋ฒ„ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Next.js 12์˜ ์‹คํ—˜์ ์ธ ๊ธฐ๋Šฅ์ด์ง€๋งŒ ์ผ๋‹จ ํ™œ์„ฑํ™”๋˜๋ฉด SSR์€ ๋ฏธ๋“ค์›จ์–ด์™€ ๋™์ผํ•œ ์—„๊ฒฉํ•œ ๋Ÿฐํƒ€์ž„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ์‹คํ—˜ ํ”Œ๋ž˜๊ทธ์ธ concurrentFeatures: true๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

// next.config.js
module.exports = {
  experimental: {
    concurrentFeatures: true
  }
}

React Server Components

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ํŒŒ์ผ๋กœ ํ‘œํ˜„๋œ๋‹ค๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

ES Modules Support and URL Imports

Next.js 11.1๋ถ€ํ„ฐ CommonJS ๋ชจ๋“ˆ๋ณด๋‹ค ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’์€ ES ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ์‹คํ—˜ ์ง€์›์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. Next.js 12์—์„œ๋Š” ์ด๊ฒƒ์ด ์ด์ œ ๊ธฐ๋ณธ๊ฐ’์ž…๋‹ˆ๋‹ค. CommonJS๋งŒ ์ œ๊ณตํ•˜๋Š” NPM ๋ชจ๋“ˆ ๊ฐ€์ ธ์˜ค๊ธฐ๋Š” ๊ณ„์† ์ง€์›๋ฉ๋‹ˆ๋‹ค.

URL Imports

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'

Bot-์ธ์‹์„ ํ†ตํ•œ ISR Fallback ์ฒ˜๋ฆฌ

ISR(Incremental Static Generation) ํŽ˜์ด์ง€

  • Next.js์—์„œ ํŠน์ • ํŽ˜์ด์ง€๋ฅผ ์ •์  ํŽ˜์ด์ง€๋กœ ๋นŒ๋“œ ํƒ€์ž„์— ๋ Œ๋”๋ง์„ ํ•ด๋ฒ„๋ฆฌ๋Š” getStaticProps()๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ๋ฏธ๋ฆฌ ๋นŒ๋“œ ํƒ€์ž„์— ๋ Œ๋”๋ง์„ ํ•˜๋ฉด, ๋นŒ๋“œ ์‹œ ์š”์ฒญํ–ˆ๋˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋“ค์€ ๊ทธ๋Œ€๋กœ ๊ณ ์ •์ด ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ทธ ๋‹น์‹œ APi ์š”์ฒญ ๋“ฑ์œผ๋กœ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๊ฐ€ ์ดํ›„์— ์—…๋ฐ์ดํŠธ๊ฐ€ ๋˜์–ด๋„, ํ•ด๋‹น ํŽ˜์ด์ง€์—์„œ๋Š” ๋ณ€ํ•จ์—†์ด ์ •์  ํŽ˜์ด์ง€๋กœ ์œ ์ €์—๊ฒŒ ๋‚ด๋ ค์ค€๋‹ค.
    • ๊ทธ๋Ÿฌ๋‚˜ ISR ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋ฉด, ์ฃผ๊ธฐ์ ์œผ๋กœ ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กญ๊ฒŒ ๋ Œ๋”๋ง์„ ํ•ด์„œ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•ด์„œ ์ฃผ๊ธฐ์  ์ •์  ํŽ˜์ด์ง€๋ฅผ ์ตœ์‹ ์œผ๋กœ ์—…๋ฐ์ดํŠธ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
  • ISR ํŽ˜์ด์ง€์—์„œ Fallback: true ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋ฉด, ์œ ์ € ์š”์ฒญ ํ›„ ์•„์ง ์ƒˆ๋กญ๊ฒŒ ๋ Œ๋”๋ง ๋œ ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ์ „์—, ๋ Œ๋”๋ง์ด ์™„๋ฃŒํ•˜๊ธฐ ์ „๊นŒ์ง€๋Š” ์ด์ „์— ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ์ •์  ํŽ˜์ด์ง€๋ฅผ ์ž„์‹œ๋กœ ๋จผ์ € ๋ณด์—ฌ์ฃผ๊ฒŒ ๋œ๋‹ค. -๊ทธ๋Ÿฌ๋‚˜ ๋งŒ์•ฝ ํฌ๋กค๋Ÿฌ ๋ด‡์ด ํ•ด๋‹น ํŽ˜์ด์ง€์— ๋ฐฉ๋ฌธํ•˜์—ฌ ํฌ๋กค๋งํ•˜๋Š”๋ฐ ๋„์ค‘์— ํŽ˜์ด์ง€๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด ๋ฒ„๋ฆฌ๋ฉด ์˜๋„ํ•˜์ง€ ์•Š์€ ํฌ๋กค๋ง ์ˆ˜์ง‘์ด ๋˜์–ด๋ฒ„๋ฆฌ๊ณ  ๋งŒ๋‹ค.
  • Next.js 12์—์„œ ์›น ํฌ๋กค๋Ÿฌ(์˜ˆ: ๊ฒ€์ƒ‰ ๋ด‡)๋Š” ํฌ๋กค๋Ÿฌ๊ฐ€ ์•„๋‹Œ ์ผ๋ฐ˜ ์œ ์ €์—๊ฒŒ๋Š” ISR ํŽ˜์ด์ง€์˜ ๊ธฐ์กด ๋™์ž‘์„ ๊ทธ๋Œ€๋กœ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•˜์ง€๋งŒ, ์ผ๋ฐ˜ ์œ ์ €์—๊ฒŒ๋Š” User-Agent๋ฅผ ํ†ตํ•ด ์œ ์ €์ธ์ง€ ํŒ๋‹จํ•˜๊ณ  ๊ธฐ์กด๋Œ€๋กœ ํด๋ฐฑ ์ƒํƒœ์˜ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

Smaller images using AVIF

  • ๋‚ด์žฅ๋œ Image Optimization API๋Š” ์ด์ œ AVIF ์ด๋ฏธ์ง€๋ฅผ ์ง€์›ํ•˜์—ฌ WebP์— ๋น„ํ•ด 20% ๋” ์ž‘์€ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

  • AVIF ์ด๋ฏธ์ง€๋Š” WebP์— ๋น„ํ•ด ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ next.config.js์˜ ์ƒˆ๋กœ์šด images.formats ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๊ธฐ๋Šฅ์„ ์„ ํƒํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

module.exports = {
  images: {
    formats: ['image/avif', 'image/webp']
  }
}

Other Improvements

  • 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 ์—ฐ๊ฒฐ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Breaking Changes(์ฃผ์š” ๋ณ€๊ฒฝ์‚ฌํ•ญ)

  • 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.

์ฐธ๊ณ 

โš ๏ธ **GitHub.com Fallback** โš ๏ธ