Skip to content

Eunkyung-Son/webpack-demo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

31 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

2024.07.17

1. 파일 λ²ˆλ“€λ§

Webpack은 μ—”νŠΈλ¦¬ 포인트둜 μ§€μ •λœ 파일(./src/index.js)을 μ‹œμž‘μœΌλ‘œ, ν•΄λ‹Ή νŒŒμΌμ—μ„œ κ°€μ Έμ˜€λŠ” λͺ¨λ“  λͺ¨λ“ˆκ³Ό μ˜μ‘΄μ„±μ„ ν•˜λ‚˜μ˜ 파일(main.js)둜 λ²ˆλ“€λ§ν•©λ‹ˆλ‹€.

2. μ½”λ“œ μ••μΆ• 및 μ΅œμ ν™”

Production λͺ¨λ“œμ—μ„œλŠ” Webpack이 기본적으둜 μ½”λ“œ μ••μΆ•(Uglify) 및 μ΅œμ ν™” μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 λ²ˆλ“€ 파일의 크기λ₯Ό 쀄이고 λ‘œλ“œ 속도λ₯Ό ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€. κ΅¬μ²΄μ μœΌλ‘œλŠ”:

  • μ½”λ“œ μ••μΆ•: μ½”λ“œλ₯Ό μ΅œμ†Œν™”ν•˜κ³  λΆˆν•„μš”ν•œ 곡백과 주석을 μ œκ±°ν•©λ‹ˆλ‹€.
  • λ‚œλ…ν™”: λ³€μˆ˜μ™€ ν•¨μˆ˜μ˜ 이름을 λ‹¨μΆ•ν•˜μ—¬ 파일 크기λ₯Ό μ€„μž…λ‹ˆλ‹€.

3. λͺ¨λ“ˆ 합병

Webpack은 각 λͺ¨λ“ˆμ„ ν•˜λ‚˜μ˜ 파일둜 ν•©λ³‘ν•˜μ—¬ ν•„μš”ν•œ λͺ¨λ“ˆλ“€μ„ ν•¨κ»˜ λ¬ΆμŠ΅λ‹ˆλ‹€. 이 κ³Όμ •μ—μ„œ CommonJS, ES6 λͺ¨λ“ˆ, AMD λ“±μ˜ λͺ¨λ“ˆ 포맷을 μ§€μ›ν•©λ‹ˆλ‹€.

4. ν™˜κ²½ λ³€μˆ˜ μ„€μ •

Production λͺ¨λ“œμ—μ„œλŠ” process.env.NODE_ENVκ°€ 'production'으둜 μ„€μ •λ©λ‹ˆλ‹€. 이λ₯Ό 톡해 μ½”λ“œ λ‚΄μ—μ„œ ν™˜κ²½μ— 따라 λ‹€λ₯Έ λ™μž‘μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

5. μ΅œμ ν™”λœ λ‘œλ” μ‚¬μš©

Production λͺ¨λ“œμ—μ„œλŠ” Webpack이 일뢀 μ΅œμ ν™”λœ λ‘œλ”λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, Babel λ‘œλ”λŠ” production λͺ¨λ“œμ—μ„œ μ½”λ“œ λ³€ν™˜μ„ 더 μ΅œμ ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

6. ν”ŒλŸ¬κ·ΈμΈ 적용

Webpack은 기본적으둜 λͺ‡ κ°€μ§€ ν”ŒλŸ¬κ·ΈμΈμ„ μ‚¬μš©ν•˜μ—¬ μ΅œμ ν™” μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, TerserPlugin을 μ‚¬μš©ν•˜μ—¬ μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό μ••μΆ•ν•©λ‹ˆλ‹€. Webpack의 κΈ°λ³Έ μ„€μ • μ•ˆμ—λŠ” λͺ‡ κ°€μ§€ κΈ°λ³Έ ν”ŒλŸ¬κ·ΈμΈμ΄ ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 특히, production λͺ¨λ“œμ—μ„œλŠ” νŠΉμ • ν”ŒλŸ¬κ·ΈμΈμ΄ μžλ™μœΌλ‘œ ν™œμ„±ν™”λ˜μ–΄ μ΅œμ ν™”λ₯Ό λ•μŠ΅λ‹ˆλ‹€. μ•„λž˜μ— Webpack이 production λͺ¨λ“œμ—μ„œ 기본으둜 μ‚¬μš©ν•˜λŠ” μ£Όμš” ν”ŒλŸ¬κ·ΈμΈλ“€μ„ μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€.

κΈ°λ³Έ ν”ŒλŸ¬κ·ΈμΈλ“€

DefinePlugin

