πŸ’«

Plugin

λ‘œλ”κ°€ 파일(λͺ¨λ“ˆ) λ‹¨μœ„λ‘œ κΈ°λŠ₯을 μ²˜λ¦¬ν•˜λŠ” 반면, ν”ŒλŸ¬κ·ΈμΈμ€ μ΅œμ’…μ μœΌλ‘œ λ²ˆλ“€λœ 결과물을 κ°€κ³΅ν•˜κ³ μž ν• λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.
Β 
많이 μ‚¬μš©ν•˜λŠ” ν”ŒλŸ¬κ·ΈμΈ λͺ‡ κ°€μ§€λ₯Ό μ†Œκ°œν•©λ‹ˆλ‹€

1. BannerPlugin

λ²ˆλ“€λ§λœ 파일의 μ΅œμƒλ‹¨μ— λ°°λ„ˆ(주석)λ₯Ό λ‹¬μ•„μ£ΌλŠ” ν”ŒλŸ¬κ·ΈμΈμž…λ‹ˆλ‹€. 주둜 λΉŒλ“œμ™€ κ΄€λ ¨λœ 정보 (λΉŒλ“œ λ‚ μ§œ, λΉŒλ“œ 버전 λ“±)λ₯Ό μ œκ³΅ν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.
Β 
  1. webpack.config.js νŒŒμΌμ— webpack λͺ¨λ“ˆμ„ λΆˆλŸ¬μ˜΅λ‹ˆλ‹€. μ›ΉνŒ©μ—μ„œ 기본적으둜 μ œκ³΅ν•˜λŠ” ν”ŒλŸ¬κ·ΈμΈμ΄κΈ° λ•Œλ¬Έμ— μ„€μΉ˜κ°€ ν•„μš” μ—†μŠ΅λ‹ˆλ‹€.
const webpack = require('webpack');
Β 
  1. Module ν•˜λ‹¨μ— plugins 속성을 μΆ”κ°€ν•©λ‹ˆλ‹€.
plugins: [ new webpack.BannerPlugin({ banner: 'λ°°λ„ˆμž…λ‹ˆλ‹€!!' }) ]
Β 
  1. λΉŒλ“œν•˜κ³  κ²°κ³Όλ₯Ό ν™•μΈν•©λ‹ˆλ‹€.
Β 
ν˜„μ—…μ—μ„œ κΉƒκ³Ό κ΄€λ ¨λœ 정보λ₯Ό λ°°λ„ˆμ— μΆ”κ°€ν•΄μ•Όν•  κ²½μš°λ„ μžˆμ„κ²λ‹ˆλ‹€. ν”„λ‘œμ νŠΈλ₯Ό κΉƒν—ˆλΈŒμ™€ μ—°κ²°ν•˜κ³  λ°°λ„ˆμ— κ΄€λ ¨ 정보λ₯Ό μΆ”κ°€ν•΄ λ΄…μ‹œλ‹€!
Β 

<λ―Έλ‹ˆ ν”„λ‘œμ νŠΈ>

κΉƒμ΄λž‘ ν”„λ‘œμ νŠΈ μ—°κ²°ν•˜κ³  λ°°λ„ˆ ν”ŒλŸ¬κ·ΈμΈμ— κΉƒ 정보 μΆ”κ°€ν•˜κΈ°
Β 
  1. git init 을 톡해 κΉƒ ν”„λ‘œμ νŠΈμž„μ„ μ•Œλ €μ€λ‹ˆλ‹€.
