2024-03-29.md

๐Ÿก

DIL: ๋ชจ๋˜ ๋ฆฌ์•กํŠธ ๋”ฅ ๋‹ค์ด๋ธŒ, 4์ฃผ์ฐจ-5

์Šคํ„ฐ๋””: ์›”๊ฐ„ CS, https://github.com/monthly-cs/2024-03-modern-react-deep-dive
์˜ค๋Š˜ ์ง„ํ–‰: ๊ฐœ์ธ๊ณต๋ถ€


DIL-week4-5_2024-03-29

| DIL ์ฃผ์ฐจ | ๋ฒ”์œ„ | ๋‚ด์šฉ | ์˜ค๋Š˜์ฐจ ์ง„๋„ | | -------- | ------ | ------------------------------- | ----------- | | 4์ฃผ์ฐจ | 4, 8์žฅ | SSR๊ณผ ESlint, ํ…Œ์ŠคํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ | 329p~335p |

์˜ค๋Š˜ ์ฝ์€ ๋‚ด์šฉ์„ markdown์œผ๋กœ ๊ฐ„๋‹จํžˆ ๋ฉ”๋ชจ
์ฝ์€ ์‹œ๊ฐ„: 12์‹œ 50๋ถ„ ~ 1์‹œ๋ฐ˜
์ €๋…์•ฝ์† ์ด์Šˆ => ์ ์‹ฌ์‹œ๊ฐ„ ๊ณต๋ถ€


Next.js ํ†บ์•„๋ณด๊ธฐ

_app.tsx ์‘์šฉํ•˜๊ธฐ

  • app.getInitialProps: context.ctx?.req?.url
    import App, {AppContext} from 'next/app'
    import type {AppProps} from 'next/app'
    
    ...
    
    MyApp.getInitialProps = async (context: AppContext) => {
    	const appProps = await App.getInitialProps(context)
    	const isServer = Boolean(context.ctx.req)
    	console.log(
    		`[${isServer ? '์„œ๋ฒ„' : 'ํด๋ผ์ด์–ธํŠธ'}] ${context.router.pathname}์—์„œ ${context.ctx?.req?.url} ์š”์ฒญ`
    	)
    	return appProps
    }
    
  • ์‹คํ–‰ ์ ˆ์ฐจ | ์ˆœ์„œ | ๋กœ๊ทธ | ์ด์œ  | | ----------------------------------------------------------- | ----------------------------------------------------------- | ------------------------------------------------------------------ | | ์ž์ฒด ํŽ˜์ด์ง€ getInitialProps๋ฅผ ๋ฐฉ๋ฌธ | [์„œ๋ฒ„] /test/GIP์—์„œ /test/GIP๋ฅผ ์š”์ฒญ | ์„œ๋ฒ„ ์‚ฌ์ด๋“œ์˜ ๋žœ๋”๋ง ์ „์ฒด์ ์œผ๋กœ ์ž‘๋™ | | getServerSideProps๊ฐ€ ์žˆ๋Š” ํŽ˜์ด์ง€๋ฅผ <Link>๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐฉ๋ฌธ | [์„œ๋ฒ„] /test/GSSP์—์„œ /_next/data/~~/test/GSSP.json์„ ์š”์ฒญ | ํŽ˜์ด์ง€์— ์„œ๋ฒ„ ๊ด€๋ จ ๋กœ์ง์ด ์žˆ๋”๋ผ๋„ json ํŒŒ์ผ๋งŒ์„ ์š”์ฒญํ•˜์—ฌ ๊ฐ€์ ธ์˜จ๋‹ค | | ๋‹ค์‹œ 1๋ฒˆ์˜ ํŽ˜์ด์ง€๋ฅผ <Link>๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐฉ๋ฌธ | [ํด๋ผ์ด์–ธํŠธ] /test/GSSP์—์„œ undefined๋ฅผ ์š”์ฒญ | | | ๋‹ค์‹œ 2๋ฒˆ์˜ ํŽ˜์ด์ง€๋ฅผ <Link>๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐฉ๋ฌธ | [์„œ๋ฒ„] /test/GSSP์—์„œ /_next/data/~~/test/GSSP.json์„ ์š”์ฒญ | ํ•ด๋‹น ํŽ˜์ด์ง€์˜ json ์š”์ฒญ (req.url์ด /_next๋กœ ์‹œ์ž‘) |
  • ์ •์ƒ์ ์ธ ์ตœ์ดˆ ํŽ˜์ด์ง€ ์ ‘๊ทผ
    1. req๊ฐ€ ์žˆ๋‹ค๋ฉด? ์„œ๋ฒ„๋กœ ์˜ค๋Š” ์š”์ฒญ
    2. req.url์ด /_next๋กœ ์‹œ์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค = ํด๋ผ์ด์–ธํŠธ ๋žœ๋”๋ง์œผ๋กœ ์ธํ•œ ์š”์ฒญ์ด ์•„๋‹˜
    3. ์ ‘๊ทผ ์š”์ฒญํ•˜๋Š” pathname์ด ์—๋Ÿฌ ํŽ˜์ด์ง€๊ฐ€ ์•„๋‹˜
    MyApp.getInitialProps = async (context: AppContext) => {
      const appProps = await App.getInitialProps(context);
      const {
        ctx: { req },
        router: { pathname },
      } = context;
    
      if (
        req && // 1
        !req.url?.startsWith("/_next") && // 2
        !["/500", "/400", "/_error"].includes(pathname) // 2
      ) {
        doSomethingOnlyOnce(); // ์ตœ์ดˆ๋กœ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋žœ๋”๋ง์„ ์ˆ˜ํ–‰ํ–ˆ์„ ๋•Œ, ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค
      }
    
      return appProps;
    };
    

