๐Ÿƒ ํŠธ๋ฆฌ ์‰์ดํ‚น (Tree Shaking)

์ง€์€ยท2022๋…„ 12์›” 5์ผ
2

ํŠธ๋ฆฌ์‰์ดํ‚น(Tree Shaking)

: ๋‚˜๋ฌด๋ฅผ ํ”๋“ค์–ด ์ž”๊ฐ€์ง€๋ฅผ ํ„ธ์–ด๋‚ด๋“ฏ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ์ตœ์ ํ™” ์ž‘์—…

  • Webpack 4๋ฒ„์ „ ์ด์ƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ES6 ๋ชจ๋“ˆ์„ ๋Œ€์ƒ์œผ๋กœ ๊ธฐ๋ณธ์ ์ธ ํŠธ๋ฆฌ์‰์ดํ‚น์„ ์ œ๊ณตํ•œ๋‹ค.(import, export๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“ˆ)
  • Create React App์„ ํ†ตํ•ด ๋งŒ๋“  React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋„ Webpack์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํŠธ๋ฆฌ์‰์ดํ‚น์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

Webpack์„ ์‚ฌ์šฉํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ ํšจ๊ณผ์ ์œผ๋กœ ํŠธ๋ฆฌ์‰์ดํ‚น์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

1. ํ•„์š”ํ•œ ๋ชจ๋“ˆ๋งŒ importํ•˜๊ธฐ

import ๊ตฌ๋ฌธ์„ ์ด์šฉํ•ด์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ถˆ๋Ÿฌ์™€์„œ ์‚ฌ์šฉํ•  ๋•Œ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ „์ฒด๊ฐ€ ์•„๋‹Œ ํ•„์š”ํ•œ ๋ชจ๋“ˆ๋งŒ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฒˆ๋“ค๋ง ๊ณผ์ •์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋งŒ ํฌํ•จ์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ํŠธ๋ฆฌ์‰์ดํ‚น์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

import React from 'react'; // โŒ

import { useState, useEffect } from 'react; // โญ•๏ธ

2. Babelrc ํŒŒ์ผ ์„ค์ •ํ•˜๊ธฐ

Babel

: JavaScript ๋ฌธ๋ฒ•์ด ๊ตฌ ๋ฒ„์ „ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋„ ํ˜ธํ™˜์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ES5 ๋ฌธ๋ฒ•์œผ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (์ปดํŒŒ์ผ๋Ÿฌ)

์ด๋•Œ, ES5 ๋ฌธ๋ฒ•์€ import๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, commonJS ๋ฌธ๋ฒ•์˜ require๋กœ ๋ณ€๊ฒฝ์‹œํ‚จ๋‹ค.
require๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ชจ๋“  ๋ชจ๋“ˆ์„ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ๋•Œ๋ฌธ์— 1๋ฒˆ์—์„œ ์ž‘์„ฑํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ํ•„์š”ํ•œ ๋ชจ๋“ˆ๋งŒ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋„ ์†Œ์šฉ์ด ์—†์–ด์ง„๋‹ค.

โžก๏ธ ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Babelrc ํŒŒ์ผ์— ์•„๋ž˜์ฒ˜๋Ÿผ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ES5 ๋ฌธ๋ฒ•์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.

// .babelrc
{
  โ€œpresetsโ€: [ 
    [
      โ€œ@babel/preset-envโ€,
      {
	    "modules": false // modules ๊ฐ’์„ false๋กœ ์„ค์ •ํ•˜๋ฉด ES5 ๋ฌธ๋ฒ•์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๊ณ ,
                         // ๋ฐ˜๋Œ€๋กœ true๋กœ ์„ค์ •ํ•˜๋ฉด ํ•ญ์ƒ ES5 ๋ฌธ๋ฒ•์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.
      }
    ]
 ]
}

3. sideEffects ์„ค์ •ํ•˜๊ธฐ

Webpack์€ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ, ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ผ๋„ ํŠธ๋ฆฌ์‰์ดํ‚น์—์„œ ์ œ์™ธ์‹œํ‚จ๋‹ค.

// ์‚ฌ์ดํŠธ ์ดํŽ™ํŠธ๋ฅผ ์ผ์œผํ‚ค๋Š” ์ฝ”๋“œ ์˜ˆ์‹œ
// addCrew() ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜ ์™ธ๋ถ€์— ์žˆ๋Š” ๋ฐฐ์—ด `crews`๋ฅผ ๋ณ€๊ฒฝ์‹œํ‚จ๋‹ค.
const crews = ['kim', 'park'];

const addCrew = (name) => {
  crews.push(name);
}

Webpack์€ ์ˆœ์ˆ˜ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ, ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋ฅผ ์ผ์œผํ‚ค๋Š” ํ•จ์ˆ˜๋ฅผ ํŠธ๋ฆฌ์‰์ดํ‚น์œผ๋กœ ์ œ์™ธํ•˜๋Š” ๊ฒฝ์šฐ, ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ•˜์—ฌ ๋ฒˆ๋“ค๋งํ•  ๋•Œ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์ œ์™ธ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค. (์ฆ‰, ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋ฒˆ๋“ค๋ง์‹œํ‚จ๋‹ค..)

โžก๏ธ ์ด๋•Œ, package.json ํŒŒ์ผ์—์„œ sideEffects๋ฅผ ์„ค์ •ํ•˜์—ฌ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์—์„œ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ˆ ํŠธ๋ฆฌ์‰์ดํ‚น์„ ํ•ด๋„ ๋œ๋‹ค๊ณ  Webpack์—๊ฒŒ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ๋‹ค.

// package.json
{
  "name": "tree-shaking",
  "version": "1.0.0",
  "sideEffects": false
}

ํ˜น์€ ์•„๋ž˜์ฒ˜๋Ÿผ ์ž‘์„ฑํ•˜์—ฌ ํŠน์ • ํŒŒ์ผ์—์„œ๋Š” ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ๋‹ค.

// package.json
{
  "name": "tree-shaking",
  "version": "1.0.0",
  "sideEffects": ["./src/components/NoSideEffect.js"]
}

4. ES6 ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“ˆ ์‚ฌ์šฉํ•˜๊ธฐ

๋ณดํ†ต 3๋ฒˆ๊นŒ์ง€ ์ž‘์„ฑํ•˜๋ฉด ํŠธ๋ฆฌ์‰์ดํ‚น์ด ์ž˜ ์ž‘๋™ํ•œ๋‹ค.
๊ทธ๋Ÿผ์—๋„ ํŠธ๋ฆฌ์‰์ดํ‚น์ด ์ ์šฉ๋˜์ง€ ์•Š๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๋‹ค๋ฉด, ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ES5 ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง„ ์•Š์€์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.
์ด ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น ๋ชจ๋“ˆ์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋Š”, ES6 ๋ฌธ๋ฒ•์„ ์ง€์›ํ•˜๋Š” ๋‹ค๋ฅธ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

profile
๋ธ”๋กœ๊ทธ ์ด์ „ -> https://janechun.tistory.com

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด