Tree shaking
์ ๊ทธ๋๋ก ํด์ํ๋ฉด ๋๋ฌด ํ๋ค๊ธฐ
๋ผ๋ ๋ป์ผ๋ก, ์ฝ๋๋ด์๋ ๋ช
์๋์ด ์์ง๋ง ์ค์ ๋ก ํ๋ก๊ทธ๋จ ์คํ์ ํ์ํ์ง ์์ ์ฝ๋๋ฅผ build ๋จ๊ณ์ ์ ๊ฑฐํ๋ ๋งค์ปค๋์ฆ์ ์๋ฏธํ๋ค. tree shaking์ ํ๊ฒ ๋๋ฉด bundle file์ optimizationํ ์ ์์ผ๋ฉฐ,
๊ทธ๋งํผ bundle file์ด load๋๋ ์๊ฐ์ด ์ค์ด๋ค๊ธฐ ๋๋ฌธ์ ์ ์ ๋ค์ด ๋น ๋ฅธ ์๋๋ก ์๋น์ค๋ฅผ ์ด์ฉํ ์ ์๊ฒ ๋๋ค. ๊ทธ๋ผ ์ tree shaking ํด์ผํ๋๊ฑธ๊น ์๊ฐํด๋ณด์. ๋ํ์ ์ผ๋ก ๋ค์์ ์ด์ ๊ฐ ์๋ค.
- Interaction์ด ๋ง์์ง๋ฉด์ JS file size๊ฐ ์ฆ๊ฐ
- JS file์ด ๋์ด๋ ๋งํผ api request๋ ๋์ด๋ ๋คํธ์ํฌ ๋ฆฌ์์ค์๋ชจ๊ฐ ์ปค์ง
- JS file ์คํ์๊ฐ๋ ์ฆ๊ฐ๋์ด CPU์ ์ํฅ์ ์ฃผ๊ณ , page load ์๊ฐ์ด ๋์ด๋ user์ ์ดํ๋ฅ ์ฆ๊ฐ
์์ ์ธ๊ฐ์ง ๊ฒฝ์ฐ ๋ง๊ณ ๋ ๋ค์ํ ์ด์ ๊ฐ ์กด์ฌํ๋ค. ํ์ง๋ง ๊ฐ๋ฐ์๋ก ์ผํ๋ค๋ฉด bundle size๋ ์์ผ๋ฉด ์์์๋ก ์ข๋ค๋ ๊ฒ์ ๊ณต๊ฐํ ๊ฒ์ด๋ค.
Webpack ๊ณต์๋ฌธ์๋ฅผ ํ์ธํด๋ณด๋ฉด tree shaking
์ค์ ์ ์ํด ํ ์ ์๋ ๋ํ์ ์ธ ๋ฐฉ๋ฒ์ ์์๋ณด์.
ES6 module
format ์ฌ์ฉ (import
/export
)
ํ์ํ ๋ชจ๋๋ง import
ํ๋ฉด ํด๋น ์ฝ๋๋ง bundling์ buildํ๊ธฐ ๋๋ฌธ์ ์ฝ๋ ํฌ๊ธฐ๋ฅผ ์ค์ผ ์ ์๋ค
import React from 'react'; // X
import { useState, useEffect } from 'react'; // O
commonjs๋ก
compile ๋๋๊ฒ ๋ฐฉ์ง (@babel/preset-env
๋ฑ ์ด์ฉ)
Babel ์ค์ : babel
์ JS ์ต์ ๋ฌธ๋ฒ์ ๊ตฌํ browser์์๋ ํธํ๊ฐ๋ฅํ๋๋ก ๋ณํํ๋ transpiler
์ด๋ค. ES5
๋ฌธ๋ฒ์ import
๋ฅผ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ commonjs
๋ฌธ๋ฒ์ require
๋ก ๋ณ๊ฒฝ์ด ํ์ํ๋ค. ๊ทธ๋ฐ๋ฐ require
๋ export
๋ ๋ชจ๋ ๋ชจ๋์ ๋ถ๋ฌ์ค๊ธฐ ๋๋ฌธ์ tree shaking์ ์ ์ฉ์์ผ๋ ์์ฉ์ด ์๋ค. ์ด๋ฅผ ๋ง๊ธฐ ์ํด babelrc
๋ฅผ ์ค์ ํ์ฌ ES5
๋ณํ์ ๋ง๋๋ค.
โ@babel/preset-envโ,
{
"modules": false
}
package.json
์side Effects
์์ฑ ์ฌ์ฉ
sideEffect ์ต์
์ ์ง์ ๋ด๊ฐ ๋ง๋ package๋ฅผ ๋ค๋ฅธ ๊ฐ๋ฐํ๊ฒฝ์์ tree shaking ๋๋๋ก ์ต์ ํํ ๋ ์ฌ์ฉ ํ ์ ์๋ค. ๊ธฐ๋ณธ๊ฐ์ true
๋ก ๋์ด ์๋ค. ์ด ์ต์
์ package ๊ฐ๋ฐ์๊ฐ webpack ์๊ฒ ์ฌ์ฉํ ์ฝ๋ ์ด์ธ์ ์ฝ๋๋ ์ ๊ฑฐํด๋ ๋ฌธ์ ๊ฐ ์๋์ง ์๋ ค์ฃผ๋ ์ต์
์ด๋ค.
๋ง์ฝ importํ ์ฝ๋๋ฅผ ์ ์ธํ๊ณ ์ ๋ถ ์ ๊ฑฐํด๋ ๊ด์ฐฎ์ผ๋ ค๋ฉด ๊ฐ ์ฝ๋๊ฐ์ ์์กด์ฑ ๊ด๋ฆฌ์ ๋ฌธ์ ๊ฐ ์์ด์ผ ํ๋ค. ์๋ฅผ๋ค์ด, A๋ผ๋ package์์ a
, b
, c
๋ผ๋ ํจ์๊ฐ ์กด์ฌํ ๋ a
๋ง import
ํด์ ์ฌ์ฉํ ๊ฒฝ์ฐ,
// A pacakge
export const a = () => { ... }
export const b = () => { ... }
export const c = () => { ... }
// index.js
import { a } from 'A'
a();
tree shaking
์ ํตํด์ b
์ c
๋ ์ญ์ ๋ ๊ฑฐ๋ผ๊ณ ๊ธฐ๋ํ ์ ์๋ค. ํ์ง๋ง ๋ง์ฝ a
ํจ์์์ b
๋ c
์ ์์กด์ฑ์ ๊ฐ์ง๊ณ ์๋ค๋ฉด ์ด ๋๊ฐ์ง ์ฌ์ฉ๋์ง ์๋ ํจ์๊ฐ ์ญ์ ๋์์๋ ๋ถ์์ฉ์ด ๋ฐ์ํ๊ฒ ๋๋ค.
์ด๋ฌํ ์์กด๊ด๊ณ๋ฅผ ๋ฒ๋ค๋ง ๊ณผ์ ์์ ์ผ์ผ์ด ํ๋จํ๊ธฐ์ ์ด๋ ค์ฐ๋ฏ๋ก, side effect ์ต์
์ ์ ๊ณตํ์ฌ importํ ์ฝ๋๋ฅผ ์ ์ธํ ๋๋จธ์ง๋ฅผ ์ ๊ฑฐํ๋๋ผ๋ ๋ฌธ์ ๊ฐ ๋์ง ์๋์ง ์ค์ ์ ํ ์ ์๋๋ก ํ๋ค.
{
"name": "webpack-tree-shaking-example",
"version": "1.0.0",
"sideEffects": false
}
webpack production mode
์ฌ์ฉ
production ๋ชจ๋๋ webpack ๋ชจ๋ ๋ฒ๋ค๋ง ๊ณผ์ ์์ ์์ฒด์ ์ผ๋ก ์ฝ๋๋ฅผ ์ต์ ํํ์ฌ ์ฉ๋์ ์ค์ธ๋ค. ๋ณดํต ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ์ 30%๊น์ง ๋ฒ๋ค์ฉ๋์ ์ค์ฌ์ค๋ค.