https://webpack.js.org/

 

webpack

webpack is a module bundler. Its main purpose is to bundle JavaScript files for usage in a browser, yet it is also capable of transforming, bundling, or packaging just about any resource or asset.

webpack.js.org

๐Ÿ‘ฉ๐Ÿป ์ด๋ฒˆ์—๋Š” ์›นํŒฉ์œผ๋กœ ๋ฒˆ๋“ค๋ง ์ž‘์—… ํ•ด๋ณด๋ ค๊ณ  ํ•ด์š”. ๋ฒˆ๋“ค๋ง ์ž‘์—… ํ•  ๋•Œ๋Š” ์›นํŒฉ ํŒจํ‚ค์ง€์™€ ์›นํŒฉ ํ„ฐ๋ฏธ๋„ ๋„๊ตฌ๋ฅผ ์„ค์น˜ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์˜ํ•ด์•ผ ๋  ์ ์ด ์žˆ๋Š”๋ฐ, ์›นํŒฉ์€ ํ˜„์žฌ ๋ฒ„์ „ 5 ๊นŒ์ง€ ๋‚˜์™”๊ฑฐ๋“ ์š”. ํ•˜์ง€๋งŒ ์ €๋Š” ๋ฒ„์ „ 4๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ข€ ๋” ๋’ค๋กœ ๋‚˜๊ฐˆ์ˆ˜๋ก ํ”Œ๋Ÿฌ๊ทธ์ธ๋„ ์•Œ์•„๋ณผํ…๋ฐ ๋ฒ„์ „ 5 ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜์‹œ ์•„์ง๊นŒ์ง€ ์ง€์› ์•ˆ๋˜๋Š” ๊ฒƒ๋“ค์ด ๋งŽ๋”๋ผ๊ตฌ์š”. ใ… ใ… 

 

์„ค์น˜๋ช…๋ น์–ด

$npm install -D webpack-cli
$npm install --save-dev webpack@(๋ฒ„์ „์ˆ˜)

์—ฌ๊ธฐ์„œ -D ๋Š” ๊ฐœ๋ฐœ์šฉ dependencies๋ฅผ ๋œปํ•ฉ๋‹ˆ๋‹ค. ์›นํŒฉ ๋ฒˆ๋“ค๋ง ํ•  ๋•Œ ํ•„์š”ํ•œ ๊ธฐ๋ณธ ํŒจํ‚ค์ง€๋“ค์„ ์„ค์น˜ ํ•˜์…จ๋‹ค๋ฉด ์›นํŒฉ ํ™˜๊ฒฝ์„ค์ • ํ•ด์ฃผ๋Š” ํŒŒ์ผ๋“ค์„ ๋งŒ๋“ค์–ด ๋ณผ๊ฑฐ์—์š”. [webpack.config.js] ๋ผ๋Š” ํŒŒ์ผ๋ช… ๋˜๋Š” [webpackfile.js] ํŒŒ์ผ๋ช… ์ค‘ ๋” ๋ง˜์— ๋“œ๋Š” ์ด๋ฆ„์„ ๊ณจ๋ผ ์›นํŒฉ ํ™˜๊ฒฝ์„ค์ • ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”. ๐Ÿ˜€์ €๋Š” [webpack.config.js]๋กœ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. 

 

๊ทธ๋ฆฌ๊ณ  ์›นํŒฉ์„ ์‹คํ–‰ํ•  ๋•Œ๋Š” ํ•„์ˆ˜์ ์ธ ์˜ต์…˜์ด ์žˆ์–ด์š”.

๐Ÿ‘‰ [webpack.config.js]


const path =  require('path');

module.exports = {
  mode: 'development',
  entry: {
    main : './src/app.js',
    main2 : './src/app2.js',
  },
  
  output: {
    path: path.resolve('./dist'),
    filename : '[name].js'
  }
} 

 

1. mode : development, production, none์ด ์žˆ๋Š”๋ฐ ๊ฐœ๋ฐœํ™˜๊ฒฝ์ด๋ƒ ์šด์˜ํ™˜๊ฒฝ์ด๋ƒ์— ๋”ฐ๋ผ์„œ development, production์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  • development : ๊ฐœ๋ฐœ์šฉ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ
  • production : ์šด์˜์— ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ

2. entry : ๋ชจ๋“ˆ์˜ ์‹œ์ž‘์  ์ž…๋‹ˆ๋‹ค.

