[Web] πŸ—‚ν”„λ‘ νŠΈμ—”λ“œμ—μ„œ λ²ˆλ“€λ§μ΄λž€? / πŸ› Webpack

김뀨뀨·2022λ…„ 9μ›” 27일
8

Web

λͺ©λ‘ 보기
3/3

λ²ˆλ“€λ§


↑ μœ„ 사진은 μ΄ˆλ“±ν•™κ΅ μž…ν•™μ„ μœ„ν•œ μ œν’ˆ λ²ˆλ“€μ΄λ‹€.
μ΄λŸ°μ‹μœΌλ‘œ μ–΄λ–€ μ œν’ˆμ„ 묢음으둜 νŒλ§€ν•˜λŠ” 것을 'λ²ˆλ“€λ§'ν•œλ‹€κ³  ν•œλ‹€.

μ›Ή κ°œλ°œμ—μ„œ λ²ˆλ“€λ§

그럼 μ›Ή κ°œλ°œμ„ ν•  λ•Œ 'λ²ˆλ“€λ§'을 ν•œλ‹€κ³  ν•˜λ©΄ 무슨 의미일까?
(참고둜 μ›Ή κ°œλ°œμ—μ„œ λ²ˆλ“€λ§ = λΉŒλ“œ 라고 ν•  수 μžˆλ‹€.)
μ‚¬μš©μžμ—κ²Œ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ œκ³΅ν•˜κΈ° μœ„ν•΄ μ—¬λŸ¬ μ½”λ“œμ™€ ν”„λ‘œκ·Έλž¨λ“€μ„ λ¬ΆλŠ” ν–‰μœ„λ‘œ μ •μ˜ν•  수 μžˆλ‹€.
κ°œλ°œμžλŠ” μ΅œμ’…μ μœΌλ‘œ λ²ˆλ“€λ§λœ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ§Œλ“€μ–΄λ‚΄κ³ , μ‚¬μš©μžκ°€ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ΄μš©ν•  λ•ŒλŠ” λ²ˆλ“€λ§ν•œ νŒŒμΌμ„ 받아와 λΈŒλΌμš°μ €κ°€ 이 λ²ˆλ“€μ„ μ‹€ν–‰ν•œλ‹€.

λ²ˆλ“€λ§μ„ ν•˜λŠ” 이유

🧐 κ·Έλƒ₯ html, css, javascript둜 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ§Œλ“€ μˆ˜λ„ μžˆμ§€λ§Œ ꡳ이 λ²ˆλ“€λ§μ„ ν•˜λŠ” μ΄μœ κ°€ 뭘까?

πŸ—‚ 파일의 크기 문제 ν•΄κ²°

μ½”λ“œλ₯Ό 'λ²ˆλ“€λ§'ν•œλ‹€λŠ” 것은 λ‹¨μˆœνžˆ 묢기만 ν•˜λŠ” 것이 μ•„λ‹ˆλΌ 컴퓨터 νŒŒμΌμ„ 'μ••μΆ•'ν•˜λŠ” κ°œλ…κ³Ό λΉ„μŠ·ν•˜λ‹€.
λ²ˆλ“€ νŒŒμΌμ€ λ²ˆλ“€λ§μ„ κ±°μΉ˜μ§€ μ•Šμ€ 원본 ν”„λ‘œκ·Έλž¨ νŒŒμΌλ³΄λ‹€ 크기가 μž‘μ•„μ§€κ³  μ‹€ν–‰ 속도, λ‘œλ”© 속도 λ˜ν•œ 빨라진닀. λ²ˆλ“€λ§μ„ ν•˜λŠ” 것은 μ„±λŠ₯ μΈ‘λ©΄μ—μ„œ 무쑰건 이득이닀!

πŸ›‘ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μž„μ˜ μ‘°μž‘ 방지

