Webpack Tree Shaking ๋™์ž‘ ์›๋ฆฌ

2025. 9. 17. 10:23ยท๐Ÿ’™ ํ”„๋ก ํŠธ์—”๋“œ(FE)
728x90

ํŠธ๋ฆฌ์…ฐ์ดํ‚น(Tree Shaking)

ํŠธ๋ฆฌ์…ฐ์ดํ‚น(Tree Shaking)์€ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ด์—์š”. ๋งˆ์น˜ ๋‚˜๋ฌด๋ฅผ ํ”๋“ค์–ด ๋ถˆํ•„์š”ํ•œ ์žŽ์„ ๋–จ์–ด๋œจ๋ฆฌ๋“ฏ, ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ(Dead Code)๊ฐ€ ๋ฒˆ๋“ค ํŒŒ์ผ์— ํฌํ•จ๋˜์ง€ ์•Š๋„๋ก ํ•ด์š”.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ํŠน์ • ํ•จ์ˆ˜ ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ๋„ ์ „์ฒด ์ฝ”๋“œ๊ฐ€ ๋ฒˆ๋“ค์— ํฌํ•จ๋ผ ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ปค์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ด๋Ÿด ๋•Œ ํŠธ๋ฆฌ์…ฐ์ดํ‚น์„ ์ ์šฉํ•˜๋ฉด ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋งŒ ๋ฒˆ๋“ค์— ๋‚จ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์— ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ํฌ๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ์–ด์š”.

 

๋ฒˆ๋“ค ํฌ๊ธฐ๊ฐ€ ์ค„์–ด๋“ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋กœ๋”ฉ ์†๋„๊ฐ€ ๋นจ๋ผ์ง€๊ณ , ์‚ฌ์šฉ์ž ๊ฒฝํ—˜๋„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ด์ œ ํŠธ๋ฆฌ์…ฐ์ดํ‚น์˜ ์ฃผ์š” ํŠน์ง•์— ๋Œ€ํ•ด ์‚ดํŽด๋ณผ๊ฒŒ์š”.

ํŠธ๋ฆฌ์…ฐ์ดํ‚น์ด ๋™์ž‘ํ•˜๋Š” ํ™˜๊ฒฝ

ํŠธ๋ฆฌ์…ฐ์ดํ‚น์€ ์ •์  ๋ถ„์„(Static Analysis) ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘๋™ํ•ด์š”. ์ •์  ๋ถ„์„์€ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ๊ตฌ์กฐ๋ฅผ ๋ถ„์„ํ•ด, ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ •ํ™•ํžˆ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฒ•์ด์ฃ . ๋”ฐ๋ผ์„œ ํŠธ๋ฆฌ์…ฐ์ดํ‚น์€ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜๊ณ  ๋ฒˆ๋“ค๋งํ•˜๋Š” ๋นŒ๋“œ ํƒ€์ž„์— ์ ์šฉ๋ผ์š”.

 

ํŠธ๋ฆฌ์…ฐ์ดํ‚น์ด ์ž˜ ๋™์ž‘ํ•˜๋ ค๋ฉด, ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ๋ชจ๋“ˆ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ชจ๋“ˆ์ด ๊ตฌ์„ฑ๋˜์–ด์•ผ ํ•ด์š”. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์—๋Š” ESM๊ณผ CJS ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์ด ์žˆ๋Š”๋ฐ, ESM์€ ์ •์ ์ธ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋นŒ๋“œ ํƒ€์ž„์— ๋ถ„์„์ด ๊ฐ€๋Šฅํ•˜๊ณ , ํŠธ๋ฆฌ์…ฐ์ดํ‚น์ด ํšจ๊ณผ์ ์œผ๋กœ ์ ์šฉ๋ผ์š”.

ESM๊ณผ CJS์˜ ๊ตฌ์กฐ์ ์ธ ํŠน์„ฑ์„ ๋น„๊ตํ•˜๋ฉด์„œ ํŠธ๋ฆฌ์…ฐ์ดํ‚น์ด ESM์—์„œ ํšจ๊ณผ์ ์ธ ์ด์œ ๋ฅผ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณผ๊ฒŒ์š”.

 

ESM

ESM์€ import์™€ export ๊ตฌ๋ฌธ์œผ๋กœ ๋ชจ๋“ˆ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋ถ„์„ํ•ด ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋“ค์–ด์š”. ์ด ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„๋กœ ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ํŒ๋‹จํ•˜๊ณ  ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์–ด์š”.

 

 

์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„๋Š” ์ถ”์ƒ ๊ตฌ๋ฌธ ํŠธ๋ฆฌ(AST)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑ๋ผ์š”. AST๋Š” ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ๋ฌธ์ž์—ด๋กœ ๋œ ์ฝ”๋“œ๋ฅผ ํŠธ๋ฆฌ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ, ์ฝ”๋“œ์˜ ๊ตฌ์กฐ์™€ ๋ชจ๋“ˆ ๊ฐ„ ๊ด€๊ณ„๋ฅผ ๋ถ„์„ํ•˜๋Š” ๋ฐ ํ™œ์šฉ๋˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์˜ˆ์š”.
๋ฒˆ๋“ค๋Ÿฌ๋Š” AST๋ฅผ ๋ถ„์„ํ•ด ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋“ค๊ณ , ์ด ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ฐธ์กฐ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ฐพ์•„ ์ œ๊ฑฐํ•ด ์ตœ์ ํ™”๋œ ๋ฒˆ๋“ค์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์–ด์š”.

 