git init
Β 
  1. 이제 νŒŒμΌλ“€μ΄ 깃에 μ˜ν•΄ μΆ”μ λ©λ‹ˆλ‹€. ν•„μš” μ—†λŠ” νŒŒμΌλ“€μ„ .gitignore 에 λ“±λ‘ν•©λ‹ˆλ‹€.
    1. .gitignore νŒŒμΌμ„ 루트 디렉토리에 μƒμ„±ν•©λ‹ˆλ‹€.
    2. λ¬΄μ‹œν•΄μ•Όν•  λͺ©λ‘μ„ μž‘μ„±ν•©λ‹ˆλ‹€. (node_modules 폴더 λ¬΄μ‹œ, dist 디렉토리 ν•˜μœ„μ˜ λͺ¨λ“  λ‚΄μš© λ¬΄μ‹œ)
    3. node_modules dist/*
      c. κΉƒν—ˆλΈŒμ—μ„œ μ—°κ²°ν•  λ ˆν¬μ§€ν† λ¦¬λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
      d. ν„°λ―Έλ„μ—μ„œ λ ˆν¬μ§€ν† λ¦¬μ™€ ν”„λ‘œμ νŠΈ 폴더λ₯Ό μ—°κ²°ν•©λ‹ˆλ‹€.
      git branch -m main (-m : move) git remote add origin "레포 μ£Όμ†Œ" git add . git commit -m "first commit" git push -u origin main
Β 
  1. 이제 κΉƒκ³Ό ν”„λ‘œμ νŠΈκ°€ μ—°κ²°λ˜μ—ˆμŠ΅λ‹ˆλ‹€. κΉƒμ˜ 정보λ₯Ό μ›ΉνŒ©μœΌλ‘œ λ„˜κΈ°λŠ” 방법을 μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.
    1. ν„°λ―Έλ„μ—μ„œ κΉƒ λͺ…λ Ήμ–΄λ₯Ό 톡해 μ—¬λŸ¬ 정보λ₯Ό 확인 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    2. git rev-parse --short HEAD git config user.name
b. 이런 터미널 λͺ…λ Ήμ–΄λ₯Ό μ›ΉνŒ©μ—μ„œλ„ μ‚¬μš©ν•  수 μžˆλ„λ‘ λͺ¨λ“ˆμ„ μΆ”κ°€ν•©λ‹ˆλ‹€.
const childProcess = require('child_process');
c. λ°°λ„ˆμ— 터미널 μ½”λ“œλ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.
commit version : ${childProcess.execSync('git rev-parse --short HEAD')} committer : ${childProcess.execSync('git config user.name')}
d. λ‹€μ‹œ λΉŒλ“œν•΄λ΄…μ‹œλ‹€!
Β 

2. DefinePlugin

λ””νŒŒμΈ ν”ŒλŸ¬κ·ΈμΈμ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” μ „μ—­ μƒμˆ˜λ₯Ό λ§Œλ“€μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. λ…Έλ“œμ˜ ν™˜κ²½μ •λ³΄λ₯Ό μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— 전달해주고 μ‹Άμ„λ•Œ 많이 μ‚¬μš©ν•©λ‹ˆλ‹€. λ””νŒŒμΈ ν”ŒλŸ¬κ·ΈμΈλ„ μ›ΉνŒ©μ—μ„œ 기본으둜 μ œκ³΅ν•˜λŠ” ν”ŒλŸ¬κ·ΈμΈμž…λ‹ˆλ‹€.
Β 
λ°”λ‘œ ν”ŒλŸ¬κ·ΈμΈμ— μΆ”κ°€ν•΄λ΄…μ‹œλ‹€!
new webpack.DefinePlugin({ pw: 123456 }),
Β 
Β 

3. HtmlWebpackPlugin

Html νŒŒμΌμ„ λ²ˆλ“€λ§ λ‹¨κ³„μ—μ„œ 컨트둀 ν•  수 μžˆλ„λ‘ λ„μ™€μ£ΌλŠ” ν”ŒλŸ¬κ·ΈμΈ μž…λ‹ˆλ‹€.
Β 
  1. ν”ŒλŸ¬κ·ΈμΈμ„ μ„€μΉ˜ν•©λ‹ˆλ‹€.
npm install html-webpack-plugin
Β 
  1. webpack.config.js νŒŒμΌμ— html-webpack-plugin ν”ŒλŸ¬κ·ΈμΈ λͺ¨λ“ˆμ„ λΆˆλŸ¬μ˜΅λ‹ˆλ‹€.
const HtmlWebpackPlugin = require('html-webpack-plugin');
Β 
  1. λ²ˆλ“€λ§ λ•Œ μ²˜λ¦¬ν•˜κ³ μž ν•˜λŠ” html νŒŒμΌμ„ src ν΄λ”λ‘œ μ΄λ™μ‹œν‚΅λ‹ˆλ‹€.
Β 
  1. webpack.config.js νŒŒμΌμ— ν”ŒλŸ¬κ·ΈμΈκ³Ό νƒ€κ²Ÿ html 파일의 경둜λ₯Ό λ“±λ‘ν•©λ‹ˆλ‹€.
new HtmlWebpackPlugin({ template: './src/index.html', // λͺ©ν‘œ html 파일의 μœ„μΉ˜μž…λ‹ˆλ‹€. })
Β 
  1. npm run build! 이제 λ²ˆλ“€λ§ λ‹¨κ³„μ—μ„œ html 이 μ²˜λ¦¬κ°€ λ˜λŠ”κ²ƒμ„ 확인 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
Β 

<λ―Έλ‹ˆ ν”„λ‘œμ νŠΈ>

개발 ν™˜κ²½μ— λ”°λ₯Έ HTML κ²½λŸ‰ν™”(minify) λ²ˆλ“€λ§ν•˜κΈ°!
Β 
  1. webpack.config.js 파일의 HtmlWebpackPlugin 객체에 λ‹€μŒμ˜ μ½”λ“œλ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.
minify: { collapseWhitespace: true, removeComments: true, }
collapseWhitespace : 곡백을 λͺ¨λ‘ μ œκ±°ν•©λ‹ˆλ‹€.
removeComments : 주석을 λͺ¨λ‘ μ œκ±°ν•©λ‹ˆλ‹€.
Β 
  1. λ‹€μ‹œ λΉŒλ“œν•˜μ—¬ 결과물을 ν™•μΈν•©λ‹ˆλ‹€. 잘 압좕이 λ˜μ–΄ μžˆλŠ” λͺ¨μŠ΅μ„ 확인 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ κ°œλ°œν™˜κ²½μ—μ„œλ„ 이런 λͺ¨μŠ΅μ΄λΌλ©΄ μœ μ§€λ³΄μˆ˜ν•˜κΈ° 맀우 μ–΄λ €μšΈκ²λ‹ˆλ‹€. ν”„λ‘œλ•μ…˜ ν™˜κ²½μ—μ„œλ§Œ κ²½λŸ‰ν™”λ˜λ„λ‘ μ„€μ •ν•΄λ΄…μ‹œλ‹€!
Β 
  1. webpack.config.js 파일의 HtmlWebpackPlugin 객체에 minify 뢀뢄을 μˆ˜μ •ν•΄λ΄…μ‹œλ‹€.
minify: process.env.NODE_ENV === 'production' ? { collapseWhitespace: true, removeComments: true, } : false
Β 
  1. process.env.NODE_ENV λŠ” λ…Έλ“œ ν™˜κ²½ 정보λ₯Ό μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μœΌλ‘œ 전달 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. app.js νŒŒμΌμ—μ„œ console.log(process.env.NODE_ENV) 둜 확인해 λ΄…μ‹œλ‹€.
Β 
  1. ν•˜μ§€λ§Œ process.env.NODE_ENV 값을 아직 webpack.config.js μ—μ„œλŠ” μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€. μ΄λŠ” webpack5 λ²„μ „μœΌλ‘œ μ˜€λ©΄μ„œ 달라진 점으둜 λ³΄μž…λ‹ˆλ‹€.
Β 
  1. μš΄μ˜μ²΄μ œλ‚˜ ν”Œλž«νΌμ— μ’…μ†λ˜μ§€ μ•Šκ³  λ™μΌν•œ λ°©λ²•μœΌλ‘œ env λ³€μˆ˜λ₯Ό μ£Όμž…ν•΄μ£ΌλŠ” νŒ¨ν‚€μ§€μΈ cross-env λ₯Ό μ„€μΉ˜ν•΄λ΄…μ‹œλ‹€.
npm install cross-env
** cross-env μ„€μΉ˜ 주의!! ** (https://www.boannews.com/media/view.asp?idx=56184&skind=O)
Β 
Β 
  1. μ„€μΉ˜κ°€ μ™„λ£Œλ˜λ©΄ 이제 λΉŒλ“œν•  λ•Œ λͺ…λ Ήμ–΄λ₯Ό development 와 production 두가지 λͺ¨λ“œλ₯Ό 지원할 수 μžˆμŠ΅λ‹ˆλ‹€. package.json νŒŒμΌμ„ μˆ˜μ • ν•΄λ΄…μ‹œλ‹€.
"build": "cross-env NODE_ENV=development webpack --progress", "build:pro": "cross-env NODE_ENV=production webpack --progress"
Β 
  1. 이제 λΉŒλ“œ μ‹œ 두 κ°€μ§€ λͺ¨λ“œλ‘œ λΉŒλ“œκ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€. production λΉŒλ“œ μ‹œ 결과물이 잘 λ²ˆλ“€λ§ λ˜λŠ”μ§€ 확인 ν•΄λ΄…μ‹œλ‹€.
Β