About Tree Shaking (Korean Translation)

#tree shaking

#js

#javascript

#frontend

#module

#esm

Written by Paul

About Tree Shaking

Reduce the bundle size by eliminating dead code (λ°λ“œ μ½”λ“œλ₯Ό μ œκ±°ν•˜μ—¬ λ²ˆλ“€μ‚¬μ΄μ¦ˆλ₯Ό 쀄이기)

The original post is from https://www.patterns.dev/posts/tree-shaking/
가끔 μš°λ¦¬λŠ” 어디에도 우리 μ•±μ—μ„œ 쓰이지 μ•ŠλŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•˜κΈ°λ„ ν•œλ‹€. 죽은 μ½”λ“œ 쑰각듀은 λ²ˆλ“€ μ‚¬μ΄μ¦ˆλ₯Ό 쀄이기와 λΆˆν•„μš”ν•˜κ²Œ 더 λ§Žμ€ 데이터λ₯Ό μ μž¬ν•˜λŠ” 것을 막기 μœ„ν•΄μ„œ 제거될 수 μžˆλ‹€! 우리의 λ²ˆλ“€μ— λ„£κΈ° 전에 λ°λ“œ μ½”λ“œλ₯Ό μ œκ±°ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€λ₯Ό tree-shaking (트리 쉐이킹)이라고 ν•œλ‹€.
트리 쉐이킹은 math와 같은 κ°„λ‹¨ν•œ λͺ¨λ“ˆλ“€μ—μ„œ λ™μž‘ν•˜κΈ°λ„ ν•˜μ§€λ§Œ, 트리 쉐이킹이 κ½€λ‚˜ κΉŒλ‹€λ‘œμš΄ μΌ€μ΄μŠ€λ“€λ„ μžˆλ‹€.

Concepts

