์™œ Webpack์ด ๋“ฑ์žฅํ•˜๊ฒŒ ๋˜์—ˆ์„๊นŒ?

  • ๊ทœ๋ชจ๊ฐ€ ์žˆ๋Š” System์—์„œ๋Š” ๋งŽ์€ Javascript๊ฐ€ ์กด์žฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด ๋งŽ์€ Javascript ํŒŒ์ผ์„ ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ์—” ์–ด๋ ค์›€์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์—ฌ๋Ÿฌ ๊ฐœ๋กœ ํ˜ธ์ถœํ•˜๋ฉด ํ•ด๊ฒฐ๋˜๋Š”๊ฒŒ ์•„๋‹๊นŒ?

  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒŒ์ผ์„ ๋ธŒ๋ผ์šฐ์ ธ์—์„œ ๋กœ๋”ฉํ•˜๋Š” ๊ฒƒ์€ ๋„คํŠธ์›Œํฌ ๋น„์šฉ์ด ๊ทธ๋งŒํผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ˜์‘์†๋„๊ฐ€ ๋Š๋ ค์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ๋” ๋‚˜์•„๊ฐ€ ๊ฐ ํŒŒ์ผ์˜ ๋ณ€์ˆ˜ ์ถฉ๋Œ์˜ ์œ„ํ—˜์„ฑ๋„ ์กด์žฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Webpack์ด ๋“ฑ์žฅํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Webpack์ด๋ž€?

  • ํ˜„๋Œ€ Javascript Application์˜ Static Module Bundler์ž…๋‹ˆ๋‹ค.
  • Webpack์ด ์‹คํ–‰๋œ๋‹ค๋ฉด Dependencies Graph๋ฅผ ํ†ตํ•ด ํ•„์š”ํ•œ ํ˜•ํƒœ์˜ ํ•˜๋‚˜ ๋˜๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ Bundle๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

Bundle์ด๋ž€?

  • ์†Œํ”„ํŠธ์›จ์–ด ๋ฐ ์ผ๋ถ€ ํ•˜๋“œ์›จ์–ด์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์„ ํฌํ•จํ•˜๋Š” Package
  • ๊ฐ๊ฐ์˜ ๋ชจ๋“ˆ๋“ค์— ๋Œ€ํ•ด ์˜์กด์„ฑ ๊ด€๊ณ„๋ฅผ ํŒŒ์•…ํ•˜์—ฌ ํ•˜๋‚˜ ๋˜๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ๊ทธ๋ฃน์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์™œ Webpack์„ ์‚ฌ์šฉํ•ด์•ผํ• ๊นŒ?

  • ๋‹ค๋ฅธ Module Bundler๋„ ๋งŽ์ด ์กด์žฌํ•˜์ง€๋งŒ performance๊ฐ€ ์šฐ์ˆ˜ํ•ฉ๋‹ˆ๋‹ค.

Browsify, Grunt, Gulp ๋“ฑ์˜ ๋„๊ตฌ๋“ค์€ webpack๊ณผ ๋ฌด์Šจ ์ฐจ์ด๊ฐ€ ์žˆ์„๊นŒ?

  • ํฌ๊ณ  ๋ณต์žกํ•˜๋ฉฐ ๋‹ค์–‘ํ•œ ๋ฆฌ์†Œ์Šค๋“ค์ด ๋“ค์–ด์žˆ๋Š” ํ”„๋กœ์ ํŠธ์—๋Š” webpack์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
  • Grunt, Gulp๋Š” ์˜ค๋กœ์ง€ ๋ฆฌ์†Œ์Šค๋“ค์— ๋Œ€ํ•œ ํˆด๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ dependency graph์— ๋Œ€ํ•œ ๊ฐœ๋…์ด ์—†์Šต๋‹ˆ๋‹ค.
  • Browsify๋Š” ๋น„์Šทํ•œ ๋„๊ตฌ์ด์ง€๋งŒ ์†๋„๋ฉด์—์„œ webpack์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

Webpack Core Concept

Entry

  • dependency graph๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ Input Source์ž…๋‹ˆ๋‹ค.
  • ์ง/๊ฐ„์ ‘์ ์œผ๋กœ ์˜์กด์„ฑ์„ ๊ฐ€์ง„ ๋ชจ๋“ˆ๋“ค์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.
  • ์—ฌ๋Ÿฌ๊ฐœ์˜ entry๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Default value : ./src/index.js
module.exports = {
  entry: './path/to/my/entry/file.js'
};

Output

  • Webpack์ด ์ƒ์„ฑํ•œ bundles์˜ ๊ฒฐ๊ณผ๋ฌผ์˜ ์œ„์น˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Default value : ./dist/main.js
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๋Š” ๋‹ค๋ฅธ Type์˜ ํŒŒ์ผ์„ Webpack์ด ์ดํ•ดํ•˜๊ณ  ์ฒ˜๋ฆฌ๊ฐ€๋Šฅํ•œ ๋ชจ๋“ˆ๋กœ ๋ณ€ํ™˜์‹œํ‚ค๋Š” ์ž‘์—…์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
const path = require('path');
 
module.exports = {
  output: {
    filename: 'my-first-webpack.bundle.js'
  },
  module: {
    rules: [
      { test: /\.txt$/, use: 'raw-loader' }
    ]
  }
};

Plugins

  • Loader๊ฐ€ ๋ณ€ํ™˜ํ•˜๋Š” ๋™์•ˆ Plugin์€ bundle optimization, asset management and injection of environment๊ณผ ๊ฐ™์€ ์ผ์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
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'})
  ]
};

Mode

  • ๋‹ค์–‘ํ•œ Profile๋กœ ์ง€์ •ํ•˜์—ฌ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • development, production, none
  • Default value : production
module.exports = {
  mode: 'production'
};

Browser Compatibility

  • ์›นํŒฉ์€ ES5๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ IE8์˜ ์•„๋ž˜ ๋ฒ„์ ผ์€ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Webpack Tips

Reference