์ด๋Ÿฌํ•œ ํŠน์„ฑ ๋•๋ถ„์— ESM์—์„œ๋Š” ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ์ฐพ์•„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์–ด์š”.

  • importํ•œ ๋ชจ๋“ˆ์€ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ์žฌํ• ๋‹นํ•  ์ˆ˜ ์—†์–ด์š”
    import { math } from "./math.js";
    
    math = {}; // Error
  • ESM์˜ import๋Š” ์ฝ๊ธฐ ์ „์šฉ(immutable)์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์ ธ์˜จ ๋ชจ๋“ˆ์„ ์žฌํ• ๋‹นํ•  ์ˆ˜ ์—†์–ด์š”.
    ์ด๋Š” ๋ชจ๋“ˆ ๊ฐ„์˜ ์˜์กด์„ฑ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ , ์ •์  ๋ถ„์„์„ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ ์„ค๊ณ„์˜ˆ์š”.
  • import ๋ฐ export ๊ตฌ๋ฌธ์€ ํ•ญ์ƒ ํŒŒ์ผ์˜ ์ตœ์ƒ๋‹จ์— ์œ„์น˜ํ•ด์•ผ ํ•ด์š” ESM์—์„œ๋Š” import์™€ export๊ฐ€ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ์ •์ ์œผ๋กœ ๋ถ„์„๋˜๋ฏ€๋กœ, ์‹คํ–‰ ๋„์ค‘ ๋™์ ์œผ๋กœ ํ‰๊ฐ€๋  ์ˆ˜ ์—†์–ด์š”. ๋”ฐ๋ผ์„œ ์กฐ๊ฑด๋ฌธ ์•ˆ์—์„œ import๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ํ•ญ์ƒ ์ตœ์ƒ๋‹จ์— ์œ„์น˜ํ•ด์•ผ ํ•ด์š”.
  • if (condition) {
      import { func } from "./module.js"; // Error
    }
  • ESM์€ import() ๊ตฌ๋ฌธ์„ ์ง€์›ํ•ด์„œ ํ•„์š”ํ•œ ์‹œ์ ์— ๋ชจ๋“ˆ์„ ๋™์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๊ณ , ์ด๋ฅผ ํ†ตํ•ด ์ดˆ๊ธฐ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์–ด์š”.
  • async function loadUtils() {
      const { deepEqual } = await import("lodash-es");
      console.log(deepEqual(a, b));
    }

CJS

CJS๋Š” require๋ฅผ ์‚ฌ์šฉํ•ด ํ•ญ์ƒ ๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ๋ชจ๋“ˆ์„ ๋ถˆ๋Ÿฌ์™€์š”. ์ฆ‰, ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋  ๋•Œ ์ฆ‰์‹œ ํ•ด๋‹น ๋ชจ๋“ˆ์„ ๋ถˆ๋Ÿฌ์•ผ ํ•˜๊ณ  ๋น„๋™๊ธฐ ๋กœ๋”ฉ์€ ์ง€์›ํ•˜์ง€ ์•Š์•„์š”.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ๋Š” CJS์˜ ๋™์ž‘์„ ์ •ํ™•ํžˆ ์˜ˆ์ธกํ•˜๊ธฐ ์–ด๋ ค์›Œ์š”.

1. ํ•จ์ˆ˜๋‚˜ ์กฐ๊ฑด๋ฌธ ์•ˆ์—์„œ ๋™์ ์œผ๋กœ ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•  ๋•Œ

๋‹ค์Œ ์ฝ”๋“œ์ฒ˜๋Ÿผ require๋‚˜ import ๊ฐ™์€ ๋ชจ๋“ˆ ๋กœ๋“œ๋ฅผ ํ•จ์ˆ˜๋‚˜ ์กฐ๊ฑด๋ฌธ ์•ˆ์—์„œ ๋™์ ์œผ๋กœ ์‚ฌ์šฉํ•  ๋•Œ, ๋ฒˆ๋“ค๋Ÿฌ๋Š” ์ฝ”๋“œ ์‹คํ–‰ ์ „์—๋Š” ์ •ํ™•ํžˆ ์–ด๋–ค ๋ชจ๋“ˆ์ด ๋กœ๋“œ๋ ์ง€ ์•Œ ์ˆ˜ ์—†์–ด์š”.

๊ทธ๋ž˜์„œ ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ์ „์ฒด ์˜์กด์„ฑ์„ ๋ฏธ๋ฆฌ ํŒŒ์•…ํ•˜๊ฑฐ๋‚˜ ์ตœ์ ํ™”ํ•˜๊ธฐ ์–ด๋ ค์›Œ์ ธ์š”.

let foo;
if (SOME_CONDITION) {
  foo = require("something");
} else {
  foo = require("something_else");
}

2. ๋ชฝํ‚ค ํŒจ์นญ ๋“ฑ์œผ๋กœ ์˜ˆ์ƒํ•˜์ง€ ๋ชปํ•œ ๋™์ž‘์ด ์ƒ๊ธธ ๋•Œ

๋ชฝํ‚ค ํŒจ์นญ์€ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๋ชจ๋“ˆ์ด๋‚˜ ํ•จ์ˆ˜์˜ ๋™์ž‘์„ ๋Ÿฐํƒ€์ž„ ์ค‘์— ๋ฎ์–ด์จ์„œ ์›ํ•˜๋Š” ๋Œ€๋กœ ๋ฐ”๊พธ๋Š” ๊ธฐ๋ฒ•์ด์—์š”. ์ด ๊ฒฝ์šฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ๋ฒˆ๋“ค๋Ÿฌ ์ž…์žฅ์—์„œ๋Š” ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์—๋Š” ์–ด๋–ค ๋ชจ๋“ˆ์ด, ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝ๋ ์ง€ ์•Œ ์ˆ˜ ์—†์–ด์š”. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ฒˆ๋“ค๋Ÿฌ๋Š” ์ฝ”๋“œ ๋ถ„์„์ด ์–ด๋ ค์›Œ์ง€๊ณ , ์˜ˆ์ƒํ•˜์ง€ ๋ชปํ•œ ๋™์ž‘์ด๋‚˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด์š”.

