Granular Chunking

terry yoonΒ·2022λ…„ 12μ›” 9일
0
post-custom-banner

πŸ’‘ 이 글을 λ²ˆμ—­ 및 ν•΄μ„ν•œ κΈ€ μž…λ‹ˆλ‹€.

크둬은 μžλ°”μŠ€ν¬λ¦½νŠΈ μ˜€ν”ˆμ†ŒμŠ€ μƒνƒœκ³„μ˜ ν”„λ ˆμž„ μ›Œν¬ 및 도ꡬ듀과 ν˜‘λ ₯ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μ΅œκ·Όμ—, Nextjs와 Gatsby의 λ‘œλ”© 속도λ₯Ό ν–₯μƒμ‹œν‚€κΈ° μœ„ν•΄ μˆ˜λ§Žμ€ μ‹ κ·œ μ΅œμ ν™”κ°€ μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 이 글은 두 ν”„λ ˆμž„μ›Œν¬μ—μ„œ 차용 쀑인 ν–₯μƒλœ granular Chunking μ „λž΅μ— λŒ€ν•΄ λ‹€λ£Ήλ‹ˆλ‹€.

Introduction

λ§Žμ€ μ›Ή ν”„λ ˆμž„μ›Œν¬μ™€ 같이, Next.js와 GatsbyλŠ” μ›ΉνŒ©μ„ μ£Όμš” λ²ˆλ“€λŸ¬λ‘œ μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μ›ΉνŒ© v3μ—μ„œλŠ” μ„œλ‘œ λ‹€λ₯Έ entry point κ°„ κ³΅μœ λ˜λŠ” λͺ¨λ“ˆ(e.g ν•΄μ„μž 주석 - μ„œλ‘œ λ‹€λ₯Έ νŽ˜μ΄μ§€μ΄μ§€λ§Œ μ„œλ‘œ κ³΅μœ ν•˜λŠ” λͺ¨λ“ˆλ‘œ 예λ₯Ό λ“€μ–΄ react와 같은 λͺ¨λ“ˆ)을 단일(λ˜λŠ” 일뢀)의 β€œcommon” chunk둜 λ§Œλ“€ 수 μžˆλ„λ‘ CommonChunkPlugin 을 μ†Œκ°œν•˜μ˜€μŠ΅λ‹ˆλ‹€. κ³΅μœ λ˜λŠ” μ½”λ“œλŠ” 각각 λ‹€μš΄λ°›μ„ 수 있고, λΈŒλΌμš°μ € μΊμ‹œμ— μ €μž₯λ˜μ–΄ 결과적으둜 λ‘œλ”© 속도 κ°œμ„ μ— κΈ°μ—¬ν•©λ‹ˆλ‹€.(e.g ν•΄μ„μž 주석 - κ³΅μœ ν•˜λŠ” λͺ¨λ“ˆμ„ 미리 λ‹€μš΄λ°›κ³  μ €μž₯ν•˜κ³  있으면, λ‹€μŒ entry point에 μ§„μž…ν•  λ•Œ λ”°λ‘œ λ‹€μš΄λ°›μ§€ μ•Šμ•„λ„ 되기 λ•Œλ¬Έ)

이런 νŒ¨ν„΄μ€, λ‹€μŒκ³Ό 같은 λ²ˆλ“€λ§ 섀정을 μ±„νƒν•œ λ§Žμ€ SPA ν”„λ ˆμž„μ›Œν¬μ—μ„œ λ„μž…λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

common chunk strategy

비둝 μ‹€μš©μ μ΄μ§€λ§Œ, λͺ¨λ“  곡유 λͺ¨λ“ˆμ„ ν•˜λ‚˜μ˜ chunk둜 κ³΅μœ ν•œλ‹€λŠ” 컨셉은 μ œμ•½μ΄ μžˆμŠ΅λ‹ˆλ‹€. λͺ¨λ“  entryPointμ—μ„œ κ³΅μœ λ˜μ§€ μ•ŠλŠ” λͺ¨λ“ˆλ„ ν•΄λ‹Ή λͺ¨λ“ˆμ΄ ν•„μš”μ—†λŠ” κ²½λ‘œμ—μ„œλ„ 결과적으둜 λ‹€μš΄λ‘œλ“œ λ˜λŠ” κ²°κ³Όκ°€ μ΄ˆλž˜λ©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ page1μ—μ„œ common chunkλ₯Ό λ‹€μš΄λ°›μ„ λ•Œ, page1이 moduleCλ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠμŒμ—λ„ ν•΄λ‹Ή μ½”λ“œλ₯Ό λ‹€μš΄λ‘œλ“œ λ°›κ²Œ λ©λ‹ˆλ‹€. 이런 이유둜, μ›ΉνŒ© v4λŠ” ν•΄λ‹Ή ν”ŒλŸ¬κ·ΈμΈ μ œκ±°ν•˜κ³  μƒˆλ‘œμš΄ ν”ŒλŸ¬κ·ΈμΈμ„ λ„μž…ν–ˆμŠ΅λ‹ˆλ‹€ : SplitChunksPlugin

