FE

What is webpack? ์›นํŒฉ ๊ฐœ๋… ์ •๋ฆฌ

Taylor Kang 2021. 3. 4. 01:50

๐Ÿ™‹๐Ÿป‍โ™€๏ธ

์•ˆ๋…•ํ•˜์„ธ์š”! ํ…Œ์ผ๋Ÿฌ์ž…๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ webpack ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

https://webpack.js.org/concepts/ ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ๊ธฐ๋ณธ ๊ฐœ๋…๋“ค์„ ์ •๋ฆฌํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ webpack

webpack ์€ ๋ชจ๋˜ JS application์„ ์œ„ํ•œ static module bundler ์ž…๋‹ˆ๋‹ค.

webpack์€ application์ด ํ•„์š”๋กœํ•˜๋Š” ๋ชจ๋“  ๋ชจ๋“ˆ๋“ค์— ๋Œ€ํ•ด dependency graph๋ฅผ ๊ณ„์‚ฐํ•ด์„œ ์ด๋ฅผ ํ†ตํ•ด ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฒˆ๋“ค(bundle)๋กœ ๋งŒ๋“ค์–ด๋ƒ…๋‹ˆ๋‹ค.

๐Ÿ’๐Ÿป‍โ™€๏ธ
ํ•œ๋งˆ๋””๋กœ webpack์€ ๋ชจ๋“ˆ๋ฒˆ๋“ค๋Ÿฌ์ž…๋‹ˆ๋‹ค!

์ด์ œ webpack.config.js ์— ํฌํ•จ๋˜๋Š” webpack์˜ ์ฃผ์š” ๊ฐœ๋…๋“ค๊ณผ ๊ฐ๊ฐ์— ์–ด๋–ค ์„ธํŒ…์„ ํ•˜๊ฒŒ๋˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

Entry

entry๋Š” webpack์ด dependency graph๋ฅผ ๋นŒ๋”ฉํ•˜๊ธฐ ์œ„ํ•œ ์‹œ์ž‘์ (์ง„์ž…์ )์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

webpack์€ ์„ค์ •๋œ entry point๋ฅผ ์‹œ์ž‘์œผ๋กœ ์ง๊ฐ„์ ‘์ ์œผ๋กœ ์˜์กดํ•˜๋Š” ๋ชจ๋“ˆ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ๊ณ„์‚ฐํ•ด์„œ dependency graph๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

  • ๊ธฐ๋ณธ๊ฐ’

    ./src/index.js

  • ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ์„ธํŒ…ํ•  ๊ฒฝ์šฐ
    module.exports = {
      entry: './path/to/my/entry/file.js',
    };

 

Output

output ์„ค์ •์„ ํ†ตํ•ด webpack์ด ๋งŒ๋“ค์–ด๋‚ผ bundle์„ ์–ด๋””์— ์œ„์น˜์‹œํ‚ฌ๊ฑด์ง€, ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ํŒŒ์ผ๋ช…๋„ ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ธฐ๋ณธ๊ฐ’

    ๋ฉ”์ธ ์•„์›ƒํ’‹ ํŒŒ์ผ → ./dist/main.js

    ๋ฉ”์ธ ์•„์›ƒํ’‹ ํด๋” → ./dist/

  • ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ์„ธํŒ…ํ•  ๊ฒฝ์šฐ
    const path = require('path');
    
    module.exports = {
      entry: './path/to/my/entry/file.js',
      output: {
        path: path.resolve(__dirname, 'dist'),
        filename: 'my-first-webpack.bundle.js',
      },
    };

     

Loaders

๊ธฐ๋ณธ์ ์œผ๋กœ webpack์€ JavaScript, JSON ํŒŒ์ผ๋งŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‹ค๋ฅธ ํ˜•์‹์˜ ํŒŒ์ผ๋“ค์€ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

Loader ๋ฅผ ์ด์šฉํ•ด์„œ

  • ๋‹ค๋ฅธ ํŒŒ์ผ ํ˜•์‹๋“ค๋„ ์ฒ˜๋ฆฌํ•˜์—ฌ
  • application์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“ˆ๋กœ ๋ฐ”๊พธ๊ณ 
  • ์ด๋ฅผ dependency graph์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

