Webpack

์ธํ”„๋Ÿฐ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ์›นํŒฉ / ์žฅ๊ธฐํšจ(์บกํ‹ดํŒ๊ต)

์›นํŒฉ ํ•ธ๋“œ๋ถ

์›นํŒฉ ๊ณต์‹๋ฌธ์„œ

Node.js์™€ NPM

์›นํŒฉ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด Node.js์™€ NPM์ด ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•จ Node.js๋ฅผ ์„ค์น˜ํ•˜๋ฉด NPM์€ ํ•จ๊ป˜ ์„ค์น˜๊ฐ€ ๋จ

Node.js

๋ธŒ๋ผ์šฐ์ € ๋ฐ–์—์„œ๋„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์„ ์˜๋ฏธ

NPM(Node Package Manager)

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(ํŒจํ‚ค์ง€)๋ฅผ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ๋„๊ตฌ(jQuery, Tensorflow, express ๋“ฑ) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ณต๊ฐœ๋œ ์ €์žฅ์†Œ์— ์˜ฌ๋ ค๋†“๊ณ  npm ๋ช…๋ น์–ด๋กœ ํŽธํ•˜๊ฒŒ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ

  • node -v : ๋…ธ๋“œ ๋ฒ„์ „ ํ™•์ธ

  • npm -v : NPM ๋ฒ„์ „ ํ™•์ธ

  • npm init [-y] : NPM ์ดˆ๊ธฐํ™” ๋ช…๋ น์–ด(-y ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ package.jsonํŒŒ์ผ ์ƒ์„ฑ)

  • npm install [library] (--save-prod) : ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ง€์—ญ ์„ค์น˜1(node_modules/library/dist/library.js)

  • npm install [library] --save-dev(-D) : ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ง€์—ญ ์„ค์น˜2(devDependencies๋กœ ๊ด€๋ฆฌ)

  • npm uninstall [library] : ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ญ์ œ

  • npm install [library] --global(-g) : ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‹œ์Šคํ…œ ๋ ˆ๋ฒจ์— ์ „์—ญ(global)์œผ๋กœ ์„ค์น˜

์ง€์—ญ ์„ค์น˜ vs ์ „์—ญ ์„ค์น˜

  • ์ง€์—ญ ์„ค์น˜ : ํ•ด๋‹น ํด๋” ๋‚ด์—์„œ node_modules ํด๋”๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์„ค์น˜

  • ์ „์—ญ ์„ค์น˜ : ์‹œ์Šคํ…œ ๋ ˆ๋ฒจ์— ์ „์—ญ์œผ๋กœ ์„ค์น˜ํ•˜์—ฌ ํ„ฐ๋ฏธ๋„์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋ฆ„์„ ์ž…๋ ฅํ–ˆ์„๋•Œ ๋ช…๋ น์–ด๋กœ ์ธ์‹

NPM์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

  1. ํ”„๋กœ์ ํŠธ์— ์‚ฌ์šฉํ•˜๋Š” package(๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)์™€ ๋ฒ„์ „ ๊ด€๋ฆฌ

  2. ํ•ด๋‹น package CDN์„ ์ง์ ‘ ์ฐพ์•„์„œ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๊ณ  npm install๋กœ ๋ฐ”๋กœ ์„ค์น˜ ๊ฐ€๋Šฅ

  3. ๋Œ€๋ถ€๋ถ„์˜ ์›นํŒฉ ํ”„๋กœ์ ํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ npm์ด ๋™๋ฐ˜๋จ

dependencies์™€ devDependencies

  • dependencies : npm i [library]

    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ™”๋ฉด๋กœ์ง๊ณผ ์ง์ ‘์  ๊ด€๋ จ์ด ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(ex.jquery, vue, react, angular, chart ๋“ฑ)

  • devDependencies : npm i [library] -D

    • ๊ฐœ๋ฐœ์„ ํ• ๋•Œ ๋„์›€์„ ์ฃผ๋Š” ๊ฐœ๋ฐœ ๋ณด์กฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(ex.webpack, sass, js-compression ๋“ฑ)

๋ฐฐํฌ์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ dependencies

  • npm run build ๋กœ ๋นŒ๋“œ๋ฅผ ํ•˜๋ฉด ์ตœ์ข… ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ ์•ˆ์— ํฌํ•จ๋จ

๊ฐœ๋ฐœ์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ devDependencies

  • ์ตœ์ข… ๋ฐฐํฌ ์‹œ ํฌํ•จ๋˜์ง€ ์•Š์Œ