Next.config.js

  • basePath: ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์ฃผ์†Œ (url prefix)

    • { basePath: โ€œdocsโ€ }๋Š” ๋„๋ฉ”์ธ/docs ์—์„œ ์„œ๋น„์Šค ์‹œ์ž‘
    • ๋žœ๋”๋ง ์‹œ ์ฃผ์†Œ์— basePath๊ฐ€ ๋ถ™์€ ์ฑ„ ํด๋ผ์ด์–ธํŠธ ๋žœ๋”๋ง
    • Next.js ์ œ๊ณต ๊ธฐ๋Šฅ์ด๋ฏ€๋กœ โ‡’ a, window.location.push์— ์ ์šฉ ์•ˆ ๋จ
  • powerByHeader: false

    • ์‘๋‹ต ํ—ค๋” X-Power-by: Next.js ์ •๋ณด ์ œ๊ณต โ‡’ ๋ณด์•ˆ ๊ด€์ ์—์„œ ์ทจ์•ฝ์ ์ด๋ฏ€๋กœ false๊ฐ€ ์ข‹๋‹ค
  • redirect ๋ฉ”์†Œ๋“œ: ์ •๊ทœ์‹ ์‚ฌ์šฉ ๊ฐ€๋Šฅ!

    {
    redirects() {
      return [
        {
          // /tag/foo => /tag/foo/pages/1
          source: '/tag/:tag',
          destination: '/tag/:tag/pages/1',
          permanent: true,
        },
        {
          // /tag/foo/page/1 => /tags/foo/pages/1
          source: '/tag/:tag/page/:no',
          destination: '/tags/:tag/pages/:no',
          permanent: true,
        },
        {
          // /tags/foo/pages/something => /tags/foo/pages/1
          source: '/tags/:tag/pages/((?!\\d).*)',
          destination: '/tags/:tag/pages/1',
          permanent: true
        }
      ]
    }
    }
    
  • reactStrictMode: ๋ฆฌ์•กํŠธ ์—„๊ฒฉ ๋ชจ๋“œ, default false์ž„. true๋กค ๋ฆฌ์•กํŠธ ์—…๋ฐ์ดํŠธ์— ๋Œ€๋น„

  • assetPrefix: ๋™์ผ ํ˜ธ์ŠคํŠธ๊ฐ€ ์•„๋‹Œ CDN์— ์—…๋กœ๋“œ

    • static ๋ฆฌ์†Œ์Šค๋“ค์ด ํ•ด๋‹น ์ฃผ์†Œ ์žˆ๋‹ค๊ณ  ๊ฐ€์ • ex) ์ •์ ์ธ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณ„๋„ CDN์— ์—…๋กœ๋“œ
    assetPrefix: isProduction ? "https://cdn.somewhere.com" : undefined;