μ••μΆ•ν•œ νŒŒμΌμ„ 받아와 μ••μΆ•ν•΄μ œ μ „κΉŒμ§€λŠ” νŒŒμΌμ„ μ‘°μž‘ν•  수 μ—†λŠ” κ²ƒμ²˜λŸΌ, λ²ˆλ“€λ§λœ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜λ„ μ‚¬μš©μžκ°€ μž„μ˜λ‘œ μ‘°μž‘ν•  수 μ—†λ‹€. λ²ˆλ“€λ§λ˜μ§€ μ•Šμ€ 원본 μ½”λ“œμ— μ‚¬μš©μžκ°€ μ ‘κ·Όν•  수 μžˆλ‹€λ©΄, 컴퓨터λ₯Ό 잘 μ•„λŠ” μ‚¬μš©μžκ°€ 이λ₯Ό μ›ν•˜λŠ” λŒ€λ‘œ μ‘°μž‘ν•  μœ„ν—˜μ΄ 생긴닀. (ex. κ°•μ˜ μ•ˆλ“£κ³  듀은 κ²ƒμ²˜λŸΌ λ§Œλ“€κΈ° λΌλ˜κ°€..)

πŸ—„ 파일 λ‹¨μœ„μ˜ js λͺ¨λ“ˆ κ΄€λ¦¬μ˜ ν•„μš”μ„±

Javascriptμ—μ„œ λ³€μˆ˜λŠ” 기본적으둜 'μ „μ—­ λ²”μœ„'λ₯Ό 가지기 λ•Œλ¬Έμ— ν•˜λ‚˜μ˜ ν”„λ‘œμ ν”„ ν΄λ”μ—μ„œ μ—¬λŸ¬ 개의 .js 파일이 μžˆλ”λΌλ„ μ„œλ‘œ λ³€μˆ˜λ₯Ό κ³΅μœ ν•˜κ²Œ λœλ‹€.
근데 μ—¬κΈ°μ„œ λ³€μˆ˜λ₯Ό 쀑볡 μ„ μ–Έν•˜κ±°λ‚˜ μ˜λ„μΉ˜ μ•Šμ€ 값을 ν• λ‹Ήν•΄ μƒκΈ°λŠ” μ—λŸ¬λ₯Ό λ²ˆλ“€λ§ 도ꡬ인 Webpackμ—μ„œλŠ” λͺ¨λ“ˆ λ²ˆλ“€λ§μœΌλ‘œ ν•΄κ²°ν•œλ‹€.

μ›ΉνŒ©(Webpack)

webpackμ΄λž€?

2022λ…„ ν˜„μž¬ ν”„λ‘ νŠΈμ—”λ“œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 배포λ₯Ό μœ„ν•΄ κ°€μž₯ 많이 μ‚¬μš©ν•˜λŠ” λ²ˆλ“€λ§ 도ꡬ, λ²ˆλ“€λŸ¬μ΄λ‹€.
webpack은 'javascript μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μœ„ν•œ λͺ¨λ“ˆ λ²ˆλ“€λŸ¬'이닀.

✏️ module bundler
HTML, CSS, Javascript λ“±μ˜ μžμ›μ„ 각각의 λͺ¨λ“ˆλ‘œ 보고 이λ₯Ό μ‘°ν•©ν•΄ ν•˜λ‚˜μ˜ 묢음으둜 λ²ˆλ“€λ§(λΉŒλ“œ)ν•˜λŠ” 도ꡬ
(μ—¬κΈ°μ„œ λͺ¨λ“ˆμ€ μ½”λ“œλΏλ§Œ μ•„λ‹ˆλΌ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— ν•„μš”ν•œ 이미지 파일과 기타 νŒŒμΌλ„ λͺ¨λ‘ ν¬ν•¨ν•œλ‹€.)

λͺ¨λ“ˆ λ²ˆλ“€λŸ¬μ˜ λ“±μž₯

λͺ¨λ˜ μ›ΉμœΌλ‘œ λ°œμ „ν•˜λ©΄μ„œ html, css 파일의 λ‚΄μš©μ΄ javascript 파일 μ•ˆμœΌλ‘œ λ“€μ–΄μ™”λ‹€.
β†’ κ·Έλž˜μ„œ .js 파일의 양이 μ ˆλŒ€μ μœΌλ‘œ μ¦κ°€ν•˜κ³ ,
β†’ μ„ΈλΆ„ν™”λœ λͺ¨λ“ˆ 파일이 폭발적으둜 증가해
β†’ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ˜μ‘΄μ„± νŠΈλ¦¬λ„ λŒ€κ·œλͺ¨κ°€ λ˜μ—ˆλ‹€.
μ΄λ ‡κ²Œ 되면 μœ„μ—μ„œ λ§ν–ˆλ˜ javascript의 λ³€μˆ˜ μŠ€μ½”ν”„ 문제 + μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•  λ•Œ λ„€νŠΈμ›Œν¬ μͺ½μ˜ λΉ„μš© λ¬Έμ œκΉŒμ§€ μ‹ κ²½μ“°κ²Œ λ˜μ—ˆλ‹€.

