#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 λ€νλ¨ΌνΈκ° νΈλ¦¬ μμ΄νΉμ λͺ
νν μ€λͺ
μ ν΄μ€λ€. κ·Έλ¦¬κ³ μ΄λ»κ² νΈλ¦¬μμ΄νΉμ μνκ² λ§λλμ§λ μλ €μ€λ€.
Β