트리 쉐이킹은 μ΅œμ’… μžλ°”μŠ€ν¬λ¦½νŠΈ λ²ˆλ“€μ—μ„œ 쓰이지 μ•ŠλŠ” μ½”λ“œλ₯Ό μ œκ±°ν•˜λŠ”λ° λͺ©μ μ„ κ°–κ³  μžˆλ‹€. μ˜¬λ°”λ₯΄κ²Œ μž‘μ—…μ΄ λœλ‹€λ©΄, μžλ°” 슀크립트 λ²ˆλ“€μ˜ μ‚¬μ΄μ¦ˆλ₯Ό 쀄일 수 있고, 더 κ°€λ³κ²Œ λ‹€μš΄λ‘œλ“œ ν• μˆ˜ 있으며 νŒŒμ‹±κ³Ό μ‹€ν–‰ μ‹œκ°„μ„ 쀄일 수 μžˆλ‹€. λͺ¨λ“ˆ λ²ˆλ“€λŸ¬ (μ›ΉνŒ©μ΄λ‚˜ λ‘€μ—…κ³Ό 같은)λ₯Ό μ‚¬μš©ν•˜λŠ” λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ 앱듀을 μœ„ν•΄μ„œ, λ²ˆλ“€λŸ¬λ“€μ€ μžλ™μœΌλ‘œ λ‹Ήμ‹ μ˜ μ˜ˆμƒλŒ€λ‘œ 죽은 μ½”λ“œλ₯Ό μ—†μ•€λ‹€.
λ‹Ήμ‹ μ˜ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό κ·Έκ²ƒμ˜ 좔상적인 μ‹ νƒμŠ€ 트리 λ””νŽœλ˜μ‹œλ“€μ„ κ³ λ €ν•΄ 보라. (μš°λ¦¬λŠ” κ·Έ μ‹ νƒμŠ€ 트리λ₯Ό μ΅œμ ν™” ν•˜κΈ°μœ„ν•΄μ„œ "shake" ν•˜κ³  μ‹Άλ‹€.) 트리 λ‚΄λΆ€μ˜ 각각의 λ…Έλ“œλŠ” λ‹Ήμ‹ μ˜ 앱을 κΈ°λŠ₯ν•˜κ²Œ ν•˜λŠ” λ””νŽœλ˜μ‹œλ“€ 이닀. νŠΈλ¦¬μ‰μ΄ν‚Ήμ—μ„œ, input file듀은 κ·Έλž˜ν”„λ‘œ μ·¨κΈ‰λœλ‹€. 각 κ·Έλž˜ν”„μ˜ 각각의 λ…Έλ“œλŠ” μ½”λ“œμ˜ "part"라고 λΆˆλ¦¬λŠ” μ΅œμƒμœ„ 레벨의 μƒνƒœμ΄λ‹€. νŠΈλ¦¬μ‰μ΄ν‚Ήμ€ μˆœν™˜ν•˜λŠ” κ·Έλž˜ν”„μ΄λ‹€. μ—”νŠΈλ¦¬ν¬μΈνŠΈ λΆ€ν„° μ‹œμž‘ν•˜μ—¬ ν¬ν•¨ν•˜λŠ” μ–΄λ–€ 것듀을 κ²½λ‘œμ— 따라 λͺ¨λ‘ μˆœνšŒν•œλ‹€.
λͺ¨λ“  μ»΄ν¬λ„ŒνŠΈλŠ” 심볼, 심볼 레퍼런슀λ₯Ό μ„ μ–Έν• μˆ˜ 있고 λ‹€λ₯Έ νŒŒμΌλ“€μ— μ˜μ‘΄μ μ΄λ‹€. "parts"κ°€ μ‚¬μ΄λ“œμ΄νŽ™νŠΈλ₯Ό 가지고 μžˆλ‹€κ³  ν‘œμ‹œλ˜μ–΄ μžˆλ“  μ•„λ‹ˆλ“ κ°„μ— 말이닀. 예λ₯Ό λ“€λ©΄, let firstName = 'Jane'μ΄λΌλŠ” 선언은 μ‚¬μ΄λ“œμ΄νŽ™νŠΈκ°€ μ—†λ‹€. μ™œλƒλ©΄ μ € 선언은 λ§Œμ•½ μ–΄λ–€λ°μ—μ„œλ„ firstName을 쓰지 μ•ŠλŠ”λ‹€λ©΄ 제거될수 있기 λ•Œλ¬Έμ΄λ‹€. let firstName = getName()μ΄λΌλŠ” 선언은 μ‚¬μ΄λ“œμ΄νŽ™νŠΈλ₯Ό 가지고 μžˆλ‹€. μ™œλƒν•˜λ©΄ getName()μ΄λΌλŠ” ν•¨μˆ˜λŠ” μ§€μ›Œμ§ˆμˆ˜ μ—†κΈ°λ•Œλ¬Έμ΄λ‹€. λ§Œμ•½ 아무도 firstNameμ΄λΌλŠ” λ³€μˆ˜λ₯Ό 쓰지 μ•Šμ•„λ„ 말이닀.

Imports