λͺ¨λ“ˆ λ²ˆλ“€λŸ¬λŠ”
: ν•˜λ‚˜μ˜ μ‹œμž‘μ  (ex. react app의 index.js)λ‘œλΆ€ν„° μ˜μ‘΄μ„±μ„ κ°€μ§€λŠ” λͺ¨λ“ˆμ„ λͺ¨λ‘ 좔적해 dependency graphλ₯Ό λ§Œλ“€κ³ , ν•˜λ‚˜μ˜ 결과물을 λ§Œλ“€μ–΄ λ‚΄λŠ” λ°©μ‹μœΌλ‘œ 문제λ₯Ό ν•΄κ²°ν•œλ‹€.

webpack이 μ œκ³΅ν•˜λŠ” 것듀

λ„€νŠΈμ›Œν¬ λΉ„μš© κ°μ†Œ

각 μžμ›μ„ 일일이 μ„œλ²„μ— μš”μ²­ν•΄ μ–»μ–΄μ˜¬ ν•„μš”κ°€ μ—†λ‹€
β†’ λŒ€μ‹  같은 νƒ€μž…μ˜ μžμ›μ„ μš”μ²­ν•΄ μš”μ²­κ³Ό 응닡을 μ£Όκ³  λ°›λŠ”λ‹€

javascript 문법 버전 ν˜Έν™˜μ„± 지원

loaderλ₯Ό μ‚¬μš©ν•΄μ„œ javascript ES6 문법을 ES5둜 λ³€ν™˜ν•΄μ£ΌλŠ” babel-loaderλ₯Ό μ΄μš©ν•  수 μžˆλ‹€.

development / production λͺ¨λ“œ 선택 κ°€λŠ₯

production λͺ¨λ“œμ—μ„œλŠ” μ½”λ“œ λ‚œλ…ν™”, μ••μΆ•, μ΅œμ ν™” μž‘μ—… 등을 지원해쀀닀.

webpack.config.js


webpack으둜 λ²ˆλ“€λ§μ„ ν•  λ•Œ, webpack.config.jsλΌλŠ” μ„€μ • νŒŒμΌμ„ 직접 μž‘μ„±ν•΄μ„œ λ‚΄ μž…λ§›μ— 맞게 λ²ˆλ“€λ§μ΄ κ°€λŠ₯ν•˜λ‹€. (config 파일이 ν•„μˆ˜λ‘œ μš”κ΅¬λ˜μ§€λŠ” μ•ŠλŠ”λ‹€.)
config 파일 μ•ˆμ—μ„œ target, entry, output, module, plugins, loader, mode 등등을 섀정해쀄 수 μžˆλ‹€.

entry

webpack이 μ˜μ‘΄μ„± κ·Έλž˜ν”„λ₯Ό 그리기 μ‹œμž‘ν•˜λŠ” μ‹œμž‘μ μ΄ λ˜λŠ” νŒŒμΌμ„ μ§€μ •ν•œλ‹€.
default κ°’μœΌλ‘œλŠ” ./src/index.js을 μ‚¬μš©ν•œλ‹€.

module.exports = {
    name: 'webpack-setting',
    entry: './src/index.js',
};

output

μƒμ„±ν•œ λ²ˆλ“€μ„ 내보낼 μœ„μΉ˜μ™€ λ²ˆλ“€ 파일의 이름을 μ§€μ •ν•œλ‹€.
default κ°’μœΌλ‘œλŠ” ./dist/main.jsλ₯Ό μ‚¬μš©ν•œλ‹€.

const path = require('path');

module.exports = {
    ...
  	output: {
		path: path.resolve(__dirname, 'dist'),
      	filename: 'bundle.js',
    }
};

loader