์›นํŒฉ Webpack

ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ(Module Bundler) ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ๋ž€? ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•˜๋Š” ์ž์›์„ ๋ชจ๋‘ ๊ฐ๊ฐ ๋ชจ๋“ˆ๋กœ ๋ณด๊ณ  ์กฐํ•ฉํ•ด์„œ ๋ณ‘ํ•ฉ๋œ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๋ฌผ์„ ๋งŒ๋“œ๋Š” ๋„๊ตฌ

  • webpack webpack-cli

  • lodash

  • dist/main.js : ์›นํŒฉ์œผ๋กœ ๊ตฌ์„ฑํ•œ ๊ฒฐ๊ณผ๋ฌผ(์ฆ‰์‹œ์‹คํ–‰ํ•จ์ˆ˜IIFE ๊ตฌ์„ฑ)

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋งŒ์„ ์œ„ํ•œ ๋„๊ตฌ๊ฐ€ ์•„๋‹Œ ์›น์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ชจ๋“  ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๋„๊ตฌ์ž„

  • devtool: 'source-map' : ๋นŒ๋“œ ํ›„ ์›๋ž˜ ํŒŒ์ผ๋กœ ์—ฐ๊ฒฐ

๋ชจ๋“ˆ ๋ฒˆ๋“ค๋ง์ด๋ž€?

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ช‡์‹ญ, ๋ช‡๋ฐฑ๊ฐœ์˜ ์ž์›๋“ค์„ ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ๋ณ‘ํ•ฉ ๋ฐ ์••์ถ•ํ•ด์ฃผ๋Š” ๋™์ž‘(๋นŒ๋“œ==๋ณ€ํ™˜==๋ฒˆ๋“ค๋ง)

๋ชจ๋“ˆ ์ด๋ž€?

ํ”„๋กœ๊ทธ๋žจ์—์„œ ํŠน์ • ๊ธฐ๋Šฅ์„ ๊ฐ–๋Š” ์ž‘์€ ์ฝ”๋“œ ๋‹จ์œ„๋ฅผ ์˜๋ฏธ

์›นํŒฉ์˜ ๋“ฑ์žฅ๋ฐฐ๊ฒฝ

  1. ํŒŒ์ผ ๋‹จ์œ„์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ชจ๋“ˆ ๊ด€๋ฆฌ

    • ํŒŒ์ผ๋‹จ์œ„๋กœ ์Šค์ฝ”ํ”„๊ฐ€ ๊ตฌ๋ถ„๋˜์ง€ ์•Š์Œ(์ „์—ญ๋ณ€์ˆ˜)

  2. ์›น ๊ฐœ๋ฐœ ์ž‘์—… ์ž๋™ํ™” ๋„๊ตฌ

  3. ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋น ๋ฅธ ๋กœ๋”ฉ ์†๋„์™€ ๋†’์€ ์„ฑ๋Šฅ

    • ์›นํŒฉ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•„์š”ํ•œ ์ž์›์€ ๋ฏธ๋ฆฌ ๋กœ๋”ฉํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๊ทธ ๋•Œ ๊ทธ ๋•Œ ์š”์ฒญํ•˜์ž๋Š” ์ฒ ํ•™์„ ๊ฐ–๊ณ  ์žˆ์Œ

์›นํŒฉ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๋ฌธ์ œ

  1. ๋ธŒ๋ผ์šฐ์ €๋ณ„ HTTP ์š”์ฒญ ์ˆซ์ž์˜ ์ œ์•ฝ

    • TCP ์ŠคํŽ™์— ๋”ฐ๋ผ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ•œ๋ฒˆ์— ์„œ๋ฒ„๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” HTTP์š”์ฒญ ์ˆซ์ž๋Š” ์ œ์•ฝ๋˜์–ด ์žˆ์Œ

  2. Dynamic Loading & Lazy Loading ๋ฏธ์ง€์›