Improved Chunking

SplitChunksPlugin의 κΈ°λ³Έ 섀정은 λŒ€λΆ€λΆ„μ˜ μ‚¬μš©μžμ—κ²Œ 잘 λ™μž‘ν•©λ‹ˆλ‹€. λ‹€μˆ˜μ˜ κ²½λ‘œμ— κ±Έμ³μ„œ μ€‘λ³΅λœ μ½”λ“œλ₯Ό fetchingν•˜μ§€ μ•Šλ„λ‘ ν•˜κΈ° μœ„ν•œ 쑰건을 κΈ°λ°˜ν•˜μ—¬ λ‹€μˆ˜μ˜ λΆ„ν• λœ chunk듀이 μƒμ„±λ©λ‹ˆλ‹€.

ν•˜μ§€λ§Œ, ν•΄λ‹Ή ν”ŒλŸ¬κ·ΈμΈμ„ μ‚¬μš©ν•˜λŠ” λ‹€μˆ˜μ˜ μ›Ή ν”„λ ˆμž„μ›Œν¬λ“€μ€ μ—¬μ „νžˆ chunk 뢄할을 μœ„ν•΄ β€œλ‹¨μΌ commons” μ „λž΅μ„ μ·¨ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ Next.jsλŠ” 50% μ΄μƒμ˜ νŽ˜μ΄μ§€μ—μ„œ μ‚¬μš©ν•˜λŠ” λͺ¨λ“ˆκ³Ό λͺ¨λ“  ν”„λ ˆμž„μ›Œν¬ μ˜μ‘΄μ„± λͺ¨λ“ˆ(react, react-dom λ“±)을 ν¬ν•¨ν•˜λŠ” 단일 commons λ²ˆλ“€μ„ μƒμ„±ν•©λ‹ˆλ‹€.