ESM ๊ธฐ๋ฐ˜์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ 

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋งŒ ๊ฐ€์ ธ์˜ค๋”๋ผ๋„, ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์ด๋‚˜ ๋ฒˆ๋“ค ์„ค์ •์ด ์ œ๋Œ€๋กœ ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ์ „์ฒด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํฌํ•จ๋ผ ๋ฒˆ๋“ค ํฌ๊ธฐ๊ฐ€ ์ปค์งˆ ์ˆ˜ ์žˆ์–ด์š”.

์˜ˆ๋ฅผ ๋“ค์–ด, lodash ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ deepEqual ํ•จ์ˆ˜ ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•ด๋ณผ๊ฒŒ์š”.

import { deepEqual } from "lodash";

ํ•˜์ง€๋งŒ lodash๋Š” CJS ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑ๋ผ ํŠธ๋ฆฌ์…ฐ์ดํ‚น์ด ์ž˜ ์ ์šฉ๋˜์ง€ ์•Š์•„์š”. ๊ฒฐ๊ณผ์ ์œผ๋กœ deepEqual ์™ธ์—๋„ lodash์˜ ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ๋ฒˆ๋“ค์— ํฌํ•จ๋  ์ˆ˜ ์žˆ์–ด์š”.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด lodash ๋Œ€์‹  ESM์„ ์ง€์›ํ•˜๋Š” es-toolkit์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ด์š”.

import { isEqual } from "es-toolkit";

const result = isEqual(a, b);

es-toolkit๋Š” ESM ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•ด ํ•„์š”ํ•œ ํ•จ์ˆ˜๋งŒ ์„ ํƒ์ ์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ณ , ํŠธ๋ฆฌ์…ฐ์ดํ‚น์„ ์‚ฌ์šฉํ•ด ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์–ด์š”.

์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๊ฐ€ ์—†๋Š” ์ฝ”๋“œ ์ œ๊ฑฐ

์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ(Side-Effect)๋Š” ์ฝ”๋“œ๊ฐ€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฐฉ์‹์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋™์ž‘์— ๋ถ€์ž‘์šฉ์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์„ ์˜๋ฏธํ•ด์š”. ์ฆ‰, ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๊ฐ€ ์—†๋Š” ์ฝ”๋“œ๋ž€ ๋ฒˆ๋“ค๋ง๋œ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋  ๋•Œ ๋™์ž‘์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š” ์ฝ”๋“œ์˜ˆ์š”.

์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๊ฐ€ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ๋“ค์–ด ๋ณผ๊ฒŒ์š”.

 

 

1. ํ˜ธ์ถœ๋  ๋•Œ ์™ธ๋ถ€ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜

let count = 0;

function incrementCount() {
  count = count + 1; // ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ์ „์—ญ ๋ณ€์ˆ˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋จ (์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ ๋ฐœ์ƒ)
}

incrementCount();

 

2.์ง์ ‘์ ์œผ๋กœ DOM ๋ณ€๊ฒฝ

function updateDOM() {
  document.body.innerHTML = "<h1>Hi Toss!</h1>"; // DOM์ด ๋ณ€๊ฒฝ๋จ
}

 

3.์กฐํšŒ๋ฅผ ํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜

const user = {};

// Object.defineProperty๋ฅผ ์ด์šฉํ•œ ์†์„ฑ ์กฐ์ž‘
Object.defineProperty(user, "name", {
  get() {
    console.log("์ด๋ฆ„์ด ๋ญ์˜ˆ์š”?");
    this._name = this._name ? this._name + "!" : "Hany"; // ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ถ€์ž‘์šฉ ๋ฐœ์ƒ
    return this._name;
  }
});

console.log(user.name); // "์ด๋ฆ„์ด ๋ญ์—์š”?" ์ถœ๋ ฅ ํ›„ "Hany"
console.log(user.name); // "์ด๋ฆ„์ด ๋ญ์—์š”?" ์ถœ๋ ฅ ํ›„ "Hany!"
console.log(user.name); // "์ด๋ฆ„์ด ๋ญ์—์š”?" ์ถœ๋ ฅ ํ›„ "Hany!!"

๋ฐ˜๋Œ€๋กœ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๊ฐ€ ์—†๋Š” ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•„์š”.

  1. ์ˆœ์ˆ˜ํ•จ์ˆ˜: ์™ธ๋ถ€ ๋ณ€์ˆ˜๋‚˜ ์ „์—ญ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ , ์ž…๋ ฅ๊ฐ’์— ๋”ฐ๋ผ ํ•ญ์ƒ ๋™์ผํ•œ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜
function add(a, b) {
  return a + b;
}

const result = add(2, 3);
console.log(result);

 

 

 

2. ์กฐํšŒ ์‹œ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜

const user = {
  _name: "Hany",
  get name() {
    console.log("์ด๋ฆ„์ด ๋ญ์˜ˆ์š”?");
    return this._name; // ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜
  }
};

console.log(user.name); // "์ด๋ฆ„์ด ๋ญ์˜ˆ์š”?" ์ถœ๋ ฅ ํ›„ "Hany"
console.log(user.name); // "์ด๋ฆ„์ด ๋ญ์˜ˆ์š”?" ์ถœ๋ ฅ ํ›„ "Hany"
console.log(user.name); // "์ด๋ฆ„์ด ๋ญ์˜ˆ์š”?" ์ถœ๋ ฅ ํ›„ "Hany"

 

3.์›๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋‚ด์žฅ ํ•จ์ˆ˜

arr.slice(1);
arr.map((num) => num * 2);
arr.filter((num) => num > 1);

str.toUpperCase();
str.repeat(3);

Math.floor(4.8);
Math.abs(-10);

์ด์ฒ˜๋Ÿผ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๊ฐ€ ์—†๋Š” ์ฝ”๋“œ๋Š” ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ์•ˆ์ „ํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•˜๋ฉด, ์ตœ์ข… ๋ฒˆ๋“ค์—์„œ ์ œ๊ฑฐ๋ผ์š”.

