๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

JavaScript

[JavaScript] Webpack

๋ฐ˜์‘ํ˜•

๐Ÿ€ Webpack์ด๋ž€

์—ฌ๋Ÿฌ๊ฐ€์ง€ ์˜์กด์„ฑ ๋ชจ๋“ˆ์„ ํ•˜๋‚˜๋กœ ๋ฒˆ๋“ค๋งํ•ด์ฃผ๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. 

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

 

  ๐ŸŒฑ ๊ทผ๋ฐ Webpack์„ ์™œ ์“ฐ๋Š” ๊ฑธ๊นŒ?

์—ฌ๋Ÿฌ๊ฐœ์˜ ํŒŒ์ผ์„ ํ•˜๋‚˜๋กœ ๋ฒˆ๋“ค๋งํ•˜๋ฏ€๋กœ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ๋กœ๋“œํ•ด์•ผํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์‚ฌ๋ผ์ง„๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฒƒ์„ ์ถฉ๋ถ„ํ•œ ๋‹ต์ด ๋˜์ง€ ๋ชปํ•œ๋‹ค๊ณ  ์ƒ๊ฐ์„ ํ•˜์˜€๊ณ  ์•„๋ž˜์™€ ๊ฐ™์€ ์ด์œ ๋“ค์„ ์ฐพ์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. 

  • ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋กœ๋“œํ•  ์‹œ ์ƒ๊ธฐ๋Š” ๋ณ€์ˆ˜์˜ ์œ ํšจ๋ฒ”์œ„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ด๋Š” ํŒŒ์ผ ๋‹จ์œ„๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ชจ๋“ˆ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. 
      • ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์ด ์ค‘๋ณต ์„ ์–ธ๋  ๋•Œ ์˜๋„์น˜ ์•Š์€ ๊ฐ’์„ ํ• ๋‹น, ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์›น ๊ฐœ๋ฐœ ์ž‘์—…์˜ ์ž๋™ํ™” ๋„๊ตฌ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. 
    • ํŠนํžˆ front ๊ฐœ๋ฐœ ์‹œ ์ฝ”๋“œ ์ˆ˜์ • ํ›„ ๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ์„ ๋ณด๋ ค๋ฉด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ƒˆ๋กœ๊ณ ์นจ์„ ๋ˆŒ๋Ÿฌ์•ผ๋งŒ ํ–ˆ๋Š”๋ฐ Webpack์œผ๋กœ ์ด ๋ฒˆ๊ฑฐ๋กœ์›€์„ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. 
    • ์›น ์„œ๋น„์Šค ๊ฐœ๋ฐœ, ์›น ์„œ๋ฒ„ ๋ฐฐํฌ ์‹œ ์•„๋ž˜์™€ ๊ฐ™์€ ์ž‘์—…์„ ํ•ด์•ผํ•˜๋Š”๋ฐ ์ด๊ฒƒ๋“ค์„ ์ž๋™ํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 
      • HTML, CSS, JS ์••์ถ•
      • ์ด๋ฏธ์ง€ ์••์ถ•
      • CSS ์ „์ฒ˜๋ฆฌ๊ธฐ ๋ณ€ํ™˜
  • ์›น ์•ฑ์˜ ๋น ๋ฅธ ๋กœ๋”ฉ ์†๋„์™€ ๋†’์€ ์„ฑ๋Šฅ์„ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. 
    • ๋กœ๋”ฉ ์†๋„๋ฅผ ๋†’์ด๋ ค๋ฉด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์„œ๋ฒ„๋กœ ์š”์ฒญํ•˜๋Š” ํŒŒ์ผ ์ˆซ์ž๋ฅผ ์ค„์—ฌ์•ผ ํ•˜๋Š”๋ฐ(์™œ๋ƒ? HTTP ์š”์ฒญ ์ˆซ์ž๊ฐ€ ์ œํ•œ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ) Webpack์€ ์ด๋ฅผ ํ•ด๊ฒฐํ•ด ์ค๋‹ˆ๋‹ค. 
    • ์ด๋Š”  ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ๋กœ๋“œํ•ด์•ผํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์‚ฌ๋ผ์ง„๋‹ค์™€ ์ผ๋งฅ์ƒํ†ตํ•œ๋‹ค๊ณ  ํ•  ์ˆ˜๋„ ์žˆ๊ฒ ๊ตฐ์š”.

  ๐ŸŒฑ ๊ฐ„๋‹จํ•˜๊ฒŒ Webpack์„ ์ ์šฉ ํ•ด๋ณด์ž

์•„๋ž˜์˜ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ํ™˜๊ฒฝ์„ ์„ค์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. (node์™€ npm์ด ์„ค์น˜๋˜์–ด ์žˆ์Œ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.)

npm init -y
npm i webpack-cli -D

#root ๋””๋ ‰ํ† ๋ฆฌ์— index.html ํŒŒ์ผ ์ƒ์„ฑ
#root ๋””๋ ‰ํ† ๋ฆฌ์— src ํด๋”์— ์ƒ์„ฑ ํ›„ index.js ์ƒ์„ฑ

#package.json ํŒŒ์ผ์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •
"scripts": {
	"build": "webpack --mode=none"
}

npm run build

#root ๋””๋ ‰ํ† ๋ฆฌ์— webpack.config.js ํŒŒ์ผ ์ƒ์„ฑ

#package.json ํŒŒ์ผ์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •
"scripts": {
	"build": "webpack"
}

npm run build

#index.html, index.js, webpack.config.js์— ์ฑ„์šฐ๋Š” ๋‚ด์šฉ์€ ์•„๋ž˜ ๊นƒํ—™์„ ์ฐธ๊ณ ํ•ด์ฃผ์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

 

์—ฌ๊ธฐ๋ฅผ ํด๋ฆญํ•ด์ฃผ์„ธ์š”.

 