loader์™€ ๊ด€๋ จ๋œ webpack ์„ค์ •์€ ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. test : ์–ด๋–ค ํŒŒ์ผ๋“ค์ด ๋ณ€ํ™˜๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ๋ช…์‹œ
  1. use : ๋ณ€ํ™˜์„ ์œ„ํ•ด ์–ด๋–ค loader๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ๋ช…์‹œ
const path = require('path');

module.exports = {
  output: {
    filename: 'my-first-webpack.bundle.js',
  },
  module: {
    rules: [{ test: /\.txt$/, use: 'raw-loader' }],
  },
};

์œ„ ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ์— ๋Œ€ํ•ด test, use ์ด๋ฃจ์–ด์ง„ rules ํ”„๋กœํผํ‹ฐ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์œ„ ์„ค์ •์„ ํ†ตํ•ด require(), import ์—์„œ .txt ํŒŒ์ผ์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ raw-loader ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ณ€ํ™˜ํ•ด์„œ bundle์— ํฌํ•จ์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

 

Plugins

loader๊ฐ€ ๋ชจ๋“ˆ์„ ๋ณ€ํ™˜ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค๋ฉด,

plugin์„ ํ†ตํ•ด webpack์˜ ๋Šฅ๋ ฅ์„ ํ™•์žฅํ•˜์—ฌ ์•„๋ž˜์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ์ž‘์—…์— ํ™œ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • bundle optimization (๋ฒˆ๋“ค ์ตœ์ ํ™”)
  • asset management
  • injection of environment

plugin์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด require()์„ ํ†ตํ•ด ์„ ์–ธํ•˜๊ณ , plugins array์— ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ plugin์€ ์˜ต์…˜์„ ํ†ตํ•ด ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋™์ผํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋‹ค๋ฅธ ๋ชฉ์ ์œผ๋กœ ์—ฌ๋Ÿฌ๊ฐœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, new operator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

const HtmlWebpackPlugin = require('html-webpack-plugin'); //installed via npm
const webpack = require('webpack'); //to access built-in plugins

module.exports = {
  module: {
    rules: [{ test: /\.txt$/, use: 'raw-loader' }],
  },
  plugins: [new HtmlWebpackPlugin({ template: './src/index.html' })],
};

์œ„ ์˜ˆ์‹œ์˜ ๊ฒฝ์šฐ html-webpack-plugin์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฒˆ๋“ค๋ง๋œ ํŒŒ์ผ๋“ค์„ ์ฃผ์ž…ํ•œ HTML ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Mode

modeํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ development, production, none ๊ณผ ๊ฐ™์€ ๊ฐ’์œผ๋กœ ์„ธํŒ…ํ•˜๋ฉด, ๊ฐ ํ™˜๊ฒฝ์— ์ ํ•ฉํ•œ webpack ๋นŒํŠธ์ธ ์ตœ์ ํ™”๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ธฐ๋ณธ๊ฐ’

    production

  • ๊ฐ mode ๋ณ„๋กœ ์„ค์ •๋œ ์ตœ์ ํ™”๋ฅผ ํ™•์ธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด mode-configuration ๋ฅผ ํ™•์ธํ•˜์„ธ์š”!
module.exports = {
  mode: 'production',
};

 

Browser Comapatibility

์›นํŽ™์€ ES5-compliant(IE8 ์ดํ•˜ ์ง€์›๋ถˆ๊ฐ€)์ธ ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. webpack์€ import(), require.ensure()๋ฅผ ์œ„ํ•ด Promise๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ๋ธŒ๋ผ์šฐ์ €๋„ ๋ชจ๋‘ ์ง€์›ํ•ด์•ผํ•œ๋‹ค๋ฉด, polyfill์„ ๋กœ๋“œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. (์ฐธ๊ณ  load-a-polyfill)

 

Environment

webpack5๋Š” Node.js 10.13.0+๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ”— Link