이 ν”ŒλŸ¬κ·ΈμΈμ€ process.env.NODE_ENVλ₯Ό 'production'으둜 μ„€μ •ν•˜μ—¬, μ½”λ“œ λ‚΄λΆ€μ—μ„œ ν™˜κ²½μ— 따라 λ™μž‘μ„ λ‹€λ₯΄κ²Œ ν•  수 있게 ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, if (process.env.NODE_ENV === 'production') { ... } 같은 쑰건문이 μžˆμŠ΅λ‹ˆλ‹€.

TerserPlugin

이 ν”ŒλŸ¬κ·ΈμΈμ€ μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό λ‚œλ…ν™”ν•˜κ³  μ••μΆ•ν•©λ‹ˆλ‹€. 기본적으둜 production λͺ¨λ“œμ—μ„œ ν™œμ„±ν™”λ˜μ–΄ μ½”λ“œ 크기λ₯Ό μ΅œμ†Œν™”ν•©λ‹ˆλ‹€.

ModuleConcatenationPlugin

이 ν”ŒλŸ¬κ·ΈμΈμ€ μŠ€μ½”ν”„ ν˜Έμ΄μŠ€νŒ…(scope hoisting)을 톡해 더 λΉ λ₯΄κ³  μž‘μ€ λ²ˆλ“€μ„ μƒμ„±ν•©λ‹ˆλ‹€. λͺ¨λ“ˆ κ°„μ˜ μ€‘λ³΅λœ μ½”λ“œλ₯Ό 쀄이고, μ‹€ν–‰ 속도λ₯Ό ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€.

NoEmitOnErrorsPlugin

컴파일 도쀑 μ—λŸ¬κ°€ λ°œμƒν–ˆμ„ λ•Œ, λ²ˆλ“€μ„ μƒμ„±ν•˜μ§€ μ•Šλ„λ‘ ν•©λ‹ˆλ‹€. 이둜 인해 μ‹€νŒ¨ν•œ λΉŒλ“œκ°€ λ°°ν¬λ˜μ§€ μ•Šλ„λ‘ ν•©λ‹ˆλ‹€.

EnvironmentPlugin

ν™˜κ²½ λ³€μˆ˜λ₯Ό μ„€μ •ν•˜λŠ” ν”ŒλŸ¬κ·ΈμΈμœΌλ‘œ, process.env.NODE_ENV와 같은 λ³€μˆ˜λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.

κΈ°λ³Έ μ„€μ •μœΌλ‘œ μΈν•œ ν”ŒλŸ¬κ·ΈμΈ ν™œμ„±ν™” Webpack이 production λͺ¨λ“œμ—μ„œ 기본적으둜 ν™œμ„±ν™”ν•˜λŠ” ν”ŒλŸ¬κ·ΈμΈλ“€μ€ μ•„λž˜μ™€ 같은 λͺ…λ Ήμ–΄λ₯Ό 톡해 확인할 수 μžˆμŠ΅λ‹ˆλ‹€:

webpack --mode production

이 λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜λ©΄, Webpack은 기본적으둜 μœ„μ—μ„œ μ–ΈκΈ‰ν•œ ν”ŒλŸ¬κ·ΈμΈλ“€μ„ ν™œμ„±ν™”ν•˜μ—¬ λ²ˆλ“€λ§ 과정을 μ΅œμ ν™”ν•©λ‹ˆλ‹€.

μš”μ•½

ν˜„μž¬ μƒν™©μ—μ„œ, production λͺ¨λ“œμ˜ Webpack이 μˆ˜ν–‰ν•˜λŠ” μ£Όμš” μž‘μ—…μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

  • λͺ¨λ“  λͺ¨λ“ˆκ³Ό μ˜μ‘΄μ„±μ„ ν•˜λ‚˜μ˜ λ²ˆλ“€ 파일둜 λ¬ΆκΈ°
  • μ½”λ“œ μ••μΆ• 및 λ‚œλ…ν™”
  • ν™˜κ²½ λ³€μˆ˜ μ„€μ •
  • μ΅œμ ν™”λœ λ‘œλ” μ‚¬μš©
  • κΈ°λ³Έ ν”ŒλŸ¬κ·ΈμΈ μ μš©μ„ ν†΅ν•œ μΆ”κ°€ μ΅œμ ν™”
  • 이λ₯Ό 톡해 λ‘œλ“œ 속도가 λΉ λ₯΄κ³ , μ΅œμ ν™”λœ λ²ˆλ“€ νŒŒμΌμ„ μƒμ„±ν•˜κ²Œ λ©λ‹ˆλ‹€.

2024.07.19

이미지 λ‘œλ”μ™€ CSS 파일의 차이점