ํŠธ๋ฆฌ์…ฐ์ดํ‚น ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ ์ถ”๊ฐ€ ์„ค์ •

์‹ค์ œ๋กœ ์ž‘์„ฑํ•˜๋Š” ์ฝ”๋“œ์—๋Š” ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๊ฐ€ ํฌํ•จ๋  ๋•Œ๊ฐ€ ๋งŽ์•„์š”. ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ์ด๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก, ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜, ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ์ž๋™์œผ๋กœ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜๋„ ์žˆ์–ด์š”.

๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€์˜ˆ์š”.

์ฃผ์„ ์„ค์ •

/* @__PURE__ */ ์ฃผ์„์€ ์ด ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋”๋ผ๋„ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์„ ๋ฒˆ๋“ค๋Ÿฌ์—๊ฒŒ ๋ช…์‹œ์ ์œผ๋กœ ์•Œ๋ฆฌ๋Š” ์—ญํ• ์„ ํ•ด์š”. ์ฆ‰, ์™ธ๋ถ€ ์ƒํƒœ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋‹จ์–ธํ•˜๋Š” ๊ฑฐ์˜ˆ์š”. ํŠธ๋ฆฌ์…ฐ์ดํ‚น ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ๋ฒˆ๋“ค๋ง ๊ณผ์ •์—์„œ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๋ช…์‹œ์ ์œผ๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์–ด์š”.

 

๋‹ค์Œ๊ณผ ๊ฐ™์ด /* @__PURE__ */ ์ฃผ์„์ด ํฌํ•จ๋œ ์ฝ”๋“œ๋ฅผ ๋ฒˆ๋“ค๋งํ•˜๋ฉด,

const Icon = /* @__PURE__ */ React.createElement(...);

 

๋ฒˆ๋“ค๋Ÿฌ๋Š” ํ•ด๋‹น ์ฝ”๋“œ๊ฐ€ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๊ฐ€ ์—†๋‹ค๊ณ  ํŒ๋‹จํ•  ์ˆ˜ ์žˆ์–ด์š”. ๊ทธ ๊ฒฐ๊ณผ, ์ตœ์ ํ™” ๊ณผ์ •์—์„œ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์•„๋ž˜์ฒ˜๋Ÿผ ์ œ๊ฑฐ๋  ์ˆ˜ ์žˆ์–ด์š”.

const Icon = /* @__PURE__ */ React.createElement(...);

sideEffects ํ•„๋“œ ํ™œ์šฉ

package.json ํŒŒ์ผ์˜ sideEffects ํ•„๋“œ๋Š” ํŠน์ • ํŒŒ์ผ์ด๋‚˜ ์ฝ”๋“œ๊ฐ€ ๋ฒˆ๋“ค๋ง ๊ณผ์ •์—์„œ ์ œ๊ฑฐ๋˜์ง€ ์•Š๋„๋ก ๋ฒˆ๋“ค๋Ÿฌ์— ์•Œ๋ ค์ฃผ๋Š” ์—ญํ• ์„ ํ•ด์š”.

๋ชจ๋“  ํŒŒ์ผ์— ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๊ฐ€ ์—†๋‹ค๊ณ  ์„ ์–ธํ•˜๊ธฐ

// package.json
{
  "sideEffects": false
}

์ด๋ ‡๊ฒŒ ์„ค์ •ํ•˜๋ฉด, ๋ฒˆ๋“ค๋Ÿฌ๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ชจ๋“  ํŒŒ์ผ์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์–ด์š”.

ํŠน์ • ํŒŒ์ผ์ด๋‚˜ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ œ๊ฑฐํ•˜์ง€ ์•Š๋„๋ก ์„ค์ •ํ•˜๊ธฐ

// package.json
{
  "sideEffects": ["*.css", "./src/global.js"]
}

์ด ์„ค์ •์€ CSS ํŒŒ์ผ๊ณผ ํŠน์ • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด ์ œ๊ฑฐ๋˜์ง€ ์•Š๋„๋ก ๋ช…์‹œํ•˜๋Š” ๋ฐฉ์‹์ด์—์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, global.js ํŒŒ์ผ์ด ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ดˆ๊ธฐํ™”๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๊ฒฝ์šฐ, ํŠธ๋ฆฌ์…ฐ์ดํ‚น ๊ณผ์ •์—์„œ ์‹ค์ˆ˜๋กœ ์ œ๊ฑฐ๋˜์ง€ ์•Š๋„๋ก ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ์–ด์š”.

์ด๋ ‡๊ฒŒ ํ•„์š”ํ•œ ํŒŒ์ผ์„ ์ง€์ •ํ•˜๋ฉด, ํŠธ๋ฆฌ์…ฐ์ดํ‚น์˜ ํšจ๊ณผ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ํ•„์ˆ˜์ ์ธ ์ฝ”๋“œ๊ฐ€ ๋ฒˆ๋“ค์—์„œ ๋น ์ง€๋Š” ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ด๋กœ์จ ๋นŒ๋“œ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์–ด์š”.

๋ฒˆ๋“ค๋Ÿฌ ์„ธํŒ… ๊ฐ€์ด๋“œ

ํŠธ๋ฆฌ์…ฐ์ดํ‚น์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋”๋ผ๋„, ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ์—๋Š” ์—ฌ์ „ํžˆ ๋ถˆํ•„์š”ํ•œ ๊ณต๋ฐฑ, ์ฃผ์„, ์ตœ์ ํ™”๋˜์ง€ ์•Š์€ ํ‘œํ˜„ ๋“ฑ์ด ๋‚จ์•„ ์žˆ์„ ์ˆ˜ ์žˆ์–ด์š”. ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ์—์„œ๋Š” ์ด ์ž”์—ฌ ์š”์†Œ๋ฅผ ์••์ถ•(minify)ํ•ด ์ฝ”๋“œ ํฌ๊ธฐ๋ฅผ ์ถ”๊ฐ€๋กœ ์ค„์—ฌ์•ผ ์ตœ์ข… ๋ฒˆ๋“ค์˜ ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ์–ด์š”.

 

 