3. output : ์—”ํŠธ๋ฆฌ๋ฅผ ํ†ตํ•ด ๋ชจ๋“ ๊ฑธ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๊ณ  ๊ฒฝ๋กœ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์„ ์•„์›ƒํ’‹์œผ๋กœ ์„ค์ •ํ•ด์ค๋‹ˆ๋‹ค.

 

์ด ๋ชจ๋“  ์„ค์ •์„ ๋๋‚ด์…จ์œผ๋ฉด, ํ„ฐ๋ฏธ๋„ ์ฐฝ์— ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด๋ณด์„ธ์š”!

$node_modules/.bin/webpack --mode development --entry ./src/app.js --output dist/main.js

๊ทธ๋Ÿผ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ชจ๋“ˆ์„ ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ๋งŒ๋“ค์–ด์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์•„์›ƒํ’‹ ํด๋” ๋ช…์„ dist๋ผ๊ณ  ์„ค์ •ํ–ˆ์œผ๋‹ˆ dist๋ผ๋Š” ํด๋”๊ฐ€ ์ƒ๊ฒผ์„๊ฑฐ์—์š” ๐Ÿ˜ƒ๊ทธ๋ฆฌ๊ณ  packages.json ํŒŒ์ผ์—์„œ๋„ ์ €ํฌ๊ฐ€ ์„ค์ •ํ•ด ์ค˜์•ผ ํ•  ๊ฒƒ์ด ์žˆ์–ด์š”.

๐Ÿ‘‰ [package.json]


{
  "name": "fn_dev_env",
  "version": "1.0.0",
  "description": "<br>",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    ๐Ÿ‘‰๐Ÿป "build": "webpack"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "react": "^17.0.1"
  },
  "devDependencies": {
    "webpack": "^4.46.0",
    "webpack-cli": "^4.5.0"
  }
}

์—ฌ๊ธฐ์„œ build๋ฅผ webpack์œผ๋กœ ์„ค์ •ํ•˜๋ฉด

$npm run build

ํ„ฐ๋ฏธ๋„์ฐฝ์— ์ด ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ–ˆ์„ ์‹œ, ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์— ์žˆ๋Š” ๋…ธ๋“œ ๋ชจ๋“ˆ์„ ๋’ค์ ธ์„œ ์›นํŒฉ ๋ช…๋ น์–ด๋ฅผ ์ฐพ์•„์ค˜์š”. ๊ทธ๋Ÿผ ์›นํŒฉ์€ ๊ธฐ๋ณธ  [webpack.config.js] ํŒŒ์ผ์„ ์ฝ์–ด์„œ ๋ฒˆ๋“ค๋ง ํ•ด์ค„ ๊ฒƒ ์ž…๋‹ˆ๋‹ค. 

 


 

๐Ÿ‘ฉ๐Ÿป ์ด์ œ๋Š” ๋กœ๋”์™€ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋กœ๋”๋ฅผ ์•Œ์•„๋ณผ ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

๋กœ๋”

์›นํŒฉ์€ ๋ชจ๋“  ํŒŒ์ผ์„ ๋ชจ๋“ˆ๋กœ ๋ฐ”๋ผ๋ด…๋‹ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋งŒ๋“  ๋ชจ๋“ˆ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, css, ์ด๋ฏธ์ง€, ํฐํŠธ๋„ ์ „๋ถ€ ๋ชจ๋“ˆ๋กœ ๋ณด๊ธฐ ๋•Œ๋ฌธ์— import ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ ์•ˆ์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์–ด์š”. ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” ์›นํŒฉ์˜ ๋กœ๋” ๋•๋ถ„์ด๋ž๋‹ˆ๋‹ค. ๋กœ๋”๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๊ฐ™์€ ๋‹ค๋ฅธ ์–ธ์–ด๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•์œผ๋กœ ๋ณ€ํ™˜ํ•ด ์ฃผ๊ฑฐ๋‚˜ ์ด๋ฏธ์ง€๋ฅผ data URI ํ˜•์‹์˜ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๊ธฐ๋„ ํ•ด์š”. ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ css ํŒŒ์ผ์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ง์ ‘ ๋กœ๋”ฉ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ต๋‹ˆ๋‹ค.

  module: {
    rules: [
      {
        test: /\.js$/,
        use: [path.resolve("./my-webpack-loader.js")],
      },
    ],
  },