이미지 λ‘œλ” (JavaScript)

  • JavaScript νŒŒμΌμ—μ„œ 이미지λ₯Ό 직접 μž„ν¬νŠΈν•˜κ³  μ‚¬μš©ν•˜λŠ” 경우, Webpack은 이미지λ₯Ό λ²ˆλ“€λ§ν•˜κ³  ν•΄λ‹Ή 경둜λ₯Ό μ²˜λ¦¬ν•˜μ—¬ μ˜¬λ°”λ₯Έ URL둜 λ³€ν™˜ν•©λ‹ˆλ‹€.
  • 예λ₯Ό λ“€μ–΄, index.jsμ—μ„œ import Icon from './icon.png';와 같이 이미지λ₯Ό μž„ν¬νŠΈν•˜λ©΄, Webpack은 이미지λ₯Ό λ²ˆλ“€λ§ν•˜κ³  Icon λ³€μˆ˜μ— μ˜¬λ°”λ₯Έ 경둜λ₯Ό ν• λ‹Ήν•©λ‹ˆλ‹€. const myIcon = new Image(); myIcon.src = Icon; μ½”λ“œμ—μ„œ Icon λ³€μˆ˜λŠ” λ²ˆλ“€λœ μ΄λ―Έμ§€μ˜ URL을 κ°€λ¦¬ν‚€λ―€λ‘œ, 이미지λ₯Ό HTML μš”μ†Œμ— μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

CSS 파일

  • CSS νŒŒμΌμ—μ„œ 이미지λ₯Ό μ‚¬μš©ν•˜λ©΄, Webpack의 css-loader와 style-loaderκ°€ 이미지λ₯Ό μ²˜λ¦¬ν•˜μ—¬ μ˜¬λ°”λ₯Έ URL둜 λ³€ν™˜ν•©λ‹ˆλ‹€.
  • background: url('./icon.png');와 같이 CSSμ—μ„œ 이미지λ₯Ό μ‚¬μš©ν•˜λŠ” 경우, Webpack은 이미지λ₯Ό λ²ˆλ“€λ§ν•˜κ³  CSS 파일 λ‚΄μ—μ„œ μ‚¬μš©λ  수 μžˆλŠ” URL둜 λ³€ν™˜ν•©λ‹ˆλ‹€.
  • CSS νŒŒμΌμ„ import './style.css';둜 μž„ν¬νŠΈν•˜λ©΄, Webpack은 CSS νŒŒμΌμ„ JavaScript νŒŒμΌμ— ν¬ν•¨μ‹œν‚€κ³  μŠ€νƒ€μΌμ„ HTML λ¬Έμ„œμ— μ μš©ν•©λ‹ˆλ‹€.

차이점

  • CSS νŒŒμΌμ„ μž„ν¬νŠΈν•˜λŠ” 경우:
    • μŠ€νƒ€μΌμ΄ μ μš©λ˜μ–΄ .hello ν΄λž˜μŠ€κ°€ μžˆλŠ” μš”μ†Œμ— 빨간색 ν…μŠ€νŠΈ 색상과 λ°±κ·ΈλΌμš΄λ“œ 이미지가 μ μš©λ©λ‹ˆλ‹€.
    • λ°±κ·ΈλΌμš΄λ“œ μ΄λ―Έμ§€λŠ” CSSμ—μ„œ μ •μ˜λœ λŒ€λ‘œ μ μš©λ©λ‹ˆλ‹€.
  • CSS νŒŒμΌμ„ μž„ν¬νŠΈν•˜μ§€ μ•ŠλŠ” 경우:
    • μŠ€νƒ€μΌμ΄ μ μš©λ˜μ§€ μ•ŠμœΌλ―€λ‘œ .hello ν΄λž˜μŠ€κ°€ μžˆλŠ” μš”μ†Œμ— ν…μŠ€νŠΈ 색상과 λ°±κ·ΈλΌμš΄λ“œ 이미지가 μ μš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
    • JavaScriptμ—μ„œ 직접 μΆ”κ°€ν•œ μ΄λ―Έμ§€λŠ” μ—¬μ „νžˆ DOM에 μΆ”κ°€λ©λ‹ˆλ‹€. μ΄λŠ” index.jsμ—μ„œ myIcon.src = Icon;둜 μ„€μ •λœ μ΄λ―Έμ§€μž…λ‹ˆλ‹€.

μš”μ•½

  • CSS νŒŒμΌμ„ μž„ν¬νŠΈν•˜λ©΄ μŠ€νƒ€μΌμ΄ 적용되며, CSS λ‚΄μ˜ λ°±κ·ΈλΌμš΄λ“œ 이미지도 μ˜¬λ°”λ₯΄κ²Œ λ‘œλ“œλ©λ‹ˆλ‹€.
  • CSS νŒŒμΌμ„ μž„ν¬νŠΈν•˜μ§€ μ•ŠμœΌλ©΄ JavaScriptμ—μ„œ 직접 μΆ”κ°€ν•œ μ΄λ―Έμ§€λŠ” DOM에 μΆ”κ°€λ˜μ§€λ§Œ, CSS μŠ€νƒ€μΌκ³Ό λ°±κ·ΈλΌμš΄λ“œ μ΄λ―Έμ§€λŠ” μ μš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • 이λ₯Ό 톡해 CSS 파일 μž„ν¬νŠΈμ˜ μ€‘μš”μ„±κ³Ό 이미지 λ‘œλ”μ˜ 역할을 이해할 수 μžˆμŠ΅λ‹ˆλ‹€. CSS νŒŒμΌμ„ μž„ν¬νŠΈν•¨μœΌλ‘œμ¨ μŠ€νƒ€μΌμ΄ 적용되고, CSSμ—μ„œ μ •μ˜ν•œ 이미지가 μ˜¬λ°”λ₯΄κ²Œ λ‘œλ“œλ©λ‹ˆλ‹€.