์„ค์น˜ ๋ฐฉ๋ฒ•

npm install --save-dev terser-webpack-plugin

์„ค์ • ์˜ˆ์‹œ

// webpack.config.js
const TerserPlugin = require("terser-webpack-plugin");

module.exports = {
  optimization: {
    minimize: true,
    minimizer: [new TerserPlugin()]
  }
};
 

 

 


๐Ÿค” ๊ทธ๋ ‡๋‹ค๋ฉด Webpack์€ ์–ด๋–ป๊ฒŒ ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋“ค๊ณ , AST ๋ถ„์„์„ ํ†ตํ•ด ํŠธ๋ฆฌ ์‰์ดํ‚น(Tree Shaking)์„ ์ˆ˜ํ–‰ํ• ๊นŒ์š”?

์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„

  1. ์—”ํŠธ๋ฆฌ(entry)์—์„œ ์‹œ์ž‘ : Webpack์€ index.js๋ฅผ ์ฝ๊ณ  import/require ๊ตฌ๋ฌธ์„ ์ถ”์ ํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  2. entry: "./src/index.js"
  3. ๋ชจ๋“ˆ ํƒ์ƒ‰
    • import A from './A.js'
    • import { B } from './B.js'
      ์ด๋Ÿฐ ๊ตฌ๋ฌธ์„ ๋”ฐ๋ผ๊ฐ€๋ฉฐ ๋ชจ๋“ˆ๋“ค์„ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค.
  4. ๊ทธ๋ž˜ํ”„ ๊ตฌ์„ฑ
    • ๊ฐ ๋ชจ๋“ˆ์„ ๋…ธ๋“œ(node)๋กœ, import ๊ด€๊ณ„๋ฅผ ์—ฃ์ง€(edge)๋กœ ์—ฐ๊ฒฐ
    • ์ตœ์ข…์ ์œผ๋กœ ํ•˜๋‚˜์˜ Directed Graph(์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„)๊ฐ€ ๋งŒ๋“ค์–ด์ง

 

 AST ๋ณ€ํ™˜

  • Webpack ์ž์ฒด๋Š” AST๋ฅผ ์ง์ ‘ ๋‹ค๋ฃจ์ง€ ์•Š๊ณ , acorn(JS ํŒŒ์„œ) ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•ด์„œ ์†Œ์Šค๋ฅผ AST(Abstract Syntax Tree)๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ ๋ชจ๋“ˆ์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ AST๋กœ ํŒŒ์‹ฑ → import/export ๊ตฌ๋ฌธ์„ ํƒ์ง€ → ๊ทธ๋ž˜ํ”„์™€ ์—ฐ๊ฒฐ

์˜ˆ:

import { add } from "./math.js";
console.log(add(2, 3));

 

์ด๋ฅผ AST๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด:

  • ImportDeclaration ๋…ธ๋“œ (math.js๋ฅผ ๊ฐ€์ ธ์˜ด)
  • CallExpression ๋…ธ๋“œ (add ํ•จ์ˆ˜ ํ˜ธ์ถœ)
  • MemberExpression, Identifier ๋“ฑ๋“ฑ

Webpack์€ ์ด AST๋ฅผ ํ•ด์„ํ•ด์„œ ์‹ค์ œ๋กœ ์–ด๋–ค ์‹ฌ๋ณผ์ด ์‚ฌ์šฉ๋˜๋Š”์ง€๋ฅผ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.


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

https://webpack.kr/guides/tree-shaking/

 

Tree Shaking | ์›นํŒฉ

์›นํŒฉ์€ ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ์ž…๋‹ˆ๋‹ค. ์ฃผ์š” ๋ชฉ์ ์€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก JavaScript ํŒŒ์ผ์„ ๋ฒˆ๋“ค๋กœ ๋ฌถ๋Š” ๊ฒƒ์ด์ง€๋งŒ, ๋ฆฌ์†Œ์Šค๋‚˜ ์• ์…‹์„ ๋ณ€ํ™˜ํ•˜๊ณ  ๋ฒˆ๋“ค๋ง ๋˜๋Š” ํŒจํ‚ค์ง•ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

webpack.kr

 

ํŠธ๋ฆฌ ์‰์ดํ‚น์€ ๋‚˜๋ฌด๋ฅผ ํ”๋“ค์–ด์„œ ์ฃฝ์€ ๋‚˜๋ญ‡์žŽ์„ ๋–จ์–ดํŠธ๋ฆฌ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋นŒ๋“œ ๊ณผ์ •์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”(exported but unused) ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.

 

 

 

Webpack ๋ฌธ์„œ์—์„œ ๋งํ•˜๋Š” Tree Shaking 

 

  • Tree Shaking์ด๋ž€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ(์˜ˆ: exportํ–ˆ์ง€๋งŒ import๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜/๋ณ€์ˆ˜/๋ชจ๋“ˆ)๋ฅผ ๋ฒˆ๋“ค์—์„œ ์ œ๊ฑฐํ•˜๋Š” ์ตœ์ ํ™” ๊ธฐ๋ฒ•. 
  • ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋ ค๋ฉด ES2015 ๋ชจ๋“ˆ(์ฆ‰, import / export) ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•จ. ์ •์  ๊ตฌ์กฐ(static structure)์ด ๋ณด์žฅ๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ. 
  • Webpack 2๋ถ€ํ„ฐ๋Š” ESM์˜ export ์ค‘ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”(export๋งŒ ๋˜๊ณ  ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”) export๋ฅผ ๊ฐ์ง€ ๊ฐ€๋Šฅํ•˜๋ฉฐ, Webpack 4์—์„œ๋Š” package.json์˜ "sideEffects" ํ•„๋“œ๋ฅผ ํ†ตํ•ด “์ด ํŒŒ์ผ/๋ชจ๋“ˆ์ด side effects(๋ถ€์ˆ˜ํšจ๊ณผ)๊ฐ€ ์žˆ๋Š”๊ฐ€ ์—†๋Š”๊ฐ€”๋ฅผ ์‚ฌ์šฉ์ž/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ™•์žฅ๋จ.