webpack은 기본적으둜 javascript와 JSON 파일만 μ΄ν•΄ν•œλ‹€. λ‹€λ₯Έ μœ ν˜•μ˜ νŒŒμΌμ„ μ²˜λ¦¬ν•˜λ €λ©΄ loaderλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.
loaderλŠ” νŒŒμΌλ“€μ„ μœ νš¨ν•œ λͺ¨λ“ˆλ‘œ λ³€ν™˜ν•΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— μ‚¬μš©ν•˜κ±°λ‚˜, μ˜μ‘΄μ„± κ·Έλž˜ν”„μ— μΆ”κ°€ν•œλ‹€.

module.exports = {
    ...
  	module: {
		rules: [
          {
            test: /\.css$/,
            use: [MiniCssExtraPlugin.loader, "css-loader"],
            exclude: /node_modules/,
          },
        ]
    }
};

module의 rules 배열에 ν•­λͺ©μ„ μΆ”κ°€ν•¨μœΌλ‘œμ¨ μ‚¬μš©ν•  수 μžˆλ‹€. μ˜ˆμ‹œλŠ” css νŒŒμΌμ„ μ‚¬μš©ν•˜κΈ° μœ„ν•΄ css loaderλ₯Ό λΆˆλŸ¬μ™”λ‹€.

  • test(ν•„μˆ˜): λ³€ν™˜μ΄ ν•„μš”ν•œ νŒŒμΌλ“€μ„ 식별
  • use(ν•„μˆ˜): λ³€ν™˜μ„ μˆ˜ν–‰ν•  loaderλ₯Ό 가리킴
  • exclude: λ°”λ²¨λ‘œ μ»΄νŒŒμΌν•˜μ§€ μ•Šμ„ νŒŒμΌμ΄λ‚˜ 폴더λ₯Ό 지정

plugins

loaderκ°€ νŠΉμ • λͺ¨λ“ˆλ“€μ„ λ³€ν™˜ν•˜λŠ”λ° μ“°μ˜€λ‹€λ©΄, plugin은 더 넓은 λ²”μœ„μ˜ μž‘μ—…μ„ μˆ˜ν–‰ν•œλ‹€. λ²ˆλ“€μ„ μ΅œμ ν™”ν•˜κ±°λ‚˜ 에셋을 κ΄€λ¦¬ν•˜κ³ , ν™˜κ²½λ³€μˆ˜ μ£Όμž… λ“±μ˜ μž‘μ—…μ„ ν•΄μ€€λ‹€.

μ‚¬μš©λ°©λ²•μ€
1. require ꡬ문을 톡해 plugin을 뢈러였고,
2. plugins 배열에 μΆ”κ°€ν•˜κ³ ,
3. 이 λ•Œ λ‹€λ₯Έ λͺ©μ μœΌλ‘œλ„ μ—¬λŸ¬λ²ˆ μ‚¬μš©ν•  수 μžˆλ„λ‘ new ν‚€μ›Œλ“œλ‘œ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•΄μ£Όμ–΄μ•Όν•œλ‹€!

const webpack = require('webpack');
const HtmlWebpackPlugin = require("html-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");

module.exports = {
  ...
  plugins: [
    new HtmlWebpackPlugin({
      template: path.resolve(__dirname, "src", "index.html"),
    }),
    new MiniCssExtractPlugin(),
  ],
};
  • html-webpack-plugin: μƒμ„±λœ λͺ¨λ“  λ²ˆλ“€μ„ μžλ™μœΌλ‘œ μ‚½μž…ν•΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μš© html νŒŒμΌμ„ μƒμ„±ν•œλ‹€.
  • mini-css-extract-plugin: cssλ₯Ό λ³„λ„λ‘œ μΆ”μΆœν•΄ cssλ₯Ό ν¬ν•¨ν•˜λŠ” js νŒŒμΌλ³„ css νŒŒμΌμ„ μž‘μ„±ν•΄μ€€λ‹€.

mode

modeμ—λŠ” development, production, none 세가지 μ˜΅μ…˜μ΄ μžˆλ‹€. defaultλŠ” production이닀.

module.exports = {
  mode: 'production',
  ...
};

μ°Έκ³ : https://webpack.js.org/concepts/

profile
개발둜 λ°₯벌이 ν•˜κ³  싢은 μ‚¬λžŒ

0개의 λŒ“κΈ€