2024.07.24

OUTPUT MANAGEMENT

  • μ΄μ „κΉŒμ§€λŠ” λͺ¨λ“  에셋을 index.html νŒŒμΌμ— μˆ˜λ™μœΌλ‘œ μΆ”κ°€ν–ˆμ—ˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ—”νŠΈλ¦¬ 포인트의 이름을 λ³€κ²½ν•˜κ±°λ‚˜ μƒˆ μ—”νŠΈλ¦¬ 포인트λ₯Ό μΆ”κ°€ν•˜λ©΄ index.html 은 이전에 μˆ˜λ™μœΌλ‘œ μΆ”κ°€ν•œ μ—μ…‹μ˜ 이름을 μ°Έμ‘°ν•©λ‹ˆλ‹€. HtmlWebpackPlugin ν”ŒλŸ¬κ·ΈμΈμ„ ν†΅ν•˜μ—¬ dist μ•ˆμ— index.html 파일이 μ‘΄μž¬ν•˜λ”λΌλ„ μƒˆλ‘œ μƒμ„±λœ 파일둜 λŒ€μ²΄ν•˜λ©°, λͺ¨λ“  λ²ˆλ“€μ΄ μžλ™μœΌλ‘œ index.html νŒŒμΌμ— μΆ”κ°€λ©λ‹ˆλ‹€.

  • μ‚¬μš©ν•˜λŠ” 파일만 μƒμ„±λ˜λ„λ‘ λΉŒλ“œ μ „ /dist 폴더λ₯Ό μ •λ¦¬ν•΄μ£ΌλŠ” μ˜΅μ…˜μΈ output.clean μ˜΅μ…˜μ΄ μžˆμŠ΅λ‹ˆλ‹€.

DEVELOPMENT

USING SOURCEMAP

  • webpack이 μ†ŒμŠ€ μ½”λ“œλ₯Ό λ²ˆλ“€λ‘œ 묢을 λ•Œ, 였λ₯˜μ™€ 경고의 μ›λž˜ μœ„μΉ˜λ₯Ό μΆ”μ ν•˜κΈ° μ–΄λ €μšΈ 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μ„Έ 개의 μ†ŒμŠ€ 파일(a.js, b.js, 그리고 c.js)을 ν•˜λ‚˜μ˜ λ²ˆλ“€λ‘œ λ¬Άκ³  ν•˜λ‚˜μ˜ μ†ŒμŠ€ 파일이 였λ₯˜κ°€ μžˆλŠ” 경우, μŠ€νƒ 좔적은 λ‹¨μˆœνžˆ bundle.jsλ₯Ό κ°€λ¦¬ν‚΅λ‹ˆλ‹€.

  • 였λ₯˜μ™€ κ²½κ³ λ₯Ό μ‰½κ²Œ 좔적할 수 μžˆλ„λ‘, JavaScriptλŠ” 컴파일된 μ½”λ“œλ₯Ό μ›λž˜ μ†ŒμŠ€λ‘œ λ§€ν•‘ν•˜λŠ” μ†ŒμŠ€λ§΅μ„ μ œκ³΅ν•©λ‹ˆλ‹€. b.jsμ—μ„œ 였λ₯˜κ°€ λ°œμƒν•œ 경우, μ†ŒμŠ€λ§΅μ—μ„œ μ •ν™•νžˆ μ•Œλ €μ€λ‹ˆλ‹€.

    • μ†ŒμŠ€ λ§΅ μ‚¬μš©:
    스크란샷 2024-07-24 α„‹α…©α„Œα…₯ᆫ 1 06 02
    • μ†ŒμŠ€ λ§΅ λ―Έμ‚¬μš©:
    스크란샷 2024-07-24 α„‹α…©α„Œα…₯ᆫ 1 05 33