ํŠธ๋ฆฌ ์‰์ดํ‚น์˜ ์ž‘๋™ ํ๋ฆ„

Webpack ๋ฌธ์„œ ์˜ˆ์ œ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ๋ฆ„์„ ์š”์•ฝํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. 

  1. ESM ๋ชจ๋“ˆ ์ƒ์„ฑ
    • ์˜ˆ๋ฅผ ๋“ค๋ฉด src/math.js ํŒŒ์ผ์— square ์™€ cube ํ•จ์ˆ˜๋ฅผ export ํ•จ. 
  2. ์—”ํŠธ๋ฆฌ(entry) ์ฝ”๋“œ์—์„œ ์ผ๋ถ€๋งŒ ์‚ฌ์šฉ
    • index.js์—์„œ cube๋งŒ import ์‚ฌ์šฉ. square๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ. 
  3. Webpack ์„ค์ •: usedExports ์˜ต์…˜ ํ™œ์„ฑํ™”
    • usedExports: true ์„ค์ •์„ ํ†ตํ•ด Webpack์ด ์–ด๋–ค export๊ฐ€ “์‚ฌ์šฉ๋จ(used)”์ธ์ง€ ๋งˆํ‚นํ•จ.
  4. ๋นŒ๋“œ ๊ฒฐ๊ณผ ์‚ดํŽด๋ณด๊ธฐ
    • ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” square ํ•จ์ˆ˜ ์œ„์— /* unused harmony export square */ ์ด๋Ÿฐ ์ฃผ์„์ด ๋ถ™์Œ. ์ด๋Š” “square๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” export”๋ผ๋Š” ํ‘œ์‹œ.
    • ํ•˜์ง€๋งŒ ๊ฐœ๋ฐœ ๋ชจ๋“œ(dev mode)์—์„œ๋Š” ์ฝ”๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜์ง€ ์•Š๊ณ  ์—ฌ์ „ํžˆ ๋ฒˆ๋“ค์— ๋‚จ์„ ์ˆ˜ ์žˆ์Œ.
  5. sideEffects ์„ค์ • ์ง€์ •
    • package.json์— "sideEffects": false ๋˜๋Š” ์–ด๋–ค ํŒŒ์ผ๋งŒ sideEffect๊ฐ€ ์žˆ๋Š”์ง€ ๋ฐฐ์—ด๋กœ ๋ช…์‹œํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์„ค์ • ๊ฐ€๋Šฅ. 
    • ์˜ˆ: ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ ์—†๋Š” ํŒŒ์ผ์€ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฉด ์™„์ „ํžˆ ์ œ๊ฑฐ ๊ฐ€๋Šฅ. CSS ํŒŒ์ผ ๋“ฑ์ฒ˜๋Ÿผ import ์‹œ ์Šคํƒ€์ผ ์ ์šฉ ๊ฐ™์€ ๋ถ€์ˆ˜์  ํšจ๊ณผ๊ฐ€ ์žˆ๋Š” ํŒŒ์ผ์€ sideEffects ๋ฆฌ์ŠคํŠธ์— ํฌํ•จ์‹œ์ผœ์•ผ ์ œ๊ฑฐ๋˜์ง€ ์•Š์Œ.
  6. Production ๋ชจ๋“œ๋กœ ๋นŒ๋“œ → Minification ํฌํ•จ
    • mode: "production" ์„ค์ •์‹œ Webpack์€ ์—ฌ๋Ÿฌ ์ตœ์ ํ™” ์˜ต์…˜์„ ์ž๋™์œผ๋กœ ์‚ฌ์šฉ (์˜ˆ: ModuleConcatenationPlugin, Terser ๋“ฑ) 
    • ์ด ๊ณผ์ •์—์„œ ์‹ค์ œ๋กœ “์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ”๊ฐ€ ์ œ๊ฑฐ๋จ. 

“sideEffects”์™€ "usedExports"์˜ ๊ด€๊ณ„ ๋ฐ ์œ ์˜์ 

Webpack ๋ฌธ์„œ์—์„œ๋Š” usedExports ๋งŒ์œผ๋กœ๋Š” ๋ถ€์กฑํ•œ ๊ฒฝ์šฐ๋„ ๋งŽ๋‹ค๋ฉฐ, sideEffects ํ”Œ๋ž˜๊ทธ์˜ ์ค‘์š”์„ฑ์„ ๊ฐ•์กฐํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์š” ์œ ์˜์ ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • sideEffects: false → “์ด ๋ชจ๋“ˆ ํ˜น์€ ํŒŒ์ผ์€ import ๋˜์—ˆ์„ ๋•Œ ๋ถ€์ˆ˜์  ํšจ๊ณผ(side effect)๊ฐ€ ์—†๋‹ค”๋Š” ํžŒํŠธ. ์ž˜๋ชป ์„ค์ •ํ•˜๋ฉด ํ•„์š”ํ•œ ์ฝ”๋“œ(์˜ˆ: CSS, ํด๋ฆฌํ•„, ๊ธ€๋กœ๋ฒŒ ์ดˆ๊ธฐํ™” ์ฝ”๋“œ ๋“ฑ)๊ฐ€ ์ œ๊ฑฐ๋  ์œ„ํ—˜์ด ์žˆ์Œ.
  • ๋ถ€์ˆ˜ ํšจ๊ณผ๊ฐ€ ์žˆ๋Š” ํŒŒ์ผ → sideEffects ํ•„๋“œ์— ๋ช…์‹œํ•ด์•ผ ํ•จ. ์˜ˆ: CSS ํŒŒ์ผ, ๊ธ€๋กœ๋ฒŒ ์Šค์ฝ”ํ”„ ์กฐ์ž‘ ๋“ฑ์ด ์žˆ๋Š” ํŒŒ์ผ.
  • ์žฌ์ˆ˜์ถœ(re-export) ํŒจํ„ด์—์„œ๋Š” ํŠนํžˆ ์กฐ์‹ฌํ•ด์•ผ ํ•จ.
    ์˜ˆ: ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ export * from './components' ๋“ฑ์œผ๋กœ ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ์žฌ์ˆ˜์ถœํ•˜๋Š” ๊ฒฝ์šฐ, ์ผ๋ถ€ ํŒŒ์ผ๋“ค์ด sideEffects ์—†๋‹ค๊ณ  ํ‘œ์‹œ๋˜์—ˆ๋”๋ผ๋„ ๋‚ด๋ถ€ ์˜์กด์„ฑ ๋•Œ๋ฌธ์— ์™„์ „ํžˆ ์ œ๊ฑฐ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ์˜ˆ์ƒ๊ณผ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์Œ.

