WebPack๊ณผ Babel

Daehyeon Yunยท2024๋…„ 8์›” 7์ผ

ํ”„๋ก ํŠธ์—”๋“œ

๋ชฉ๋ก ๋ณด๊ธฐ
12/14

๐Ÿ“– Reference
: copilot ์„ ์ƒ๋‹˜


๐Ÿค” WebPack์ด๋ž€ ๋ญ˜๊นŒ?

WebPack์€ ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ(Module Bundler) ์ž…๋‹ˆ๋‹ค. WebPack์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒŒ์ผ์„ ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ํ•ฉ์ณ์ฃผ๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ•„์š”ํ•œ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ํ•˜๋‚˜์˜ ๋ฒˆ๋“ค๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ก ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ(Module Bundler)๋ž€?

: ์—ฌ๋Ÿฌ ๊ฐœ์˜ JS ํŒŒ์ผ์„ ํ•˜๋‚˜์˜ ๋ฒˆ๋“ค ํŒŒ์ผ๋กœ ๊ฒฐํ•ฉํ•˜๊ณ , ํ•„์š”ํ•œ ๋ชจ๋“ˆ๋“ค์„ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•˜๋Š” ์ž์›(HTML, CSS, JS, ์ด๋ฏธ์ง€ ๋“ฑ)์„ ๋ชจ๋‘ ๊ฐ๊ฐ์˜ ๋ชจ๋“ˆ๋กœ ๋ณด๊ณ  ์ด๋ฅผ ์กฐํ•ฉํ•ด์„œ ๋ณ‘ํ•ฉ๋œ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๋ฌผ์„ ๋„์ถœํ•ด๋‚ด๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

โ†’ ์ค‘๋ณต๋œ ์ด๋ฆ„์œผ๋กœ ์ธํ•œ ์ถฉ๋Œ์„ ๋ฐฉ์ง€, ํŒŒ์ผ ์ „์†ก ์†๋„ ๋ฌธ์ œ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ.


๐Ÿ’ก WebPack์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ์™€ ํŠน์ง•์€?

1. ๋ชจ๋“ˆํ™”

: Webpack์€ ํ‘œ์ค€ํ™”๋œ ๋ชจ๋“ˆํ™” ๊ธฐ๋ฒ•์ด ๋“ฑ์žฅํ•œ ES2015๋ถ€ํ„ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ์ด์ „์—๋Š” ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์™ธ๋ถ€ ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ๊ฐ€์ ธ์™”์ง€๋งŒ, Webpack์„ ์‚ฌ์šฉํ•˜๋ฉด import/export ๊ตฌ๋ฌธ์„ ํ†ตํ•ด ๋ชจ๋“ˆ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ์Šค์ฝ”ํ”„ ๋ถ„๋ฆฌ

: Webpack์€ ๊ฐ ๋ชจ๋“ˆ์„ ๋…๋ฆฝ์ ์ธ ์‹คํ–‰ ์˜์—ญ์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์Šค์ฝ”ํ”„(์‰ฝ๊ฒŒ ์„ค๋ช…ํ•˜๋ฉด, ์ „์—ญ ๋ณ€์ˆ˜ ํ˜น์€ ์ง€์—ญ๋ณ€์ˆ˜์™€ ๊ฐ™์ด ๋ณ€์ˆ˜๊ฐ€ ์œ ํšจํ•œ ๋ฒ”์œ„๋ฅผ ์˜๋ฏธํ•œ๋‹ค.) ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋‹ค์–‘ํ•œ ๋ณ€์ˆ˜ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์˜์กด์„ฑ ๊ด€๋ฆฌ๋„ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. ๋ฒˆ๋“ค๋ง

: Webpack์€ ์‹œ์ž‘์ (Entry point)์œผ๋กœ๋ถ€ํ„ฐ ์˜์กด์ ์ธ ๋ชจ๋“ˆ์„ ์ฐพ์•„ ํ•˜๋‚˜์˜ ๋ฒˆ๋“ค ํŒŒ์ผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฐ๊ณผ๋ฌผ์„ Output์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

4. ์„ค์น˜ ๋ฐ ์‚ฌ์šฉ

: Webpack์€ npm์„ ํ†ตํ•ด ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปค๋งจ๋“œ๋ผ์ธ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ’ป Webpack ์˜ˆ์ œ

// test.js
export function sum(x, y){
	return x + y;
}

// app.js
import * as test from "./test.js";
console.log(test.sum(1, 2));

Webpack์€ ์œ„์™€ ๊ฐ™์€ ๋ชจ๋“ˆํ™”๋ฅผ ๋” ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ๋ฒˆ๋“ค๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์›นํŒฉ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์—์„œ ๋ชจ๋“ˆ ๊ด€๋ฆฌ๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿค” Babel์ด๋ž€ ๋ญ˜๊นŒ?

Babel์€ ํ˜„์žฌ ๋ฐ ์ด์ „ ๋ธŒ๋ผ์šฐ์ € ๋˜๋Š” ํ™˜๊ฒฝ์—์„œ ECMAScript 2015+ (ES6 ์ด์ƒ) ์ฝ”๋“œ๋ฅผ ์ด์ „ ๋ฒ„์ „์˜ JavaScript๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํˆด์ฒด์ธ์ž…๋‹ˆ๋‹ค.