์›นํŒฉ์˜ ์ฃผ์š”์†์„ฑ

  1. mode

    • ๋ฒ„์ „4 ์ด์ƒ์—์„œ ์ถ”๊ฐ€๋œ ์†์„ฑ

    • 'none' 'production' 'development'

  2. Entry

    • ์›นํŒฉ์—์„œ ์›น ์ž์›์„ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ตœ์ดˆ ์ง„์ž…์ ์ด์ž ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ, ๊ฒฝ๋กœ

    • ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ „๋ฐ˜์ ์ธ ๊ตฌ์กฐ์™€ ๋‚ด์šฉ์ด ๋‹ด๊น€

  3. Output

    • ์›นํŒฉ์„ ๋Œ๋ฆฌ๊ณ  ๋‚œ ๊ฒฐ๊ณผ๋ฌผ์˜ ํŒŒ์ผ ๊ฒฝ๋กœ

    • ์ตœ์†Œํ•œ filename์€ ์ง€์ •ํ•ด์ค˜์•ผํ•จ

    • ํŒŒ์ผ ์ด๋ฆ„ ์˜ต์…˜์— ๋งค ๋นŒ๋“œ์‹œ ๊ณ ์œ  ํ•ด์‹œ๊ฐ’์„ ๋ถ™์—ฌ ์ƒˆ๋กœ๊ณ ์นจํ•ด์•ผํ•˜๋Š” ์ƒํ™ฉ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Œ

  4. Loader(module)

    • ์›นํŒฉ์ด ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ•ด์„ํ• ๋•Œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด ์•„๋‹Œ ์›น ์ž์›๋“ค์„ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์†์„ฑ

    {
        test: /\.css$/,
        use: ['style-loader', 'css-loader']
        // ๋ชจ๋“  cssํŒŒ์ผ์— ๋Œ€ํ•ด ๋กœ๋” ์ ์šฉ
        // rules ์•„๋ž˜์— ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€ํ•ด ๋‚˜๊ฐ€๋ฉด์„œ ๊ฐ ํŒŒ์ผ๋“ค์— ์ ์šฉ
        // ๋กœ๋” ์ˆœ์„œ๋„ ์˜ํ–ฅ์ด ์žˆ์Œ(์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ์ˆœ์„œ๋กœ ์ ์šฉ)
    }
  5. plugin(plugins)

    • ์›นํŒฉ์˜ ๊ธฐ๋ณธ์ ์ธ ๋™์ž‘์— ์ถ”๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์†์„ฑ

    • ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๊ฒฐ๊ณผ๋ฌผ์˜ ํ˜•ํƒœ๋ฅผ ๋ฐ”๊พธ๋Š” ์—ญํ• 

Webpack Dev Server

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๋Š” ๊ณผ์ •์—์„œ ์œ ์šฉํ•˜๊ฒŒ ์“ฐ์ด๋Š” ๋„๊ตฌ ์›นํŒฉ์˜ ๋นŒ๋“œ ๋Œ€์ƒ ํŒŒ์ผ์ด ๋ณ€๊ฒฝ ๋˜์—ˆ์„ ๋•Œ ์ฝ”๋“œ๋งŒ ๋ณ€๊ฒฝํ•˜๊ณ  ์ €์žฅํ•˜๋ฉด ์›นํŒฉ์œผ๋กœ ๋นŒ๋“œํ•œ ํ›„ ์ƒˆ๋กœ๊ณ ์นจ ํ•ด์คŒ ์›นํŒฉ์˜ ๋นŒ๋“œ ์‹œ๊ฐ„ ๋˜ํ•œ ์ค„์—ฌ์คŒ

// package.json
"scripts": {
    "dev": "webpack serve",
    "build": "webpack"
}

//webpack.config.js
devServer: {
    port: 9000,
}
  • ์›นํŒฉ ๋ฐ๋ธŒ ์„œ๋ฒ„๋กœ ๋นŒ๋“œํ•œ ๊ฒฐ๊ณผ๋ฌผ์€ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๊ณ  ํŒŒ์ผ๋กœ ์ƒ์„ฑํ•˜์ง€ ์•Š์Œ(ํŒŒ์ผ ์‹œ์Šคํ…œ์— ๋‚˜์˜ค์ง€ ์•Š์Œ)

  • ์›นํŒฉ ๋ฐ๋ธŒ ์„œ๋ฒ„๋Š” ๊ฐœ๋ฐœํ•  ๋•Œ๋งŒ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์›นํŒฉ ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•ด ๊ฒฐ๊ณผ๋ฌผ์„ ํŒŒ์ผ๋กœ ์ƒ์„ฑ

  • ์ปดํ“จํ„ฐ ๊ตฌ์กฐ ๊ด€์ ์—์„œ ํŒŒ์ผ ์ž…์ถœ๋ ฅ๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ ์ž…์ถœ๋ ฅ์ด ๋” ๋น ๋ฅด๊ณ  ์ž์›์ด ๋œ ์†Œ๋ชจ๋จ

Last updated