๊ฒฐ๋ก 

Webpack ๊ณต์‹ ๊ธ€์˜ ์š”์ ๋“ค์„ ํ•ฉ์น˜๋ฉด, ํŠธ๋ฆฌ ์‰์ดํ‚น์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์กฐ๊ฑด๋“ค์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  1. ES2015 ๋ชจ๋“ˆ ๊ตฌ๋ฌธ (import/export) ์‚ฌ์šฉ
  2. usedExports ์˜ต์…˜ ํ™œ์„ฑํ™”
  3. production mode ์‚ฌ์šฉํ•˜์—ฌ minification ๋“ฑ์˜ ์ตœ์ ํ™” ํ™œ์„ฑํ™”
  4. package.json์˜ sideEffects ํ•„๋“œ๋กœ “์–ด๋А ํŒŒ์ผ์ด ๋ถ€์ˆ˜ ํšจ๊ณผ(side effects)๊ฐ€ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€” ๋ช…ํ™•ํžˆ ํ‘œ์‹œ
  5. ์Šคํƒ€์ผ(css), ํด๋ฆฌํ•„, ๊ธ€๋กœ๋ฒŒ ์ดˆ๊ธฐํ™” ์ฝ”๋“œ์ฒ˜๋Ÿผ ๋ถ€์ˆ˜ ํšจ๊ณผ๊ฐ€ ์žˆ๋Š” ์ฝ”๋“œ๊ฐ€ ์ž˜๋ชป ์ œ๊ฑฐ๋˜์ง€ ์•Š๋„๋ก ์ฃผ์˜

์ด๋Ÿฐ ์š”์†Œ๋“ค์ด ์กฐํ•ฉ๋˜๋ฉด ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ด๋ฉด์„œ๋„ ๊ธฐ๋Šฅ์ด ๊นจ์ง€์ง€ ์•Š๋Š” ์ตœ์ ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

 

 

 

Webpack์€ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

  1. ESM(ECMAScript Module) ๊ธฐ๋ฐ˜๋งŒ ์ง€์›
    • import / export ๊ตฌ๋ฌธ์€ ์ •์  ๋ถ„์„(static analysis)์ด ๊ฐ€๋Šฅ
    • CommonJS(require)๋Š” ๋Ÿฐํƒ€์ž„์— ๋™์ ์œผ๋กœ ๊ฒฐ์ •๋˜๋ฏ€๋กœ ํŠธ๋ฆฌ ์‰์ดํ‚น์ด ์–ด๋ ค์›€
  2. AST๋ฅผ ํ†ตํ•œ ์‚ฌ์šฉ ์—ฌ๋ถ€ ์ถ”์ 
    • export function foo() {} ๊ฐ™์€ ์„ ์–ธ์„ ์ฐพ์Œ
    • ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„์—์„œ ์‹ค์ œ๋กœ foo๊ฐ€ import + ์‚ฌ์šฉ๋˜๋Š”์ง€ ํ™•์ธ
    • ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฉด “dead code”๋กœ ํ‘œ์‹œ
  3. ๋งˆํ‚น ๋‹จ๊ณ„ (Mark phase)
    • Webpack์€ Terser(์••์ถ•๊ธฐ)๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „, ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” export๋ฅผ "unused"๋กœ ๋งˆํ‚นํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋•Œ ๋‹จ์ˆœํžˆ import ๋˜์ง€ ์•Š์€ ํ•จ์ˆ˜·๋ณ€์ˆ˜๋Š” “์ œ๊ฑฐ ๊ฐ€๋Šฅ(dead)”๋กœ ํƒœ๊ทธ
  4. ์••์ถ• ๋‹จ๊ณ„ (Sweep phase)
    • ์ตœ์ข… ๋ฒˆ๋“ค๋ง ์‹œ Terser ๊ฐ™์€ minifier๊ฐ€ AST๋ฅผ ๋‹ค์‹œ ๋ถ„์„ํ•˜์—ฌ, dead code๋ฅผ ์‹ค์ œ๋กœ ์‚ญ์ œ
    • ์ฆ‰, Webpack์€ unused code๋ฅผ ํ‘œ์‹œํ•˜๊ณ , Terser๊ฐ€ ์ฝ”๋“œ ์ œ๊ฑฐ๋ฅผ ์‹คํ–‰

 

  1. Webpack์€ ์—”ํŠธ๋ฆฌ์—์„œ ์‹œ์ž‘ํ•ด import/require๋ฅผ ๋”ฐ๋ผ๊ฐ€๋ฉฐ ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„๋ฅผ ์ƒ์„ฑ
  2. ๊ฐ ๋ชจ๋“ˆ ์†Œ์Šค๋ฅผ AST๋กœ ํŒŒ์‹ฑํ•ด ์–ด๋–ค export/import๊ฐ€ ์“ฐ์ด๋Š”์ง€ ๋ถ„์„
  3. ํŠธ๋ฆฌ ์‰์ดํ‚น: ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” export๋Š” ๋งˆํ‚น → Terser ๊ฐ™์€ ์ตœ์ ํ™” ๋„๊ตฌ๊ฐ€ ์‹ค์ œ ์‚ญ์ œ

 