Babel์€ JS ๊ฐœ๋ฐœ์ž๋“ค์ด ํ•ญ์ƒ ์ตœ์‹  ๋ฌธ๋ฒ•์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. Babel์„ ์‚ฌ์šฉํ•˜๋ฉด ES6 ์ด์ƒ์˜ ์ตœ์‹  ๋ฌธ๋ฒ•์œผ๋กœ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ES5 ์ดํ•˜์˜ ์˜ˆ์ „ ๋ฌธ๋ฒ•์œผ๋กœ ์ž‘์„ฑํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์†Œ์Šค ์ฝ”๋“œ ๋‚ด์˜ ํ˜•ํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ†’ ์œ„์™€ ๊ฐ™์ด ํ˜•ํƒœ๊ฐ€ ๋ฐ”๋€ ์ฝ”๋“œ๋Š” ์ตœ์‹  ๋ฌธ๋ฒ•์„ ์ง€์›ํ•˜๋Š” ์‹คํ–‰ ํ™˜๊ฒฝ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์•„์ง ์ตœ์‹  ๋ฌธ๋“ค์ด ์ ์šฉ๋˜์ง€ ์•Š์€ ์‹คํ–‰ ํ™˜๊ฒฝ์—์„œ๋„ ๋ฌธ์ œ์—†์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ’ก Babel์˜ ํŠน์ง•์€?

1. ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์™€ ํ™˜๊ฒฝ์—์„œ์˜ ํ˜ธํ™˜์„ฑ

: Babel์€ ES6 ์ด์ƒ์˜ ๋ฌธ๋ฒ•์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ํ™˜๊ฒฝ์—์„œ๋„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

2. TypeScript์™€ JSX ์ง€์›

: Babel์€ ES6 ์ด์ƒ์˜ ์ตœ์‹  ๋ฌธ๋ฒ• ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ TypeScript๋‚˜ React์˜ JSX๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ JavaScript๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. ํ”Œ๋Ÿฌ๊ทธ์ธ์™€ ํ”„๋ฆฌ์…‹

: Babel์€ ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ํ”„๋ฆฌ์…‹์„ ํ†ตํ•ด ๋ฌธ๋ฒ• ๋ณ€ํ™˜ ๊ทœ์น™์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ”„๋กœ์ ํŠธ๋ณ„ ์›ํ•˜๋Š” ๊ทœ์น™์„ ์ ์šฉํ•˜๊ฑฐ๋‚˜ ๋‹ค์–‘ํ•œ ๊ทœ์น™์„ ํ•œ ๋ฒˆ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ’ป Babel์˜ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

  1. ํ”„๋กœ์ ํŠธ์— @babel/core , @babel/cli ํŒจํ‚ค์ง€๋ฅผ ๊ฐœ๋ฐœ ์˜์กด์„ฑ์œผ๋กœ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

  2. ์ „์ฒด ์„ค์ •ํŒŒ์ผ(project-wide)์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    • babel.config.js ํŒŒ์ผ์„ ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • ๊ทธ ํ›„ ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    // babel.config.js
    const presets = ['@babel/preset-react'];
    const plugins = [
    	['@babel/plugin-transform-template-literals', { loose : true }]
    ];
    
    module.exports = { presets, plugins };
    // ํ•ด๋‹น ์„ค์ •์€ ๋ฆฌ์•กํŠธ ํ”„๋ฆฌ์…‹์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด ํ”Œ๋Ÿฌ๊ทธ์ธ์— loose ์˜ต์…˜์„ ๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค.
  3. ์ง€์—ญ ์„ค์ •ํŒŒ์ผ(file-relative)์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    • .babelrc ํŒŒ์ผ์„ ํ”„๋กœ์ ํŠธ ๋‚ด ํ•ด๋‹น ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•  ์ฝ”๋“œ์™€ ๋™์ผํ•œ ๊ฒฝ๋กœ์— ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • ๊ทธ ํ›„ ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    // .babelrc
    {
    	"plugins" : [
    			"@babel/plugin-transform-arrow-functions",
    			"@babel/plugin-transform-template-literals"
    	]
    }
    // ์ง€์—ญ ์„ค์ • ํŒŒ์ผ์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์— ๋Œ€ํ•ด์„œ๋งŒ ์„ค์ •ํ•˜๋ฉฐ, ๋™์ผํ•œ ๊ฒฝ๋กœ์— ์žˆ๋Š” ์ฝ”๋“œ ํŒŒ์ผ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
  4. ์ปดํŒŒ์ผ

    • Babel์„ ์‹คํ–‰ํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ๋กœ, ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ’ก src ํด๋”์˜ ์ฝ”๋“œ๋ฅผ dist ํด๋”๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
    npx babel src --out-dir dist

์ง€์—ญ ์„ค์ •ํŒŒ์ผ์€ ์ „์ฒด ์„ค์ • ํŒŒ์ผ์„ ๋ฎ์–ด์”Œ์šฐ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๋ฉฐ, ๋™์ผํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด๋‚˜ ํ”„๋ฆฌ์…‹์— ๋Œ€ํ•œ ์„ค์ •์ด ์žˆ๋‹ค๋ฉด ์ง€์—ญ ์„ค์ •ํŒŒ์ผ์ด ์šฐ์„ ๋ฉ๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์ด ์„ค์ • ํŒŒ์ผ์„ ์œ ์—ฐํ•˜๊ฒŒ ํ™œ์šฉํ•˜์—ฌ Babel์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

profile
์—ด์‹ฌํžˆ ์‚ด์•„์•ผ์ง€

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