const splitChunksConfigs = {
  …
  prod: {
    chunks: 'all',
    cacheGroups: {
      default: false,
      vendors: false,
      commons: {
        name: 'commons',
        chunks: 'all',
        minChunks: totalPages > 2 ? totalPages * 0.5 : 2,
      },
      react: {
        name: 'commons',
        chunks: 'all',
        test: /[\\/]node_modules[\\/](react|react-dom|scheduler|use-subscription)[\\/]/,
      },
    },
  },

비둝 framework-dependent code(react λ“±)λ₯Ό ν•˜λ‚˜μ˜ 곡유된 chunk둜 ν¬ν•¨ν•œλ‹€λŠ” 건 μ–΄λ–€ entryPoint 든지 λ‹€μš΄λ°›μ€ λ‹€μŒ μΊμ‹œλ  수 μžˆλŠ”κ±Έ μ˜λ―Έν•˜μ§€λ§Œ, 절반 μ΄μƒμ˜ νŽ˜μ΄μ§€ μ΄μƒμ—μ„œ ν•˜μš©λ˜λŠ” 곡톡 λͺ¨λ“ˆμ„ ν¬ν•¨ν•˜λŠ” μ‚¬μš© 기반(usage-based)의 접근법(ν•™μŠ΅λ²•)은 맀우 νš¨μœ¨μ μ΄μ§€ λͺ»ν•©λ‹ˆλ‹€. 이 λΉ„μœ¨μ„ μ‘°μ •ν•˜λŠ” 것은 λ‹€μŒ 두 κ²°κ³Όλ₯Ό μ•ΌκΈ°ν•©λ‹ˆλ‹€.

  • λΉ„μœ¨μ„ 쀄인닀면, λ”μš± λΆˆν•„μš”ν•œ μ½”λ“œκ°€ λ‹€μš΄λ°›μ•„μ§„λ‹€.
  • λΉ„μœ¨μ„ 올리면, λ‹€μˆ˜μ˜ routes(entrypoints)에 걸친 μ€‘λ³΅λœ μ½”λ“œκ°€ ν¬ν•¨λœλ‹€.

이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œ, Next.jsλŠ” λΆˆν•„μš”ν•œ μ½”λ“œλ₯Ό 쀄이기 μœ„ν•΄ SplitChunksPlugin을 μœ„ν•œ λ‹€λ₯Έ 섀정을 μ±„νƒν–ˆμŠ΅λ‹ˆλ‹€.

  • (160KBκ°€ λ„˜λŠ”) μΆ©λΆ„νžˆ 큰 μ„œλ“œνŒŒν‹° λͺ¨λ“ˆμ˜ 경우 λ³„λ„μ˜ chunk둜 λΆ„λ¦¬ν•œλ‹€.
  • ν”„λ ˆμž„μ›Œν¬ κ΄€λ ¨λœ λͺ¨λ“ˆ(react λ“±)은 framworks λΌλŠ” μ΄λ¦„μ˜ κ°œλ³„ chunk둜 λΆ„λ¦¬ν•œλ‹€.
  • ν•„μš”ν•œ 만큼의 λ§Žμ€ 곡유 chunksλ₯Ό λ§Œλ“ λ‹€ (μ΅œλŒ€ 25개)
  • μƒμ„±λ˜λŠ” chunk의 μ΅œμ†Œ μ‚¬μ΄μ§€λŠ” 20KB둜 λ³€κ²½λ˜μ—ˆλ‹€.

이런 granular Chunking μ „λž΅μ€ λ‹€μŒκ³Ό 같은 이점을 μ œκ³΅ν•©λ‹ˆλ‹€.

  • νŽ˜μ΄μ§€μ˜ λ‘œλ”© μ‹œκ°„μ΄ ν–₯μƒλ˜μ—ˆμŠ΅λ‹ˆλ‹€. ν•œ 개 λŒ€μ‹  μ—¬λŸ¬ 개의 곡유된 chunkλ₯Ό λ§Œλ“€κ²Œ λ˜λ©΄μ„œ, μ€‘λ³΅λ˜κ±°λ‚˜ λΆˆν•„μš”ν•œ μ½”λ“œμ˜ 양을 μ΅œμ†Œν™”ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
  • νŽ˜μ΄μ§€κ°„ 이동(navigation) 쀑에 캐싱이 ν–₯μƒλ˜μ—ˆμŠ΅λ‹ˆλ‹€. 큰 μš©λŸ‰μ˜ λΌμ΄λΈŒλŸ¬λ¦¬λ“€κ³Ό ν”„λ ˆμž„μ›Œν¬λ“€μ„ μ—¬λŸ¬ chunk둜 λΆ„λ¦¬ν•˜λŠ” 것은, ν•΄λ‹Ή λͺ¨λ“ˆλ“€μ΄ μ—…κ·Έλ ˆμ΄λ“œ 되기 μ „κΉŒμ§€ 변경될 κ°€λŠ₯성이 μ μœΌλ―€λ‘œ μΊμ‹œ λ¬΄νš¨ν™”μ˜ κ°€λŠ₯성을 μ€„μ˜€μŠ΅λ‹ˆλ‹€.
    • granular webpack config (Link)
      ...
      prodGranular: {
            chunks: 'all',
      			// chunk λ‹¨μœ„λ₯Ό λͺ…μ‹œ 
            cacheGroups: { 
              default: false,
              vendors: false,
      				// framework κ΄€λ ¨ λͺ¨λ“ˆ
              framework: {
                name: 'framework',
      					// 'all' | 'async' | 'initial' 
      					// μ–΄λ–€ chunksκ°€ μ΅œμ ν™”λ₯Ό μœ„ν•΄ 선택될지λ₯Ό λͺ…μ‹œ 
                chunks: 'all',
                test: /[\\/]node_modules[\\/](react|react-dom)[\\/]/,
                priority: 40,
              },
      				
              lib: {
      					// 160KB 이상 λ„˜λŠ”μ§€ 체크
                test(module: { size: Function }): boolean {
                  return module.size() > 160000
                },
      					// 160KB 이상 λ„˜λŠ” λͺ¨λ“ˆλ“€μ˜ chunk 이름 지정 
                name(module: { identifier: Function }): string {
                  let nodeModuleNameResults = /node_modules\/(.*)/.exec(
                    module.identifier()
                  )
                  return nodeModuleNameResults
                    ? nodeModuleNameResults[1]
                    : module.identifier()
                },
                priority: 30,
                minChunks: 1,
                reuseExistingChunk: true,
              },
              commons: {
                name: 'commons',
                chunks: 'all',
                minChunks: totalPages, // entryPoints의 개수 
                priority: 20,
              },
              shared: {
                name: false,
                priority: 10,
                minChunks: 2,
                reuseExistingChunk: true,
              },
            },
            maxInitialRequests: 20,
          },
      ...

More HTTP requests

granular chunking을 μœ„ν•œ SplitChunksPlugin μ„€μ •κ³Ό Nextjs와 같은 ν”„λ ˆμž„μ›Œν¬μ—μ„œ 이λ₯Ό μ μš©ν•˜λŠ” 접근법은 μ™„μ „νžˆ μƒˆλ‘œμš΄ 컨셉은 μ•„λ‹™λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ—¬μ „νžˆ λ§Žμ€ ν”„λ ˆμž„μ›Œν¬μ—μ„œ λͺ‡ 가지 이유 λ•Œλ¬Έμ— 단일 β€œcommon” λ²ˆλ“€ μ „λž΅μ„ μœ μ§€ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 이런 μ΄μœ μ—λŠ” λ§Žμ€ HTTP μš”μ²­μ΄ μ‚¬μ΄νŠΈ μ„±λŠ₯에 뢀정적인 영ν–₯을 쀄 수 μžˆλ‹€λŠ” μš°λ €κ°€ ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

λΈŒλΌμš°μ €λŠ” ν•˜λ‚˜μ˜ origin μœΌλ‘œλΆ€ν„° μ œν•œλœ 수의 TCP μ—°κ²°(Chrome은 6개)이 κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ—, λ²ˆλ“€λŸ¬μ— μ˜ν•΄μ„œ μ—¬λŸ¬ 개의 chunk둜 λ‚˜λˆ„λŠ” 것은 이런 μ œμ•½ 상황(μ œν•œλœ TCP μ—°κ²° 개수) μ—μ„œ 총 μš”μ²­ 수의 μ¦κ°€λ‘œ μ΄μ–΄μ§„λ‹€λŠ” 것을 ν™•μ‹ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ΄λŠ” 였직 HTTP/1.1 의 κ²½μš°μ—λ§Œ μœ νš¨ν•©λ‹ˆλ‹€. HTTP/2의 λ©€ν‹°ν”Œλ ‰μ‹±(Multiplexing)은 ν•˜λ‚˜μ˜ originκ°„μ˜ 단일 connection을 μ΄μš©ν•΄ λ³‘λ ¬μ μœΌλ‘œ λ‹€μˆ˜μ˜ μš”μ²­λ“€μ΄ μ²˜λ¦¬λ˜λŠ” 것(be streamed)을 ν—ˆμš©ν•©λ‹ˆλ‹€. λ‹€λ₯Έ 말둜 λ§ν•˜μžλ©΄, μš°λ¦¬λŠ” 일반적으둜 λ²ˆλ“€λŸ¬μ— μ˜ν•΄ μƒμ„±λœ chunk 개수λ₯Ό μ œν•œν•˜λŠ” 것과 κ΄€λ ¨ν•΄ μš°λ €ν•  ν•„μš”κ°€ μ—†λ‹€λŠ” λ§μž…λ‹ˆλ‹€.

λŒ€λΆ€λΆ„μ˜ μ£Όμš” λΈŒλΌμš°μ €λŠ” HTTP/2λ₯Ό μ§€μ›ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 크둬과 Next.js νŒ€μ€ μ–΄λ–€ λ°©μ‹μœΌλ‘œλ“ μ§€ Next.js의 단일 common chunkλ₯Ό μ—¬λŸ¬ 개의 chunk둜 λΆ„ν• ν•¨μœΌλ‘œμ„œ μ¦κ°€ν•˜λŠ” μš”μ²­μ˜ κ°œμˆ˜κ°€ λ‘œλ”© μ„±λŠ₯에 영ν–₯을 μ£ΌλŠ”μ§€ ν™•μΈν•˜κ³  μ‹Άμ—ˆμŠ΅λ‹ˆλ‹€. 그듀은 maxInitialRequests 속성을 μ‚¬μš©ν•˜μ—¬ 병렬 μš”μ²­μ˜ μ΅œλŒ€ 개수λ₯Ό λ³€κ²½ν•˜λ©΄μ„œ 단일 μ‚¬μ΄νŠΈμ˜ μ„±λŠ₯을 μΈ‘μ •ν•˜κΈ° μ‹œμž‘ν–ˆμŠ΅λ‹ˆλ‹€.

Untitled

ν‰κ· μ μœΌλ‘œ μ—¬λŸ¬ 번 μ‹œλ„ν•˜λŠ” κ³Όμ •μ—μ„œ, load, start-render, FCP μ‹œκ°„μ΄ μ΅œλŒ€ 초기 μš”μ²­ 개수의 λ³€ν™”(5 to 15)λ₯Ό 쀄 λ•Œμ— λΉ„μŠ·ν•œ 수치λ₯Ό μœ μ§€ν•˜μ˜€μŠ΅λ‹ˆλ‹€. ν₯λ―Έλ‘­κ²Œλ„, μš°λ¦¬κ°€ 수백개의 μš”μ²­μ„ ν•˜κΈ° μœ„ν•΄ 곡격적으둜 splittingν•œ 이후에 μ„±λŠ₯상 μ•½κ°„μ˜ overheadκ°€ λ°œμƒν•œλ‹€λŠ” 점을 μ•Œκ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

Untitled

이 κ²°κ³ΌλŠ” μ‹ λ’°ν•  수 μžˆλŠ” μž„κ³„κ°’(20~25개의 μš”μ²­) λ‚΄μ—μ„œ λ‘œλ”© μ„±λŠ₯κ³Ό 캐싱 νš¨μœ¨μ„± 사이에 μ μ ˆν•œ κ· ν˜•μ„ μœ μ§€ν•  수 μžˆμŒμ„ λ³΄μ—¬μ€λ‹ˆλ‹€. λͺ‡ 번의 ν…ŒμŠ€νŒ… 이후, maxInitialRequests κ°’μœΌλ‘œ 25번이 μ„ νƒλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

μš”μ²­μ˜ μ΅œλŒ€ 개수λ₯Ό λ³€κ²½ν•˜λŠ” 것과 entry point에 따라 적절히 λ²ˆλ“€μ„ λΆ„ν• ν•˜λŠ” 것은 같은 νŽ˜μ΄μ§€μ—μ„œ λΆˆν•„μš”ν•œ μ½”λ“œ 양을 μ€„μž…λ‹ˆλ‹€.

Untitled

이 μ‹€ν—˜μ€ λ‹¨μˆœνžˆ νŽ˜μ΄μ§€ λ‘œλ“œ μ„±λŠ₯에 뢀정적인 영ν–₯을 쀄 수 μžˆλŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•΄ μš”μ²­ 개수λ₯Ό λ³€κ²½ν•˜λŠ” κ²ƒλ§Œμ΄ μ•„λ‹™λ‹ˆλ‹€. 이 κ²°κ³ΌλŠ” maxInitialRequests 값을 25둜 μ„€μ •ν•˜λŠ” 것이 νŽ˜μ΄μ§€ 속도 κ°μ†Œ 없이 μžλ°”μŠ€ν¬λ¦½νŠΈ payload μ‚¬μ΄μ¦ˆλ₯Ό 쀄일 수 있기 λ•Œλ¬Έμ— μ μ ˆν•˜λ‹€λŠ” 것을 μ œμ•ˆν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. ν•΄λ‹Ή νŽ˜μ΄μ§€λ₯Ό hydrateν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 총 μ‚¬μ΄μ¦ˆλŠ” μ—¬μ „νžˆ λΉ„μŠ·ν•œ 것도 λ³Ό 수 μžˆλŠ”λ°, μ΄λŠ” μ™œ 전체 μ½”λ“œ 규λͺ¨κ°€ 쀄어듀어도 νŽ˜μ΄μ§€ λ‘œλ“œ 속도가 λ°˜λ“œμ‹œ ν•¨κ»˜ ν–₯μƒλ˜μ§€ μ•ŠλŠ”λ‹€λŠ” κ±Έ μ˜λ―Έν•©λ‹ˆλ‹€. (μ‹€μ œλ‘œ Reactκ°€ HTML을 μƒμ„±ν•˜κ³ , 이벀트 λ¦¬μŠ€λ„ˆλ₯Ό 등둝(hydrate)ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ μžλ°”μŠ€ν¬λ¦½νŠΈ μš©λŸ‰μ€ 총 μžλ°”μŠ€ν¬λ¦½νŠΈ payload μš©λŸ‰μ„ μ€„μ΄λŠ” 것과 무관할 수 μžˆμŒμ„ μ˜λ―Έν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€)

μ›ΉνŒ©μ€ chunk λ‹Ή μ΅œμ†Œ 30KBλ₯Ό κΈ°λ³Έ μš©λŸ‰μœΌλ‘œ μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ, maxInitialRequests λ₯Ό 25둜 섀정함과 λ™μ‹œμ— κΈ°λ³Έ μš©λŸ‰ 섀정을 20KB둜 μ„€μ •ν•˜λŠ” 것이 더 쒋은 캐싱을 ν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.

Size reductions with granular chunks

Next.jsλ₯Ό ν¬ν•¨ν•œ λ§Žμ€ ν”„λ ˆμž„μ›Œν¬λ“€μ€ λͺ¨λ“  route λ³€κ²½ μ‹œ,μƒˆλ‘œμš΄ script νƒœκ·Έ(chunkλ₯Ό λ‹€μš΄ λ°›κΈ° μœ„ν•œ script)λ₯Ό μ‚½μž…ν•˜κΈ° μœ„ν•΄ cliet-side routing(CSR)에 μ˜μ‘΄ν•˜κ³  μžˆμŠ΅λΉˆλ‹€. ν•˜μ§€λ§Œ μ–΄λ–»κ²Œ λΉŒλ“œ νƒ€μž„μ— 미리 μ‹œμ‹œκ°κ° λ³€ν•˜λŠ” chunk μ‚½μž…(dynamic chunk)을 κ²°μ •ν•  수 μžˆμ„κΉŒμš”?

Next.jsλŠ” server-side build manifest νŒŒμΌμ„ μ‚¬μš©ν•˜μ—¬ 각 entry pointμ—μ„œ μ–΄λ–€ chunkκ°€ μ‚¬μš©λ˜λŠ”μ§€ κ²°μ •ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 이런 정보λ₯Ό client에도 μ£ΌκΈ° μœ„ν•΄μ„œ, λͺ¨λ“  entry point와 dependencies λ₯Ό λ§΅ν•‘ν•˜κΈ° μœ„ν•΄ μΆ•μ•½λœ client-side build manifestκ°€ μƒμ„±λ©λ‹ˆλ‹€.

// νŠΉμ • route(경둜)에 ν•΄λ‹Ήν•˜λŠ” dependecies 정보λ₯Ό 가진 promiseλ₯Ό λ°˜ν™˜ν•œλ‹€. 
getDependencies (route) {
  return this.promisedBuildManifest.then(
    man => (man[route] && man[route].map(url => `/_next/${url}`)) || []
  )
}

Untitled

Conclusion

granular chunking을 λ„μž…ν•˜λŠ” μ „λž΅μ€ Next.js, Gatsby 만 μ•„λ‹ˆλΌ 심지어 μ›ΉνŒ©μ—κ²Œ λ…νŠΉν•œ 것은 μ•„λ‹™λ‹ˆλ‹€. λ§Œμ•½ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ λ²ˆλ“€λŸ¬λ‚˜ ν”„λ ˆμž„μ›Œν¬λ₯Ό μ‚¬μš©ν•¨μ—λ„ ν•˜λ‚˜μ˜ 큰 β€˜commons’ λ²ˆλ“€ μ „λž΅μ„ λ”°λ₯΄κ³  μžˆλ‹€λ©΄, λ‹Ήμ‹ μ˜ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ chunking μ „λž΅μ„ ν–₯μƒμ‹œν‚€λ„λ‘ κ³ λ €ν•΄ 봐야 ν•©λ‹ˆλ‹€.

βœ…Β μ°Έκ³ 

profile
배운 것을 κΈ°λ‘ν•˜λŠ” FrontEnd Junior μž…λ‹ˆλ‹€
post-custom-banner

0개의 λŒ“κΈ€