'๐Ÿ’™ ํ”„๋ก ํŠธ์—”๋“œ(FE)' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

์ง€๋„ ๋ทฐํฌํŠธ ๊ธฐ๋ฐ˜ ์‹ค์‹œ๊ฐ„ ์ˆ™์†Œ ๊ฒ€์ƒ‰ ๊ตฌํ˜„  (0) 2026.01.14
์›น ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ œ๋Œ€๋กœ ํ™œ์šฉํ•˜๊ธฐ: Transition, Keyframes, rAF, WAAPI ๋น„๊ต์™€ ํ™œ์šฉ๋ฒ•  (0) 2025.09.24
Webpack + Babel + TypeScript ์„ค์ • ๊ฐ€์ด๋“œ  (0) 2025.09.16
MVC ๊ตฌ์กฐ - ์˜ต์ €๋ฒ„ ํŒจํ„ด ( Observer Pattern )  (0) 2025.09.08
[Javascript] ์ด๋ฒคํŠธ ์ „ํŒŒ & ์ด๋ฒคํŠธ ์œ„์ž„  (1) 2025.09.08
'๐Ÿ’™ ํ”„๋ก ํŠธ์—”๋“œ(FE)' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • ์ง€๋„ ๋ทฐํฌํŠธ ๊ธฐ๋ฐ˜ ์‹ค์‹œ๊ฐ„ ์ˆ™์†Œ ๊ฒ€์ƒ‰ ๊ตฌํ˜„
  • ์›น ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ œ๋Œ€๋กœ ํ™œ์šฉํ•˜๊ธฐ: Transition, Keyframes, rAF, WAAPI ๋น„๊ต์™€ ํ™œ์šฉ๋ฒ•
  • Webpack + Babel + TypeScript ์„ค์ • ๊ฐ€์ด๋“œ
  • MVC ๊ตฌ์กฐ - ์˜ต์ €๋ฒ„ ํŒจํ„ด ( Observer Pattern )
์—ฐ์žŽ(lotus leaf)
์—ฐ์žŽ(lotus leaf)
  • ์—ฐ์žŽ(lotus leaf)
    lotus' s develog ๐Ÿƒ
    ์—ฐ์žŽ(lotus leaf)
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (79)
      • โœ๏ธ ๊ฐœ๋ฐœํšŒ๊ณ ๋ก (5)
      • ๐Ÿงฎ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (3)
      • ๐Ÿ’™ ํ”„๋ก ํŠธ์—”๋“œ(FE) (19)
        • HTML (0)
        • CSS (0)
        • Javascript (0)
        • React (0)
        • Next.js (0)
        • webpack & babel (0)
      • ๐Ÿ’ป ๋ฐฑ์—”๋“œ(BE) (2)
        • Nest.js (0)
        • Express.js (0)
        • MySQL (1)
      • โš™๏ธ ์ธํ”„๋ผ(Devops) (2)
      • ๐Ÿค– AI (1)
      • ๐ŸŒ WEB (8)
      • ๐Ÿ’ป CS (16)
        • ์ž๋ฃŒ๊ตฌ์กฐ (0)
        • ์ปดํ“จํ„ฐ ๋„คํŠธ์›Œํฌ (1)
        • ์šด์˜์ฒด์ œ (0)
        • ์ธ๊ณต์ง€๋Šฅ (8)
        • ์›น ๋ณด์•ˆ (1)
        • ํด๋ผ์šฐ๋“œ ์ปดํ“จํŒ… (6)
      • ๐Ÿ–‹๏ธ DevLog (1)
      • ๐Ÿฆพ ๋กœ๋ณดํ‹ฑ์Šค (4)
      • ๐Ÿ“— ๋„ค์ด๋ฒ„๋ถ€์ŠคํŠธ์บ ํ”„ ์›น ๋ชจ๋ฐ”์ผ (0)
      • ๐ŸŽฎ Unity(C#) (10)
      • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด (4)
        • C (4)
        • C++ (0)
        • Java (0)
        • Python (0)
      • MSA (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ์ˆœ์—ด
    c++
    ros bridge
    next.js12
    ์ŠคํŒธ๋ฉ”์ผ๋ถ„๋ฅ˜๊ธฐ
    deploy-aws
    ๋ฐฑ์ค€
    ์ฝ”๋”ํŒจ๋“œ
    nav2
    gaussian rbf svm
    c์–ธ์–ด
    Devops #๋Œ€๊ทœ๋ชจํŠธ๋ž˜ํ”ฝ์ฒ˜๋ฆฌ
    soft margin svm
    ์ŠคํŒธ๋ถ„๋ฅ˜๊ธฐ
    client-streaming
    ros workspace
    turtlebot
    advaned detail
    hard margin svm
    auto-scaling
    ํŒŒ์ผํŠธ๋ฆฌ
    AWS
    ๊ธฐ์ดˆ์•Œ๊ณ ๋ฆฌ์ฆ˜
    ์•Œ๊ณ ๋ฆฌ์ฆ˜
    ์กฐํ•ฉ
    C#
    ๋ฆฌ์•กํŠธ
    isaac automator
    ์ดํ™”์—ฌ์ž๋Œ€ํ•™๊ต #๋„์ „ํ•™๊ธฐ์ œ
    C
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.6
์—ฐ์žŽ(lotus leaf)
Webpack Tree Shaking ๋™์ž‘ ์›๋ฆฌ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”