๋กœ๋”๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ด๋ ‡๊ฒŒ ๋ชจ๋“ˆ ๊ฐ์ฒด ์•ˆ์—๋‹ค๊ฐ€ rules ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด rules ์•ˆ์— ๋ฐฐ์—ด๋กœ ๊ฐ์ฒดํ™”ํ•ด์„œ ์‚ฌ์šฉํ•  ๋กœ๋”๋“ค์„ ์„ค์ •ํ•ด ์ฃผ๋ฉด๋ฉ๋‹ˆ๋‹ค. ์ฒ˜๋ฆฌํ•  ํŒŒ์ผ์€ test์— ์œ„ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์ •๊ทœํ‘œํ˜„์‹์œผ๋กœ ๋ช…์‹œํ•ด์ฃผ์„ธ์š”. 

  • test : ๋กœ๋”๋ฅผ ์ ์šฉํ•  ํŒŒ์ผ ์œ ํ˜•์„ ๋œปํ•ฉ๋‹ˆ๋‹ค.
  • use : ํ•ด๋‹น ํŒŒ์ผ์— ์ ์šฉํ•  ๋กœ๋” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

 

์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋กœ๋”

๋กœ๋”๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋กœ๋” ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ด์ฃผ์…”์•ผ ๋ฉ๋‹ˆ๋‹ค.

 

1. CSS-loader

$npm install css-loader style-loader

css ๋กœ๋”๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด ํŒŒ์ผ์ด JS๋กœ ๋ณ€ํ™˜๋  ๋•Œ style-loader๋„ ๊ฐ™์ด ์„ค์น˜ํ•ด ์ฃผ์…”์•ผํ•ด์š”. 

 

module: {
    rules: [
      {
        test: /\.css$/,
        use: ["style-loader", "css-loader"],
      },
    ],
  },

๋จผ์ € ์„ค์น˜ํ•œ ํŒจํ‚ค์ง€๊ฐ€ ๋’ค๋กœ ๊ฐ€๋Š” ์ˆœ์„œ๋กœ ์ž…๋ ฅํ•ด์ฃผ์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค !

 

2. image-loader

$npm install file-loader

๋‹ค์Œ์œผ๋กœ ์ž์ฃผ ์“ฐ์ผ ๋กœ๋”๋Š” ์ด๋ฏธ์ง€๋กœ๋”์ž…๋‹ˆ๋‹ค. ์œ„ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ด์ฃผ์„ธ์š”. 

{
        test: /\.jpg$/,
        loader: "file-loader",
        options: {
          pubilcPath: "./dist/",
          name: "[name].[ext]?[hash]", //์ด๋ฆ„.ํ™•์žฅ์ž?ํ•ด์‹œ๊ฐ’
        },
      },

์–˜๋„ css ๋กœ๋”์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ rules ์•ˆ์— ์„ ์–ธํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. options์— ์žˆ๋Š” publicPath๋Š” ์ด ์ด๋ฏธ์ง€๋“ค์ด ๋‹ด๊ธธ ๊ณต๊ฐ„์„ ์˜๋ฏธํ•ด์š”. publicPath๋Š” ํŒŒ์ผ๋กœ๋”๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋Š” ํŒŒ์ผ์„ ๋ชจ๋“ˆ๋กœ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ๊ฒฝ๋กœ ์•ž์— ์ถ”๊ฐ€๋˜๋Š” ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. ์‰ฝ๊ฒŒ๋งํ•ด ์•„์›ƒํ’‹์„ dist๋กœ ์„ค์ •ํ–ˆ์œผ๋‹ˆ pubilcPath๋„ ๊ฐ™์€ ๊ฒฝ๋กœ๋กœ ๋™์ผํ•˜๊ฒŒ dist๋กœ ์„ค์ •ํ•ด์ค˜์•ผ ํ•ด์š”!

์ด๋ฒˆ์—๋Š” ์—ฌ๋Ÿฌ ์ด๋ฏธ์ง€ ์‚ฌ์šฉ์‹œ data URI๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฏธ์ง€ ๊ฐฏ์ˆ˜๊ฐ€ ๋งŽ๋‹ค๋ฉด ๋„คํŠธ์›Œํฌ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋‹ด์ด ์žˆ๊ณ  ์‚ฌ์ดํŠธ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜๋„ ์žˆ์–ด์š”. ํ•œ ํŽ˜์ด์ง€์—์„œ ์ž‘์€ ์ด๋ฏธ์ง€๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด data URI scheme๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋” ๋‚ซ์Šต๋‹ˆ๋‹ค.