์œ„ ๋ช…๋ น์–ด๋“ค๊ณผ ๊นƒํ—™์„ ์ฐธ๊ณ ํ•˜๋ฉด ์›นํŒฉ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์˜  webpack.config.js์— ๋Œ€ํ•˜์—ฌ ์กฐ๊ธˆ๋” ์ƒ์„ธํ•˜๊ฒŒ ์•Œ์•„๋ด…์‹œ๋‹ค. 

  ๐ŸŒฑ webpack.config.js(or Webpack)์˜ ์†์„ฑ

์ฒจ๋ถ€ํ•œ ๊นƒํ—™ ๋งํฌ์—์„œ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์˜ webpack.config.js๋ฅผ ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌ์„ฑ๋˜์–ด์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

const path = require('path');

module.exports = {
    mode: 'none',
    entry: './src/index.js',
    output: {
        filename: 'main.js',
        path: path.resolve(__dirname, 'dist'),
    },
};

์—ฌ๊ธฐ์„œ entry, output ์†์„ฑ์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ๊ทธ๋ฆฌ๊ณ  ์œ„์—์„œ ๋‚˜์™€์žˆ์ง€๋Š” ์•Š์ง€๋งŒ loader, plugin์€ ์–ด๋–ค ์†์„ฑ์ธ์ง€ ์‚ดํŽด๋ด…์‹œ๋‹ค.

  •  entry ์†์„ฑ์€ ์›นํŒฉ์„ ์‹คํ–‰ํ•  ๋Œ€์ƒ ํŒŒ์ผ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
    • ์œ„ ์ฝ”๋“œ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์„ค๋ช…ํ•˜์ž๋ฉด src ํด๋” ๋ฐ‘์˜ index.js๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์›นํŒฉ์ด ๋นŒ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
    • entry ์†์„ฑ์—๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ „๋ฐ˜์ ์ธ ๊ตฌ์กฐ์™€ ๋‚ด์šฉ์ด ๋‹ด๊ฒจ์•ผํ•ฉ๋‹ˆ๋‹ค. 
      • ๊ทธ๋ ‡๊ธฐ์— ์›น์ด ์‹ฑ๊ธ€ํŽ˜์ด์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ผ๋•Œ์™€ ๋ฉ€ํ‹ฐํŽ˜์ด์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ผ๋•Œ์˜ ๋ชจ์Šต์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
        //SPA ์ผ ๋•Œ
        entry: './src/index.js'
        
        //๋ฉ€ํ‹ฐํŽ˜์ด์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ผ ๋•Œ
        entry: {
          login: './src/LoginView.js',
          main: './src/MainView.js'
        }โ€‹
         
  • output ์†์„ฑ์€ ์›นํŒฉ์„ ๋Œ๋ฆฌ๊ณ  ๋‚œ ๊ฒฐ๊ณผ๋ฌผ์˜ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ ๊ฐ์ฒด ํ˜•ํƒœ๋กœ filename, path ์†์„ฑ์„ ์ง€์ •ํ•ด์ฃผ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. 
  • Loader๋Š” ์›นํŒฉ์ด ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ•ด์„ํ•  ๋•Œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด ์•„๋‹Œ ์›น ์ž์›(HTML, CSS, Images, ํฐํŠธ ๋“ฑ)๋“ค์„ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค. 
    • ๋นŒ๋“œ์˜ ๋Œ€์ƒ์ด ๋˜๋Š” index.js์—
      import './styles.css';โ€‹
      ์ด์™€ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ styles.css ํŒŒ์ผ์„ ํ•ด์„ํ•˜๊ธฐ ์œ„ํ•œ ์ ์ ˆํ•œ ๋กœ๋”๋ฅผ ์ถ”๊ฐ€ํ•ด๋‹ฌ๋ผ๋Š” ์—๋Ÿฌ๋ฅผ ์›นํŒฉ์€ ๋„์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. 
    • CSS๋กœ๋”๋ฅผ ์„ค์น˜ํ•˜๊ณ  webpack.config.js๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •ํ•˜๋ฉด ์—๋Ÿฌ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      npm i css-loader -Dโ€‹
      const path = require('path');
      
      module.exports = {
          mode: 'none',
          entry: './src/index.js',
          output: {
              filename: 'main.js',
              path: path.resolve(__dirname, 'dist'),
          },
          module: {
          	rules: [
              	{
                  	test: /\.css$/,
                      use: ['css-loader']
                  }
              ]
          },
      };โ€‹
    • test๋Š” ํŒŒ์ผ์˜ ์œ ํ˜•์„, use๋Š” ๋กœ๋”์˜ ์ด๋ฆ„์„ ๋งํ•ฉ๋‹ˆ๋‹ค. 
  • plugin์€ ์›นํŒฉ์˜ ๊ธฐ๋ณธ๋™์ž‘์— ์ถ”๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค. ๋กœ๋”๋Š” ํŒŒ์ผ์„ ํ•ด์„ํ•˜๊ณ  ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ˜๋ฉด, ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๊ฒฐ๊ณผ๋ฌผ์˜ ํ˜•ํƒœ๋ฅผ ๋ฐ”๊พธ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 
    • ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๋ฐฐ์—ด์—๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ์ƒ์„ฑํ•œ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋งŒ ์ถ”๊ฐ€๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 
    • ์˜ˆ์‹œ๋Š” ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. 

 

 

์ถœ์ฒ˜ : ์บกํ‹ด ํŒ๊ต๋‹˜์˜ ์›นํŒฉ ํ•ธ๋“œ๋ถ, ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋”ฅ๋‹ค์ด๋ธŒ, webpack ๊ณต์‹๋ฌธ์„œ

๋ฐ˜์‘ํ˜•