USING WATCH MODE

  • webpack이 λ””νŽœλ˜μ‹œ κ·Έλž˜ν”„ λ‚΄μ˜ λͺ¨λ“  νŒŒμΌμ—μ„œμ˜ 변경사항을 "κ°μ‹œ"ν•˜λ„λ‘ μ§€μ‹œν•  수 μžˆμŠ΅λ‹ˆλ‹€. 파일 쀑 ν•˜λ‚˜κ°€ μ—…λ°μ΄νŠΈλ˜λ©΄, μ½”λ“œκ°€ λ‹€μ‹œ μ»΄νŒŒμΌλ˜λ―€λ‘œ 전체 λΉŒλ“œλ₯Ό μˆ˜λ™μœΌλ‘œ μ‹€ν–‰ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

  • 변경사항을 ν™•μΈν•˜λ €λ©΄ λΈŒλΌμš°μ €λ₯Ό μƒˆλ‘œκ³ μΉ¨ ν•΄μ•Ό ν•©λ‹ˆλ‹€. 이것을 μžλ™μœΌλ‘œ ν•˜λŠ” webpack-dev-server κ°€ μžˆμŠ΅λ‹ˆλ‹€.

USING webpack-dev-server

  • λ©”λͺ¨λ¦¬ λ‚΄ λ²ˆλ“€ 파일:

    • src/index.jsλ₯Ό λ²ˆλ“€λ§ν•˜μ—¬ dist/bundle.js둜 λ©”λͺ¨λ¦¬μ— μ €μž₯ν•©λ‹ˆλ‹€.
  • μ„œλ²„ 루트 κ²½λ‘œμ— 마운트:

    • λ©”λͺ¨λ¦¬μ— μ €μž₯된 dist/bundle.js νŒŒμΌμ„ μ„œλ²„μ˜ /dist/ κ²½λ‘œμ— λ§ˆμš΄νŠΈν•©λ‹ˆλ‹€. λΈŒλΌμš°μ €μ—μ„œ http://localhost:8080/dist/bundle.js둜 μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ””μŠ€ν¬μ— 파일 μž‘μ„± μ•ˆ 함:

    • dist/ 디렉터리 내에 μ‹€μ œ 파일 bundle.jsλŠ” μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λͺ¨λ“  λ²ˆλ“€ νŒŒμΌμ€ λ©”λͺ¨λ¦¬ λ‚΄μ—λ§Œ μ‘΄μž¬ν•©λ‹ˆλ‹€.
  • dist/ 디렉터리λ₯Ό μ‚­μ œν•˜κ³  webpack serve --open 을 μ‹€ν–‰ν•˜λ©΄ dist/ 디렉터리 내뢀에 λ²ˆλ“€ 파일이 μƒμ„±λ˜μ§€ μ•Šμ•˜μ§€λ§Œ μ„œλ²„λ₯Ό 톡해 λ©”λͺ¨λ¦¬μ— μžˆλŠ” νŒŒμΌμ„ μ œκ³΅ν•˜κΈ° λ•Œλ¬Έμ— μ •μƒμ μœΌλ‘œ λ™μž‘ν•©λ‹ˆλ‹€.

USING webpack-dev-middleware

  • webpack-dev-middlewareλŠ” webpackμ—μ„œ μ²˜λ¦¬ν•œ νŒŒμΌμ„ μ„œλ²„λ‘œ λ‚΄λ³΄λ‚΄λŠ” 래퍼 μž…λ‹ˆλ‹€.
  • webpack-dev-middleware와 express μ„œλ²„λ₯Ό κ²°ν•©ν•  수 있고 포트 번호λ₯Ό μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

2024.07.31 / 08.01 / 08.05 / 08.12

Code Splitting

  • μ½”λ“œ μŠ€ν”Œλ¦¬νŒ…μ€ webpack의 κ°€μž₯ λ§€λ ₯적인 κΈ°λŠ₯ 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€. 이 κΈ°λŠ₯을 μ‚¬μš©ν•˜μ—¬ μ½”λ“œλ₯Ό λ‹€μ–‘ν•œ λ²ˆλ“€λ‘œ λΆ„ν• ν•˜κ³ , μš”μ²­μ— 따라 λ‘œλ“œν•˜κ±°λ‚˜ λ³‘λ ¬λ‘œ λ‘œλ“œν•  수 μžˆμŠ΅λ‹ˆλ‹€. 더 μž‘μ€ λ²ˆλ“€μ„ λ§Œλ“€κ³  λ¦¬μ†ŒμŠ€ μš°μ„ μˆœμœ„λ₯Ό μ˜¬λ°”λ₯΄κ²Œ μ œμ–΄ν•˜κΈ° μœ„ν•΄μ„œ μ‚¬μš©ν•˜λ©°, 잘 ν™œμš©ν•˜λ©΄ λ‘œλ“œ μ‹œκ°„μ— 큰 영ν–₯을 끼칠 수 μžˆμŠ΅λ‹ˆλ‹€.