$npm install url-loader

ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜์…จ์œผ๋ฉด ์ด์ œ ์›นํŒฉ ํ™˜๊ฒฝ์„ค์ •์„ ํ•ด๋ด…์‹œ๋‹ค.

 

{
        test: /\.(jpg|png|gif|svg)$/,
        loader: "url-loader",
        options: {
          publicPath: "./dist/",
          name: "[name].[ext]?[hash]",
          limit: 20000,
        },
      },

test์— jpg ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ ํ™•์žฅ์ž๋ฅผ ๋ฒˆ๋“ค๋ง ํ•ด์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด, (ํ™•์žฅ์ž๋ช…|ํ™•์žฅ์ž๋ช…|ํ™•์žฅ์ž๋ช…) ์ด๋ ‡๊ฒŒ ๋„์–ด์“ฐ๊ธฐ ์—†์ด ์„ค์ •ํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋กœ๋”๋Š” url-loader๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€๋œ limit์€ ํŒŒ์ผ ์šฉ๋Ÿ‰์œผ๋กœ ์•„์›ƒํ’‹์„ ํ•ด์ฃผ๋ƒ, ์•„๋‹ˆ๋ฉด data uri๋กœ ๋ฟŒ๋ ค์ฃผ๋ƒ ์„ค์ •ํ•ด์ฃผ๋Š”๋ฐ์š”. ์—ฌ๊ธฐ์„œ 20000์€ 20kb๋ฅผ ์˜๋ฏธํ•ด์š”. url-loader๊ฐ€ ์ด๋ฏธ์ง€ ํŒŒ์ผ๋“ค์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์šฉ๋Ÿ‰์ด 20kb ๋ฏธ๋งŒ์€ url-loader๋กœ ํ•ด์„œ bath 64๋กœ ๋ณ€ํ™˜์ฒ˜๋ฆฌ ํ•ด์ค๋‹ˆ๋‹ค. ๊ทธ ์ด์ƒ์ด๋ฉด file-loader๋กœ ์‹คํ–‰๋˜์–ด ํŒŒ์ผ์ด dist ํด๋”์— ๋ณต์ œ๋œ ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”.

์ด์™ธ์—๋„ ts ๋กœ๋”, sass ๋กœ๋”, babel ๋กœ๋”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

npm install --save-dev typescript ts-loader

webpack.js.org/guides/typescript/#loader

 

TypeScript | webpack

webpack is a module bundler. Its main purpose is to bundle JavaScript files for usage in a browser, yet it is also capable of transforming, bundling, or packaging just about any resource or asset.

webpack.js.org

 

 

๋กœ๋” ๋งˆ๋ฌด๋ฆฌ

 module: {
    rules: [
      {
        test: /\.css$/,
        use: ["style-loader", "css-loader"],
      },
      {
        test: /\.(jpg|png|gif|svg)$/,
        loader: "url-loader",
        options: {
          publicPath: "./dist/",
          name: "[name].[ext]?[hash]",
          limit: 20000, //ํŒŒ์ผ ์šฉ๋Ÿ‰๋„ ์„ค์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค 2kb
        },
      },
    ],
  },

 

์ด์ฒ˜๋Ÿผ ๋กœ๋”๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋ชจ๋“ˆ์•ˆ์— rules ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์ด ์•ˆ์—์„œ ๋ฐฐ์—ด๋กœ ๋กœ๋” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์„ค์ •ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค! ์›นํŒฉ ๋‹ค๋ฃจ๋Š” ๊ธฐ๋ณธ๊ธฐ๋งŒ ์•Œ์•„๋‘๋ฉด ๋‹ค๋ฅธ ๋กœ๋”๋“ค๋„ ์‚ฌ์šฉํ•  ๋•Œ ์‰ฝ๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์„ ๊ฒ๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ css๋กœ๋”์™€ ์ด๋ฏธ์ง€ ๋กœ๋”๋ฅผ ์•Œ์•„๋ดค๋Š”๋ฐ, ๋‹ค์Œ์—๋Š” ts๋กœ๋”์™€ sass๋กœ๋” ์Šคํ”„๋ผ์ดํŠธ ์ด๋ฏธ์ง€ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•๋„ ์•Œ์•„๋ณด๊ณ  ์ •๋ฆฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

+ Recent posts