-
Notifications
You must be signed in to change notification settings - Fork 0
Description
νΈλ¦¬ μμ΄νΉμΌλ‘ μλ°μ€ν¬λ¦½νΈ νμ΄λ‘λ μ€μ΄κΈ°
κ°μ Έμ¨ κΈ : https://ui.toast.com/weekly-pick/ko_20180716/
μ€λλ μΉ μ ν리μΌμ΄μ λ€μ κ΅μ₯ν ν¬κ³ , λλΆλΆ μλ°μ€ν¬λ¦½νΈλ‘ λ§λ€μ΄μ§ κ²μ΄λ€. 2018λ μ€μ, HTTP Archiveκ° λ³΄μ¬μ€ λͺ¨λ°μΌ μ₯μΉμμ μλ°μ€ν¬λ¦½νΈμ νκ· μ μ‘ ν¬κΈ°λ μ½ 350 KB μ΄λ€. μ΄κ²μ λ¨μν μ μ‘ ν¬κΈ°μ΄λ€! μλ°μ€ν¬λ¦½νΈλ λ€νΈμν¬ μ μ‘λ λ μ£Όλ‘ μμΆλλ€. μ΄λ μμΆμ νκ³ λλ©΄ μλ°μ€ν¬λ¦½νΈ μ€μ ν¬κΈ°κ° λ λμ΄λλ€λ κ²μ μλ―Ένλ€. μ€μν ν¬μΈνΈλ€. μμ νλ‘μΈμ±μ΄ κ±±μ λλ€λ©΄, μμΆμ μ μ νμ§ μλ€. μμΆλμ§ μμ 900 KBμ μλ°μ€ν¬λ¦½νΈλ νμμ μ»΄νμΌλ¬μμ μ¬μ ν λμΌν ν¬κΈ°λ₯Ό κ°μ§κ³ , μμΆλλ©΄ 300 KBκΉμ§ μ€μ΄λ€κ² λ κ²μ΄λ€.
κ·Έλ¦Ό 1. μλ°μ€ν¬λ¦½νΈ λ€μ΄λ‘λμ μ€ν κ³Όμ . μ€ν¬λ¦½νΈμ μ μ‘ ν¬κΈ°λ 300 KBλ‘ μμΆλμ§λ§, νμ±λκ³ μ»΄νμΌ λ° μ€νλλ©΄ 900 KBλ‘ λμ΄λλ€.
μλ°μ€ν¬λ¦½νΈλ μννλλ° λΉμ©μ΄ λ§μ΄ λλ μμμ΄λ€. λ€μ΄λ‘λνλ λμμλ§ μ κΉ λμ½λ© μκ°μ΄ λ°μνλ μ΄λ―Έμ§μ λ€λ₯΄κ², μλ°μ€ν¬λ¦½νΈλ νμ±λκ³ μ»΄νμΌλκ³ λ§μΉ¨λ΄ μ€νλλ€. λ°μ΄νΈ λ¨μμ μ μ‘μ, λ€λ₯Έ μ’ λ₯μ μμλ³΄λ€ μλ°μ€ν¬λ¦½νΈμμ λ λ§μ λΉμ©μ λ°μμν¨λ€.
κ·Έλ¦Ό 2. 170 KB ν¬κΈ°μ μλ°μ€ν¬λ¦½νΈ νμ±/μ»΄νμΌλ§ μν λΉμ© vs λμΌν ν¬κΈ°μ JPEG μ΄λ―Έμ§ λμ½λ© μκ° (μΆμ²)
μλ°μ€ν¬λ¦½νΈ μμ§ ν¨μ¨μ±μ ν₯μμν€κΈ° μν μ§μμ μΈ κ°μ μ΄ μ΄λ£¨μ΄μ§λ λ°λ©΄ λ κ·Έλ λ―, μλ°μ€ν¬λ¦½νΈ μ±λ₯ ν₯μμ κ°λ°μμ λͺ«μ΄λ€. κ²°κ΅, μ΄ν리μΌμ΄μ μ€κ³λ₯Ό κ°μ νλλ° κ°λ°μ μμ λ³΄λ€ λ λμ μ¬λμ΄ μμκΉ?
λ§μ§λ§μ μλ°μ€ν¬λ¦½νΈ μ±λ₯μ κ°μ νκΈ° μν κΈ°μ λ€μ΄ μλ€. μ½λ μ€ν리ν (Code Splitting)μ μλ°μ€ν¬λ¦½νΈ μ²ν¬λ‘ μ ν리μΌμ΄μ μ λΆν νκ³ , μ²ν¬λ₯Ό νμλ‘ νλ μ ν리μΌμ΄μ μ κ²½λ‘μλ§ μ΄ μ²ν¬λ€μ λ°°λΆνμ¬ μ±λ₯μ κ°μ νλ κΈ°μ μ΄λ€. κ·Έλ¬λ μ΄ κΈ°μ μ μ¬μ©νλ€κ³ ν΄μ, μ¬μ©λμ§ μλ μ½λλ₯Ό ν¬ν¨ν λ¬΄κ±°μ΄ μλ°μ€ν¬λ¦½νΈ μ ν리μΌμ΄μ μ μΌλ°μ μΈ λ¬Έμ λ₯Ό ν΄κ²°νμ§λ λͺ»νλ€. μ΄ λ¬Έμ μ ν΄λ²μ νΈλ¦¬ μμ΄νΉ(Tree Shaking)μμ μ°Ύμ μ μλ€.
νΈλ¦¬ μμ΄νΉμ΄λ 무μμΈκ°?
νΈλ¦¬ μμ΄νΉμ μ¬μ©νμ§ μλ μ½λλ₯Ό μ κ±°νλ λ°©μμ΄λ€. μ΄ μ©μ΄λ Rollupμ μν΄ μΈκΈ°λ₯Ό μ»κ² λμμΌλ, μ¬μ©νμ§ μλ μ½λ μ κ±°μ λν κ°λ μ μ΄λ―Έ μ‘΄μ¬νμλ€. λν μ΄ κ°λ μ webpackμμλ μ°Ύμλ³Ό μ μκ³ , μ΄λ² μν°ν΄μμ μμ μ±μ ν΅ν΄ μ€λͺ νλ€.
"νΈλ¦¬ μμ΄νΉ" μ©μ΄λ λΉμ μ΄ λ§λ μ ν리μΌμ΄μ
μ λ©ν λͺ¨λΈ(mental model)κ³Ό λνλμ νΈλ¦¬ ꡬ쑰μμ μ λλμλ€. νΈλ¦¬ λ΄ κ° λ
Έλλ€μ μ±μ μν΄ νΉμ§μ μΈ κΈ°λ₯λ€μ μ 곡νλ λνλμλ€μ λνλΈλ€. μ΅μ μ±μμλ μ΄λ¬ν λνλμλ€μ λ€μκ³Ό κ°μ΄ μ μ import ꡬ문μΌλ‘ κ°μ Έμ¬ μ μλ€:
// λͺ¨λ λ°°μ΄ μ νΈλ¦¬ν°λ€μ κ°μ Έμ¨λ€.
import arrayUtils from "array-utils";μ°Έκ³ : ES6 λͺ¨λμ΄ λ¬΄μμΈμ§ λͺ¨λ₯Έλ€λ©΄, Pony Fooμ νλ₯ν μ€λͺ μ μΆμ²νλ€. μν°ν΄μ μ½λ€κ° μ무 κ²λ λͺ¨λ₯΄κ² λ€λ©΄, μ΄ κ°μ΄λλ ES6 λͺ¨λ λμμ λν μ§μμ μ»λλ° λμμ΄ λ κ²μ΄λ€.
λΉμ μ μ ν리μΌμ΄μ
μ΄ μ΄μ λ§ λ§λ€μ΄μ‘λ€λ©΄ λΉκ΅μ μ μ μμ λνλμλ₯Ό κ°μ§ κ²μ΄λ€. λν μΆκ°λ λνλμ λλΆλΆμ μ¬μ©ν κ²μ΄λ€. νμ§λ§ μ ν리μΌμ΄μ
μ΄ μ€λλ μλ‘ λ λ§μ λνλμλ€μ΄ μΆκ°λ μ μλ€. 볡μ‘ν λ¬Έμ λ€μ μν΄ μ€λλ λνλμλ€μ λΉΌμ§λ§, μ½λμμλ μ κ±°λμ§ λͺ»ν μ μλ€. λ§μ§λ§μ μ¬μ©νμ§ μλ λλμ μλ°μ€ν¬λ¦½νΈ μ½λλ€κ³Ό ν¨κ» μ±μ΄ λλλ κ²μ΄λ€. νΈλ¦¬ μμ΄νΉμ μ μ ES6 λͺ¨λμ νΉμ λΆλΆμ κ°μ Έμ€λ import ꡬ문μ μ΄μ μ μ¬μ©ν΄ μ΄λ¬ν λ¬Έμ λ₯Ό ν΄κ²°ν κ²μ΄λ€:
// μ νΈμ μΌλΆλ§ κ°μ Έμ¨λ€.
import { unique, implode, explode } from "array-utils";μ΄μ μ λ³Έ import ꡬ문과 μ°¨μ΄μ μ, μ΄μ μμ μμλ "array-utils" λͺ¨λμ λͺ¨λ κ°μ Έμ€μ§λ§ μ΄ μμ μμλ λͺ¨λμ νΉμ λΆλΆλ§ κ°μ Έμ¨λ€. κ°λ° λΉλμμλ μ΄λ€ κ²λ μ€μ νμ§ μμκΈ° λλ¬Έμ import λ κ²κ³Ό μκ΄ μμ΄ μ 체 λͺ¨λμ κ°μ Έμ¨λ€. κ·Έλ¬λ νλ‘λμ
λΉλμμλ λͺ
μμ μΌλ‘ import λμ§ μμ ES6 λͺ¨λλ‘λΆν° exportλ₯Ό "λ¨μ΄λ²λ¦¬κΈ°(shake)" μν΄μ webpackμ μ€μ νκ³ , λΉλ κ²°κ³Όλ¬Ό ν¬κΈ°λ₯Ό λ μκ² λ§λ€ μ μλ€. μ΄λ² κ°μ΄λμμ μ΄λ»κ² μ΄κ²μ ν μ μλμ§ λ°°μ°κ² λ κ²μ΄λ€.
νΈλ¦¬ μμ΄νΉ ν μ μλ μ§μ μ°ΎκΈ°
μ΄ν΄λ₯Ό λκΈ° μν΄ νμλ μμ μ±μ λ§λ€μλ€. μ΄ μμ λ νΈλ¦¬ μμ΄νΉμ΄ μ΄λ»κ² λμνλμ§ μ€λͺ νκΈ° μν΄ webpackμ μ¬μ©νλ€. λΉμ μ 리ν¬μ§ν°λ¦¬λ₯Ό ν΄λ‘ νκ³ λ°λΌν μ μμ§λ§ μ΄ κ°μ΄λμμ λ°©μμ λͺ¨λ λ¨κ³λ₯Ό ν¨κ» λ€λ£° κ²μ΄κΈ° λλ¬Έμ ν΄λ‘ μ κΌ ν νμλ μλ€.
μμ μ±μ κΈ°ν μ΄ννΈ νλ¬μ κ²μ ν μ μλ λ§€μ° κ°λ¨ν λ°μ΄ν°λ² μ΄μ€μ΄λ€. λΉμ μ΄ μΏΌλ¦¬λ₯Ό μ λ ₯νλ©΄ νμ μ μ΄ννΈ νλ¬ λͺ©λ‘μ΄ λνλλ€.
κ·Έλ¦Ό 3. μμ μ± μ€ν¬λ¦°μ·
μμλλ‘, μ±μ ꡬλνλ λμμ λ²€λ(Preactμ Emotion ν΄λΉ)μ μ±-νΉμ μ½λ λ²λ€(webpackμμλ "μ²ν¬"λ‘ λΆλ₯Έλ€)λ‘ λΆλ¦¬λμλ€.
κ·Έλ¦Ό 4. λ κ°μ§ μ± μλ°μ€ν¬λ¦½νΈ λ²λ€. μ΄ νμΌλ€μ μμΆλμ§ μμ ν¬κΈ°μ΄λ€.
μ μ΄λ―Έμ§λ νλ‘λμ λΉλμμ μλ°μ€ν¬λ¦½νΈ λ²λ€μ 보μ¬μ£Όκ³ , μ΄λ μ΄κΈλ¦¬νμ΄λ₯Ό ν΅ν΄μ μ΅μ νλμλ€λ κ²μ μλ―Ένλ€. μ²ν¬ νμΌμ΄ 21.5 KBμ΄λ©΄ 그리 λμμ§ μλ€. κ·Έλ¬λ! 무μμ΄λ μ§ κ°μ νΈλ¦¬ μμ΄νΉμ΄ μΌμ΄λμ§ μμλ€λ κ²μ μ£Όλͺ©ν΄μΌ νλ€. μ± μ½λλ₯Ό ν¨κ» μ΄ν΄λ³΄λ©΄μ 무μμ μμ ν΄μΌν μ§ λ³΄μ.
μ°Έκ³ : μ₯ν©ν μ€λͺ μ΄λ μ½λλ₯Ό 보길 μνμ§ μλλ€λ©΄, μμΌλ‘ λμκ° μ± κΉν 리ν¬μμ νΈλ¦¬ μμ΄νΉμ λν λΈλμΉλ₯Ό 체ν¬μμ ν μ μλ€. λν νΈλ¦¬ μμ΄νΉμ΄ λμν λ μ ννκ² λ¬΄μμ΄ λ³κ²½λμλμ§ λ³΄κΈ° μν΄ λ§μ€ν° λΈλμΉμ diff ν μ μλ€.
μ΄λ€ μ ν리μΌμ΄μ
μμ νΈλ¦¬ μμ΄νΉ ν μ μλ μ§μ μ μ°Ύλ κ²μ μ μ import ꡬ문μ μ°Ύλ κ²μ΄λ€. λ©μΈ μ»΄ν¬λνΈ νμΌμ 맨 μ λΆλΆμμ λ€μκ³Ό κ°μ΄ λ κ²μ λ³Ό μ μλ€.
import * as utils from "../../utils/utils";μλ§λ λΉμ μ μ΄μ μ λΉμ·ν κ²μ 보μμ κ²μ΄λ€. import λ μ μλ ES6 λͺ¨λμ λ΄λ³΄λ΄λ λ°©λ²μ κ΅μ₯ν λ§μ§λ§, μ΄μ κ°μ λ°©μμ΄ λΉμ μ κ΄μ¬μ λ κ²μ΄λ€. μ΄ νΉμ λΌμΈμ "μ΄λ΄, utils λͺ¨λλ‘λΆν° λͺ¨λ κ² μ import ν΄μ utils λ€μμ€νμ΄μ€μ λ£μ΄λΌ"λΌκ³ λ§νλ€. μ¬κΈ°μ ν° κΆκΈμ¦μ΄ μκΈΈ κ²μ΄λ€. "κ·Έ λͺ¨λ μμ μΌλ§λ λ§μ κ² λ€μ΄ μμκΉ?"
μ, utils λͺ¨λμ μμ€ μ½λλ₯Ό 보면 κ΅μ₯ν λ§λ€. 1,300 μ€ μ λ λλ€.
κ·Έλ¬λ κ±±μ νμ§ λ§λΌ. μλ§λ λͺ¨λ κ²λ€μ΄ μ¬μ©λμμ κ²μ΄λ€. κ·Έλ μ§? κ·ΈλΌ μ°λ¦¬λ μ΄ λͺ¨λ κ²λ€μ νμλ‘ ν κΉ? utils λͺ¨λμ import νλ λ©μΈ μ»΄ν¬λνΈ νμΌλ₯Ό λ€μ νμΈνλ©΄μ, μΌλ§λ λ§μ λ€μμ€νμ΄μ€μ μΈμ€ν΄μ€κ° μλμ§ λ³΄μ. νμ€νκ², μ°λ¦¬λ 무μΈκ° λ₯Ό μν΄ λ©μΈ μ»΄ν¬λνΈμ μλ κ²λ€μ μ¬μ©ν΄μΌλ§ νλ€.
κ·Έλ¦Ό 5. λ©μΈ μ»΄ν¬λνΈ νμΌμμ import λ μλ§μ λͺ¨λ μ€μ utils λ€μμ€νμ΄μ€λ μΈ λ²λ§ νΈμΆλμλ€.
λ¬Όλ‘ κ·Έκ²μ μ’μ§ μλ€. μ ν리μΌμ΄μ
μ½λμμ μΈκ΅°λ°μλ§ utils λ€μμ€νμ΄μ€λ₯Ό μ¬μ©νλ€. κ·Όλ° μ΄λ€ κΈ°λ₯μ νλκ°? λ©μΈ μ»΄ν¬λνΈ νμΌμ λ€μ 보면, μ΄ μ½λλ€μ utils.simpleSort ν¨μμμλ§ λνλλ€. μ΄ ν¨μλ λλ‘λ€μ΄ λ©λ΄κ° λ³κ²½λ λ κΈ°μ€ λ²νΈλ‘ κ²μ κ²°κ³Ό λͺ©λ‘μ μ λ ¬νκΈ° μν΄ μ¬μ©λλ€.
if (this.state.sortBy === "model") {
// simpleSortλ μ¬κΈ°μμ μ¬μ©λλ€...
json = utils.simpleSort(json, "model", this.state.sortOrder);
} else if (this.state.sortBy === "type") {
// ..κ·Έλ¦¬κ³ μ¬κΈ°...
json = utils.simpleSort(json, "type", this.state.sortOrder);
} else {
// ..κ·Έλ¦¬κ³ μ¬κΈ°.
json = utils.simpleSort(json, "manufacturer", this.state.sortOrder);
}κ·Έλ λ€. export λλ―Έλ€κ³Ό ν¨κ» 1,300μ€ μ€μμ, μ΄ ν¨μλ§ λ³Ό κ²μ΄λ€. μΉ μ±λ₯μ κ΅μ₯ν λμ κ²μ λ°νλλ€.
μ°Έκ³ : μ΄ νλ‘μ νΈλ μλμ μΌλ‘ λ¨μνκ² μμ±λμκΈ° λλ¬Έμ, νμ₯ν κ³³μ μ°ΎκΈ° κ΅μ₯ν μ½λ€. κ·Έλ¬λ λ§μ λͺ¨λμ μ¬μ©νλ ν° νλ‘μ νΈμμλ μΌλ§λ λ§μ λ²λ€μ΄ import λμλμ§ μκΈ° μ΄λ ΅λ€. webpack λ²λ€ λΆμκΈ°μ source-map-explorerκ° λμμ΄ λ μ μκ³ , μ΄λ¬ν 보쑰 λꡬλ€μ μ¬μ ν κ°λ°λκ³ μλ€.
λ¬Όλ‘ , μ§κΈ μ΄ μμ λ μν°ν΄μ μν΄ μ‘°κΈ κ°κ³΅λμλ€. κ·Έλ¬λ μ’ ν©μ μΈ μλ리μ€κ° μ€μ μ±μμ μΌμ΄λ μ μλ μ΅μ ν κΈ°νμ μ μ¬νλ€λ μ¬μ€μ λ³νμ§ μλλ€. λΉμ μ μ μ©ν νΈλ¦¬ μμ΄νΉ κΈ°νλ₯Ό μ°Ύμκ³ , μ€μ λ‘λ μ΄λ»κ² ν κΉ?
Babelλ‘ ES6 λͺ¨λμ΄ CommonJS λͺ¨λλ‘ λ³νλλ κ² λ§κΈ°
Babelμ λ§μ μ±μμ μμ΄μλ μλ λꡬμ΄λ€. λΆννκ²λ, Babelμ΄ νλ μ΄λ€ κ² λλ¬Έμ νΈλ¦¬ μμ΄νΉ κ°μ κ°λ¨ν μμ
μ μ΄λ ΅κ² λ§λ€ μ μλ€. babel-preset-envλ₯Ό μ¬μ©νλ©΄, ES6 λͺ¨λμ λ²μ©μ μΌλ‘ νΈνλλ CommonJS λͺ¨λ(μ¦, import λμ require λͺ¨λ)λ‘ λ³νν΄μ€λ€. μ΄κ²μ νΈλ¦¬ μμ΄νΉμ νκΈ° μ κΉμ§λ μ’λ€.
νΈλ¦¬ μμ΄νΉμ CommonJS λͺ¨λμμ νκΈ° μ΄λ ΅κ³ , webpackμ μ¬μ©νλ €λ λ²λ€μμ 무μμ μ κ±°ν΄μΌν μ§ λͺ¨λ₯Έλ€. ν΄κ²°μ±
μ κ°λ¨νλ€: ES6 λͺ¨λλ§ λ¨λλ‘ babel-preset-envλ₯Ό μ€μ νλ€. Babelμ μ€μ ν κ³³ μ΄λμλ (.babelrc λλ package.json) μ½κ°μ μ΅μ
μ μΆκ°ν΄μΌ νλ€.
{
"presets": [
["env", {
"modules": false
}]
]
}babel-preset-env μ€μ μμ κ°λ¨ν "modules": falseλ‘ μ€μ νλ©΄ Babelμ μ°λ¦¬μ λ°λλλ‘ λμνλ€. webpackμ΄ λνλμ νΈλ¦¬λ₯Ό λΆμν΄μ μ¬μ©νμ§ μλ λνλμλ€μ μ κ±°νλ€. κ²λ€κ° μ΄ κ³Όμ μ νΈνμ± λ¬Έμ λ₯Ό μΌμΌν€μ§ μλλ€. κ²°κ΅ webpackμ΄ μ½λλ₯Ό λ²μ©μ μΌλ‘ μ¬μ©ν μ μλ ννλ‘ λ³νν΄μ£ΌκΈ° λλ¬Έμ΄λ€.
μ¬μ΄λ μ΄ννΈ κ³ λ €νκΈ°
μ±μμ μ¬μ©νμ§ μλ λνλμλ€μ μ κ±°ν λ κ³ λ €ν΄μΌ ν μ μ νλ‘μ νΈμ λͺ¨λλ€μ΄ μ¬μ΄λ μ΄ννΈλ₯Ό λ°μμν€λμ§ μ¬λΆμ΄λ€. μ¬μ΄λ μ΄ννΈμ ν μλ ν¨μκ° μ€μ½ν λ°μ 무μΈκ°λ₯Ό λ³κ²½ν λμ΄λ€. μ΄λ μ€νμ λν μ¬μ΄λ μ΄ννΈ λ€.
let fruits = ["apple", "orange", "pear"];
console.log(fruits); // (3) ["apple", "orange", "pear"]
const addFruit = function(fruit) {
fruits.push(fruit);
};
addFruit("kiwi");
console.log(fruits); // (4) ["apple", "orange", "pear", "kiwi"]μ΄κ²μ κ΅μ₯ν λ¨μν μμ λ‘, addFruit ν¨μλ fruits λ°°μ΄μ λ³κ²½ν λ μ¬μ΄λ μ΄ννΈλ₯Ό λ°μμν¨λ€. μ΄ fruits λ°°μ΄μ addFruit ν¨μ μ€μ½ν λ°μ μλ€. μ¬μ΄λ μ΄ννΈλ ES6 λͺ¨λμλ μ μ©λλ©°, νΈλ¦¬ μμ΄νΉμ 컨ν
μ€νΈμμ λ¬Έμ κ° λλ€. μμΈ‘ κ°λ₯ν μ
λ ₯μ κ°μ§κ³ λμΌνκ² ν¨μμ μ€μ½ν λ°μ μ΄λ€ κ²λ λ³κ²½νμ§ μμΌλ©΄μ μμΈ‘ κ°λ₯ν κ²°κ³Όλ₯Ό λ°ννλ λͺ¨λμ΄ μμ νκ² νΈλ¦¬ μμ΄νΉμ ν μ μλ λνλμμ΄λ€. μ΄κ²λ€μ μ체μ μΌλ‘ ν¬ν¨λ μ½λμ λͺ¨λμ μ‘°κ°μ΄λ€. μ¦, "λͺ¨λλ€(modules)"μ΄λ€.
webpackμμ κ³ λ €ν΄μΌ ν λΆλΆμ, νλ‘μ νΈμ package.json νμΌμμ "sideEffects": falseλ‘ μ€μ νλ©΄ ν¨ν€μ§μ λνλμλ€μ΄ μ¬μ΄λ μ΄ννΈλ₯Ό λ°μνμ§ μλλ€λ κ²μ΄λ€:
{
"name": "webpack-tree-shaking-example",
"version": "1.0.0",
"sideEffects": false
}μ νμ μΌλ‘, μ¬μ΄λ μ΄ννΈμ μν₯μ λ°μ§ μμ νΉμ νμΌλ€μ μ§μ ν μλ μλ€.
{
"name": "webpack-tree-shaking-example",
"version": "1.0.0",
"sideEffects": [
"./src/utils/utils.js"
]
}μλ μμ μμ, μ§μ λμ§ μμ νμΌμ μ¬μ΄νΈ μ΄ννΈκ° μλ€κ³ κ°μ ν κ²μ΄λ€. package.json νμΌμ μ΄ μ΅μ
μ μΆκ°νκΈ° μνμ§ μλλ€λ©΄, webpack μ€μ νμΌμ module.rules νλκ·Έ κ°μ μ§μ ν μ μλ€.
μνλ κ²λ§ κ°μ Έμ€κΈ°
μ°λ¦¬λ ES6 λͺ¨λμ κ·Έλλ‘ λλ €κ³ Babelμ μ€μ νμ§λ§, utils λͺ¨λμμ νμν ν¨μλ§ κ°μ Έμ€κΈ° μν΄ import ꡬ문μ μ‘°κΈ μμ νλ €κ³ νλ€. κ°μ΄λ μμ μμ νμλ‘ νλ κ²μ simpleSort ν¨μμ΄λ€:
import { simpleSort } from "../../utils/utils";μ΄ κ΅¬λ¬Έμ μ¬μ©νλ©΄μ μ΄λ κ² λ§ν κ²μ΄λ€. "μ΄λ΄, utils λͺ¨λμμ simpleSortλ§ κ°μ Έμ." simpleSort ν¨μλ§ κ°μ Έμ€κ³ μ μ μ€μ½νμ utils λͺ¨λμ΄ μκΈ° λλ¬Έμ, utils.simpleSortμ λͺ¨λ μΈμ€ν΄μ€λ₯Ό simpleSortλ‘ λ³κ²½ν΄μΌ νλ€:
if (this.state.sortBy === "model") {
json = simpleSort(json, "model", this.state.sortOrder);
} else if (this.state.sortBy === "type") {
json = simpleSort(json, "type", this.state.sortOrder);
} else {
json = simpleSort(json, "manufacturer", this.state.sortOrder);
}μ΄μ νΈλ¦¬ μμ΄νΉμ μν μμ μ μννμΌλ, μ μ λ€λ‘ λ¬Όλ¬μμ 보μ.
μ΄κ²μ λνλμ νΈλ¦¬ μμ΄νΉμ νκΈ° μ webpack κ²°κ³Όμ΄λ€:
Asset Size Chunks Chunk Names
js/vendors.16262743.js 37.1 KiB 0 [emitted] vendors
js/main.797ebb8b.js 20.8 KiB 1 [emitted] main
κ·Έλ¦¬κ³ μ΄κ²μ νΈλ¦¬ μμ΄νΉμ ν ν κ²°κ³Όμ΄λ€:
Asset Size Chunks Chunk Names
js/vendors.45ce9b64.js 36.9 KiB 0 [emitted] vendors
js/main.559652be.js 8.46 KiB 1 [emitted] main
λ λ²λ€ νμΌλ€μ μμΆνμ λ, main λ²λ€ νμΌμ μ΄μ μ΄ μκ²Όλ€. utils λͺ¨λμ μ¬μ©νμ§ μλ λΆλΆμ μμ΄νΉνμ¬, λ²λ€ νμΌμμ μ½ 60%μ μ½λλ₯Ό μ κ±°νμλ€. μ΄λ κ²νλ©΄ μ€ν¬λ¦½νΈλ₯Ό λ€μ΄λ‘λνλλ° λλ μκ° λΏλ§ μλλΌ μ²λ¦¬ μκ°λ λ¨μΆλμ΄μ μ’λ€.
μ λμ§ μμ λ
λλΆλΆμ κ²½μ°, μ΄λ° μ¬μν λ³κ²½μ΄ μμ λ νΈλ¦¬ μμ΄νΉμ webpack μ΅μ λ²μ μμ μ λμνμ§λ§ νμ μμΈλ μλ€. μλ₯Ό λ€μ΄, Lodashκ° μμ κ°μ΄λλλ‘ νΈλ¦¬ μμ΄νΉμ΄ μ λμνμ§ μλ μ΄μν κ²½μ°μ ν΄λΉλλ€. Lodash μ€κ³ λ°©μ λλ¬Έμ, a) μ€λλ νμ€ lodash λμ lodash-esλ₯Ό μ€μΉνκ³ b) λ€λ₯Έ λνλμλ₯Ό μμ΄νΉνκΈ° μν΄ μ‘°κΈ λ€λ₯Έ ꡬ문("cherry-picking"μ΄λΌκ³ λ νλ€)μ μ¬μ©νλ€.
// μ€μ μ΄ μ λμ΄μμ΄λ lodash λͺ¨λ κ²λ€μ κ°μ Έμ¨λ€.
import { sortBy } from "lodash";
// sortBy κ²½λ‘μμ κ°μ Έμ¨λ€.
import sortBy from "lodash-es/sortBy";μΌκ΄λκ² import ꡬ문μ μ¬μ©νκΈΈ μ νΈνλ€λ©΄, νμ€ lodash ν¨ν€μ§λ₯Ό μ¬μ© ν μ μλ€. babel-plugin-lodashλ₯Ό μ€μΉνλ€. Babel μ€μ νμΌμ νλ¬κ·ΈμΈμ μΆκ°νλ©΄, import ꡬ문μ μ¬μ©νλ©΄μ μ¬μ©νμ§ μλ λͺ¨λλ€μ μ κ±°ν μ μλ€.
μ€νν λΌμ΄λΈλ¬λ¦¬κ° νΈλ¦¬ μμ΄νΉμ λ°μνμ§ μλλ€λ©΄, ES6 ꡬ문μ μ¬μ©νμ¬ λ©μλλ₯Ό λ΄λ³΄λ΄λμ§ νμΈνλΌ. λ§μ½ CommonJS νμ(μ: module.exports)μΌλ‘ λ΄λ³΄λ΄κ³ μλ€λ©΄, ν΄λΉ μ½λλ νΈλ¦¬ μμ΄νΉμ ν μ μλ€. λͺλͺ νλ¬κ·ΈμΈλ€μ CommonJS λͺ¨λμ μν νΈλ¦¬ μμ΄νΉ κΈ°λ₯μ μ 곡νλ€. (μ: webpack-common-shake) κ·Έλ¬λ μ΄ νλ¬κ·ΈμΈλ€μ νΈλ¦¬ μμ΄νΉμ ν μ μλ λͺ κ°μ§ CommonJS ν¨ν΄λ§νΌμ΄λ κ° κΈΈμ΄ λ©λ€. λΉμ μ μ ν리μΌμ΄μ
μμ μ¬μ©νμ§ μλ λνλμλ€μ νμ€νκ² μ κ±°νκΈ°λ₯Ό μνλ€λ©΄, μμΌλ‘ ES6 λͺ¨λμ μ¬μ©ν΄μΌ ν κ²μ΄λ€.
νΈλ¦¬ μμ΄νΉμ ν΄λ³΄μ!
νΈλ¦¬ μμ΄νΉμ΄ κ°λ₯ν μ λλ μ±κ³Ό μ±μμ μ¬μ©νκ³ μλ λνλμ λ° μ€κ³ ꡬ쑰μ λ°λΌ λ€λ₯΄λ€. μλν΄λ³΄λΌ! λͺ¨λ λ²λ€λ¬μ νΈλ¦¬ μμ΄νΉμ μν μ΅μ μ΄ μ€μ λμ§ μμλ€λ κ²μ μκ³ μλ€λ©΄, μ ν리μΌμ΄μ μ μ΄λ€ μ΄μ μ΄ μλμ§ λ³΄κ³ ν΄λ³΄λλ° μλ¬΄λ° ν΄κ° μλ€. λ²λ€ νμΌμμ μ κ±° κ°λ₯ν μ¬μ©νμ§ μλ μ΄λ€ μ½λλ κ°μΉ μλ μ΅μ νλ€.
νΈλ¦¬ μμ΄νΉμΌλ‘λΆν° λ§μ μ΄μ΅μ μ»κ±°λ κ·Έλ μ§ μμ μλ μλ€. κ·Έλ¬λ νλ‘λμ λΉλμμ νΈλ¦¬ μμ΄νΉμ μ΄μ μ μν΄ λΉλ μμ€ν μ ꡬμ±νκ³ μ ν리μΌμ΄μ μμ νμλ‘ νλ κ²λ§ μ νμ μΌλ‘ κ°μ Έμ€λ κ²μΌλ‘μ¨, λΉμ μ μ ν리μΌμ΄μ μ κ°λ₯ν ν κ°λ³κ² μ μ§μμΌμ€ κ²μ΄λ€. νΈλ¦¬ μμ΄νΉμ μ±λ₯κ³Ό νμ₯, μ¬μ©μλ€μκ² μ’λ€.