Entry Points

  • μ½”λ“œλ₯Ό λΆ„ν• ν•˜λŠ” κ°€μž₯ 쉽고 직관적인 λ°©λ²•μ΄μ§€λ§Œ λ‹€λ₯Έ 방법에 λΉ„ν•΄ μˆ˜λ™μ μ΄κ³ , λͺ‡ κ°€μ§€ 함정이 μžˆμŠ΅λ‹ˆλ‹€.

λΉŒλ“œ 둜그λ₯Ό 보면 λ‹€μŒκ³Ό 같은 정보가 μžˆμŠ΅λ‹ˆλ‹€:

[webpack-cli] Compilation finished
asset index.bundle.js 553 KiB [emitted] (name: index)
asset another.bundle.js 553 KiB [emitted] (name: another)
runtime modules 2.49 KiB 12 modules
cacheable modules 530 KiB
  ./src/index.js 257 bytes [built] [code generated]
  ./src/another-module.js 84 bytes [built] [code generated]
  ./node_modules/lodash/lodash.js 530 KiB [built] [code generated]
webpack 5.4.0 compiled successfully in 245 ms

이 λ‘œκ·Έμ—μ„œ λͺ‡ κ°€μ§€ μ€‘μš”ν•œ 점을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

  • λ²ˆλ“€ 파일의 크기:

    • index.bundle.js와 another.bundle.js λͺ¨λ‘ 553 KiBμž…λ‹ˆλ‹€.
  • λͺ¨λ“ˆ 크기:

    • ./node_modules/lodash/lodash.jsλŠ” 530 KiBμž…λ‹ˆλ‹€.
  • λͺ¨λ“ˆμ˜ 포함 μ—¬λΆ€:

    • ./src/index.js, ./src/another-module.js, 그리고 ./node_modules/lodash/lodash.jsκ°€ cacheable modules둜 λ‚˜μ—΄λ˜μ–΄ 있으며, μ΄λŠ” 이 λͺ¨λ“ˆλ“€μ΄ λ²ˆλ“€μ— ν¬ν•¨λ˜μ—ˆμŒμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
  • webpack-bundle-analyzer λ₯Ό ν†΅ν•œ 뢄석 κ²°κ³Όμ—μ„œλ„ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

    • image

πŸ“Œ 자주 μ‚¬μš©ν•˜λŠ” 라이브러리 ν˜Ήμ€ ν”„λ ˆμž„μ›Œν¬μ—μ„œμ˜ entry points

  • React와 같은 SPA의 경우 ν•˜λ‚˜μ˜ html 파일과 ν•˜λ‚˜μ˜ μ—”νŠΈλ¦¬ 포인트λ₯Ό κ°€μ§‘λ‹ˆλ‹€.
  • Next.js와 같은 ν”„λ ˆμž„μ›Œν¬μ˜ 경우 app/pages 디렉토리 λ‚΄μ˜ 각 파일이 μ—”νŠΈλ¦¬ 포인트 μž…λ‹ˆλ‹€. 단일 html νŒŒμΌμ— 각 μ—”νŠΈλ¦¬ ν¬μΈνŠΈκ°€ λ™μ μœΌλ‘œ λ Œλ”λ§λ©λ‹ˆλ‹€.
    • μœ„μ˜ 경우 htmlκ³Ό μ—”νŠΈλ¦¬ν¬μΈνŠΈκ°€ 1:1 λŒ€μ‘μ΄ λ©λ‹ˆλ‹€.

πŸ“Œ MFA (마이크둜 ν”„λ‘ νŠΈμ—”λ“œ 아킀텍쳐)

  • ν•˜λ‚˜μ˜ νŽ˜μ΄μ§€ μ•ˆμ— home 탭은 home.bundle.js, blog 탭은 blog.bundle.js λ₯Ό μ‚¬μš©ν•˜λŠ” 경우 μ—”νŠΈλ¦¬ ν¬μΈνŠΈκ°€ μ—¬λŸ¬κ°œ μž…λ‹ˆλ‹€.
    <!DOCTYPE html>
    <html lang="en">
      <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <title>Multi-Page Application</title>
      </head>
      <body>
          <div id="home"></div>
          <div id="blog"></div>
          <script src="home.bundle.js"></script>
          <script src="blog.bundle.js"></script>
      </body>
    </html>
    

Prevent Duplication

dependOn μ˜΅μ…˜μ„ μ‚¬μš©ν•˜μ—¬ 청크간 λͺ¨λ“ˆμ„ κ³΅μœ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λΉŒλ“œ 둜그:

assets by status 4.57 MiB [cached] 2 assets
assets by status 1.43 MiB [emitted]
  asset shared.bundle.js 1.37 MiB [emitted] (name: shared)
  asset index.bundle.js 55.6 KiB [emitted] (name: index)
  asset another.bundle.js 1.57 KiB [emitted] (name: another)
  asset index.html 383 bytes [emitted]