ES2015 λͺ¨λ“ˆ μ‹ νƒμŠ€(import와 export)λ₯Ό λ”°λΌμ„œ μ„ μ–Έλœ λͺ¨λ“ˆλ“€λ§Œμ΄ νŠΈλ¦¬μ‰μ΄ν‚Ήμ„ ν•  수 μžˆλ‹€. 당신이 λͺ¨λ“ˆμ„ μž„ν¬νŠΈν•˜λŠ” 방식이 κ·Έ λͺ¨λ“ˆμ΄ νŠΈλ¦¬μ‰μ΄ν‚Ή ν• μˆ˜ μžˆλŠ”μ§€ μ—¬λΆ€λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.
νŠΈλ¦¬μ‰μ΄ν‚Ήμ€ μ‚¬μ΄λ“œ μ΄νŽ™νŠΈμ™€ ν•¨κ»˜ μ—”νŠΈλ¦¬ 포인트의 λͺ¨λ“  νŒŒνŠΈλ“€μ„ κ±°μΉ˜λ©΄μ„œ μ‹œμž‘λœλ‹€. 그리고 μƒˆλ‘œμš΄ μ„Ήμ…˜μ— λ„λ‹¬ν• λ•Œ κΉŒμ§€ κ·Έλž˜ν”„μ˜ κ°€μž₯μžλ¦¬λ“€κΉŒμ§€ μˆœνšŒν•œλ‹€. μˆœνšŒκ°€ μ™„λ£Œλœλ‹€λ©΄, μžλ°”μŠ€ν¬λ¦½νŠΈ λ²ˆλ“€μ€ μˆœνšŒκ°€ μ΄λ£¨μ–΄μ§€λŠ” λ™μ•ˆμ— λ„λ‹¬ν•œ λΆ€λΆ„λ“€λ§Œ ν¬ν•¨ν•œλ‹€. κ·Έ μ™Έμ˜ 쑰각듀은 ν¬ν•¨λ˜μ§€ μ•ŠλŠ”λ‹€. λ‹€μŒκ³Ό 같은 utilities.jsλΌλŠ” νŒŒμΌμ„ λ§Œλ“€μ—ˆλ‹€κ³  ν•΄λ³΄μž:
export function read(props) {⁣⁣ return props.book⁣⁣ }⁣⁣ ⁣⁣ export function nap(props) {⁣⁣ return props.winks⁣⁣ }
그리고 λ‹€μŒκ³Ό 같은 index.js 파일이 μžˆλ‹€:
import { read } from 'utilities';⁣⁣ ⁣⁣ eventHandler = (e) => {⁣⁣ read({ book: e.target.value })⁣⁣ }
μ˜ˆμ‹œμ—μ„œ, nap()은 μ€‘μš”ν•˜μ§€ μ•Šλ‹€. κ·ΈλŸ¬λ―€λ‘œ λ²ˆλ“€μ— ν¬ν•¨λ˜μ§€ μ•ŠλŠ”λ‹€.

Side Effects

μš°λ¦¬κ°€ ES6 λͺ¨λ“ˆλ“€μ„ μž„ν¬νŠΈ ν• λ•Œ, 이 λͺ¨λ“ˆμ€ μ¦‰μ‹œ μ‹€ν–‰λœλ‹€. μš°λ¦¬κ°€ μ–΄λ””μ—μ„œλ„ λͺ¨λ“ˆμ˜ exports듀을 μ½”λ“œμ—μ„œ μ–ΈκΈ‰ν•˜μ§„ μ•Šλ”λΌλ„, λͺ¨λ“ˆ μžμ²΄κ°€ μ‹€ν–‰λ λ•Œ κΈ€λ‘œλ²Œ μŠ€μ½”ν”„μ— 영ν–₯을 λ―ΈμΉ˜λ©΄μ„œ λ°œμƒ ν• μˆ˜ μžˆλ‹€. (polyfill ν˜Ήμ€ global stylesheets 같은 것듀) μš°λ¦¬λŠ” 이것을 μ‚¬μ΄λ“œ μ΄νŽ™νŠΈ (side effect)라고 λΆ€λ₯Έλ‹€. λͺ¨λ“ˆ 자체의 exportsλ₯Ό μ–ΈκΈ‰ν•˜μ§€ μ•Šλ”λΌλ„, λ§Œμ•½ λͺ¨λ“ˆμ΄ μ‹œμž‘κ³Ό ν•¨κ»˜ 값듀을 exports ν•œλ‹€κ³  ν•˜λ©΄, λͺ¨λ“ˆμ€ νŠΈλ¦¬μ‰μ΄ν‚Ή 될 수 μ—†λ‹€. 그것이 importλ λ•Œμ— νŠΉμ •ν•œ 행동 λ™μ•ˆμ—λŠ” 말이닀.
Webpack λ‹€νλ¨ΌνŠΈκ°€ 트리 μ‰μ΄ν‚Ήμ˜ λͺ…ν™•ν•œ μ„€λͺ…을 ν•΄μ€€λ‹€. 그리고 μ–΄λ–»κ²Œ νŠΈλ¦¬μ‰μ΄ν‚Ήμ„ μž˜ν•˜κ²Œ λ§Œλ“œλŠ”μ§€λ„ μ•Œλ €μ€€λ‹€.
Β 
← Go home