asset runtime.bundle.js 16.1 KiB [compared for emit] (name: runtime)
Entrypoint index 55.6 KiB (4.57 MiB) = index.bundle.js 2 auxiliary assets
Entrypoint another 1.57 KiB = another.bundle.js
Entrypoint shared 1.39 MiB = runtime.bundle.js 16.1 KiB shared.bundle.js 1.37 MiB
runtime modules 3.76 KiB 10 modules
javascript modules 545 KiB
  modules by path ./node_modules/.pnpm/ 541 KiB
    modules by path ./node_modules/.pnpm/style-loader@4.0.0_webpack@5.93.0_webpack-cli@5.1.4_/node_m...(truncated) 5.84 KiB 6 modules
    modules by path ./node_modules/.pnpm/css-loader@7.1.2_webpack@5.93.0_webpack-cli@5.1.4_/node_mod...(truncated) 3.33 KiB 3 modules
    ./node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/lodash.js 531 KiB [built] [code generated]
  modules by path ./src/ 4.32 KiB
    modules by path ./src/*.js 874 bytes 3 modules
    modules by path ./src/*.css 3.47 KiB
      ./src/style.css 1.66 KiB [built] [code generated]
      ./node_modules/.pnpm/css-loader@7.1.2_webpack@5.93.0_webpack-cli@5.1.4_/node_modules/css-loader/dist/cjs.js!./src/style.css 1.81 KiB [built] [code generated]
asset modules 84 bytes (javascript) 4.57 MiB (asset)
  ./src/image.png 42 bytes (javascript) 2.6 MiB (asset) [built] [code generated]
  ./src/PretendardVariable.woff2 42 bytes (javascript) 1.96 MiB (asset) [built] [code generated]
webpack 5.93.0 compiled successfully in 365 ms
  • κΈ°μ‘΄ index.bundle.js another.bundle.js에 ν¬ν•¨λ˜μ–΄ 있던 lodashκ°€ λΆ„λ¦¬λ˜μ–΄ share.bundle.js νŒŒμΌμ— λ³„λ„λ‘œ λΆ„λ¦¬λ©λ‹ˆλ‹€.

  • webpack-bundle-analyzer λ₯Ό ν†΅ν•œ 뢄석 κ²°κ³Όμ—μ„œλ„ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

image

SplitChunksPlugin 을 ν†΅ν•˜μ—¬ μ—”νŠΈλ¦¬ 청크 ν˜Ήμ€ μ™„μ „νžˆ μƒˆλ‘œμš΄ 청크둜 곡톡 μ˜μ‘΄μ„±μ„ μΆ”μΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€. λΉŒλ“œλ‘œκ·Έ:

assets by status 4.57 MiB [cached] 2 assets
assets by path . 1.44 MiB
  asset shared.bundle.js 1.39 MiB [emitted] (name: shared) (id hint: vendors)
  asset index.bundle.js 55.5 KiB [emitted] (name: index)
  asset another.bundle.js 1.49 KiB [emitted] (name: another)
  asset index.html 335 bytes [emitted]
runtime modules 3.76 KiB 10 modules
javascript modules 545 KiB
  modules by path ./node_modules/.pnpm/ 541 KiB
    modules by path ./node_modules/.pnpm/style-loader@4.0.0_webpack@5.93.0_webpack-cli@5.1.4_/node_m...(truncated) 5.84 KiB 6 modules
    modules by path ./node_modules/.pnpm/css-loader@7.1.2_webpack@5.93.0_webpack-cli@5.1.4_/node_mod...(truncated) 3.33 KiB 3 modules
    ./node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/lodash.js 531 KiB [built] [code generated]
  modules by path ./src/ 4.32 KiB
    modules by path ./src/*.js 874 bytes 3 modules
    modules by path ./src/*.css 3.47 KiB
      ./src/style.css 1.66 KiB [built] [code generated]
      ./node_modules/.pnpm/css-loader@7.1.2_webpack@5.93.0_webpack-cli@5.1.4_/node_modules/css-loader/dist/cjs.js!./src/style.css 1.81 KiB [built] [code generated]
asset modules 84 bytes (javascript) 4.57 MiB (asset)
  ./src/image.png 42 bytes (javascript) 2.6 MiB (asset) [built] [code generated]
  ./src/PretendardVariable.woff2 42 bytes (javascript) 1.96 MiB (asset) [built] [code generated]
webpack 5.93.0 compiled successfully in 327 ms
  • optimization.splitChunks μ„€μ • μ˜΅μ…˜μ„ μ μš©ν•˜λ©΄ index.bundle.js 와 another.bundle.jsμ—μ„œ 쀑볡 μ˜μ‘΄μ„±μ΄ 제거된 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. lodashκ°€ λ³„λ„μ˜ 청크둜 뢄리 λ˜μ—ˆκ³ , 메인 λ²ˆλ“€μ—μ„œ μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

  • webpack-bundle-analyzer λ₯Ό ν†΅ν•œ 뢄석 κ²°κ³Όμ—μ„œλ„ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

image

Dynamic Imports

  • dynamic imports λ₯Ό μ‚¬μš©ν•˜μ—¬ μ •μ μœΌλ‘œ import ν•˜λ˜ λͺ¨λ“ˆμ„ λ™μ μœΌλ‘œ κ°€μ Έμ™€μ„œ 청크λ₯Ό 뢄리할 수 μžˆμŠ΅λ‹ˆλ‹€.

Prefetching/Preloading modules

  • prefetch : ν–₯ν›„ 일뢀 탐색에 λ¦¬μ†ŒμŠ€κ°€ ν•„μš”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • preload : ν˜„μž¬ 탐색 쀑에 λ¦¬μ†ŒμŠ€λ„ ν•„μš”ν•©λ‹ˆλ‹€.
//...
import(/* webpackPrefetch: true */ './path/to/LoginModal.js');
<link rel="prefetch" href="login-modal-chunk.js">

prefetch 힌트λ₯Ό ν†΅ν•˜μ—¬ λΈŒλΌμš°μ €μ— login-modal-chunk.jsλ₯Ό μœ νœ΄μ‹œκ°„μ— 미리 κ°€μ Έμ˜€λ„λ‘ μ§€μ‹œν•©λ‹ˆλ‹€. webpack은 λΆ€λͺ¨ 청크가 λ‘œλ“œλœ ν›„ ν”„λ¦¬νŽ˜μΉ˜ 힌트λ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.

  • ν”„λ¦¬λ‘œλ“œ μ²­ν¬λŠ” λΆ€λͺ¨ 청크와 λ³‘λ ¬λ‘œ λ‘œλ“œλ₯Ό μ‹œμž‘ν•©λ‹ˆλ‹€. ν”„λ¦¬νŽ˜μΉ˜ μ²­ν¬λŠ” λΆ€λͺ¨ 청크가 λ‘œλ“œ μ™„λ£Œλœ 후에 λ‘œλ“œλ₯Ό μ‹œμž‘ν•©λ‹ˆλ‹€.
  • ν”„λ¦¬λ‘œλ“œ μ²­ν¬λŠ” 쀑간 μš°μ„ μˆœμœ„λ₯Ό κ°€μ§€λ©° μ¦‰μ‹œ λ‹€μš΄λ‘œλ“œλ©λ‹ˆλ‹€. ν”„λ¦¬νŽ˜μΉ˜ μ²­ν¬λŠ” λΈŒλΌμš°μ €κ°€ 유휴 μƒνƒœμΌ λ•Œ λ‹€μš΄λ‘œλ“œ λ©λ‹ˆλ‹€.
  • ν”„λ¦¬λ‘œλ“œ μ²­ν¬λŠ” λΆ€λͺ¨ μ²­ν¬μ—μ„œ μ¦‰μ‹œ μš”μ²­ λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. ν”„λ¦¬νŽ˜μΉ˜ μ²­ν¬λŠ” λ‚˜μ€‘μ— μ–Έμ œλΌλ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ§€μ›ν•˜λŠ” λΈŒλΌμš°μ €μ— 차이가 μžˆμŠ΅λ‹ˆλ‹€.
  • ν”„λ¦¬λ‘œλ“œλŠ” μžμ‹ λ§Œμ˜ μ œμ–΄κ°€ ν•„μš”ν•©λ‹ˆλ‹€. λͺ¨λ“  동적 import의 ν”„λ¦¬λ‘œλ“œλŠ” 비동기 슀크립트λ₯Ό 톡해 μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
//...
import(/* webpackPreload: true */ 'ChartingLibrary');

ChartComponentλ₯Ό μ‚¬μš©ν•˜λŠ” νŽ˜μ΄μ§€λ₯Ό μš”μ²­ν•  λ•Œ λ₯Ό 톡해 charting-library-chunk도 μš”μ²­λ©λ‹ˆλ‹€. page-chunkκ°€ 더 μž‘κ³  더 빨리 μ™„λ£Œλœλ‹€κ³  κ°€μ •ν•˜λ©΄ 이미 μš”μ²­λœ charting-library-chunkκ°€ μ™„λ£Œλ  λ•ŒκΉŒμ§€ νŽ˜μ΄μ§€μ—λŠ” LoadingIndicatorκ°€ ν‘œμ‹œλ©λ‹ˆλ‹€. 두 번이 μ•„λ‹Œ ν•œ 번의 λΌμš΄λ“œ 트립이 ν•„μš”ν•˜λ―€λ‘œ λŒ€κΈ° μ‹œκ°„μ΄ κΈ΄ ν™˜κ²½μ—μ„œ λ‘œλ“œ μ‹œκ°„μ΄ 증가할 수 μžˆμŠ΅λ‹ˆλ‹€.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors