/webpack-tutorial

πŸ“–μ›ΉνŒ©μ— λŒ€ν•œ νŠœν† λ¦¬μ–Όμž…λ‹ˆλ‹€.

Primary LanguageJavaScript

πŸ“– μ›ΉνŒ© νŠœν† λ¦¬μ–Ό

μ›ΉνŒ© νŠœν† λ¦¬μ–Όμ„ μž‘μ„±ν•©λ‹ˆλ‹€. μ²˜μŒμ— μ›ΉνŒ©μ„ 처음 μ ‘ν–ˆμ„ λ•Œ μ–΄λ €μ› λ˜ 뢀뢄듀을 ν•˜λ‚˜μ”© 체크해보며 κ°œλ…λ“€μ„ 짚고 λ„˜μ–΄κ°‘λ‹ˆλ‹€. 이 μ €μž₯μ†ŒλŠ” λ³΄μΌλŸ¬ν”Œλ ˆμ΄νŠΈλ‘œ μ΄μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. :)

πŸš€ λͺ©ν‘œ

κ°€λ³κ²Œ μ›ΉνŒ©μ„€μ •μ„ ν•˜λ©° μ›ΉνŒ©μ˜ μ£Όμš” κ°œλ…μ„ μ•Œμ•„λ³΄κ³  λΉŒλ“œμ™€ κ°œλ°œμ„œλ²„κΉŒμ§€ μ„€μ •ν•˜λŠ” 방법을 μ΅νžˆλŠ”κ²ƒμ„ λͺ©ν‘œλ‘œ ν•©λ‹ˆλ‹€. μΆ”κ°€μ μœΌλ‘œ ES6 μ΄μƒμ˜ 문법듀을 ES5둜 λ³€ν™˜ν•˜μ—¬ μž‘λ™μ΄ μ •μƒμ μœΌλ‘œ λ˜λŠ”μ§€ ν™•μΈν•΄λ΄…λ‹ˆλ‹€.

πŸ“ λͺ©μ°¨

μ›ΉνŒ©μ— κ΄€ν•˜μ—¬

μ›ΉνŒ© μ„€μ •ν•˜κΈ°


μ›ΉνŒ©μ— κ΄€ν•˜μ—¬

μ›ΉνŒ©μ΄λž€ 무엇인지 μ•Œμ•„λ³΄κ³  μ›ΉνŒ©μ˜ 4가지 μ£Όμš”κ°œλ…λ“€μ„ μ•Œμ•„λ΄…λ‹ˆλ‹€.

μ›ΉνŒ©μ΄λž€?

μ›ΉνŒ©μ΄λž€ λͺ¨λ“ˆ λ²ˆλ“€λŸ¬μž…λ‹ˆλ‹€.
λͺ¨λ“ˆ(Module) μ΄λž€ κ΅¬ν˜„ 세뢀사항을 μΊ‘μŠν™”ν•˜κ³  곡개 APIλ₯Ό λ…ΈμΆœν•˜μ—¬ λ‹€λ₯Έ μ½”λ“œμ—μ„œ μ‰½κ²Œ λ‘œλ“œν•˜κ³  μ‚¬μš©ν•  수 μžˆλ„λ‘ μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ½”λ“œμ‘°κ°μž…λ‹ˆλ‹€.
λ²ˆλ“€(Bundle) μ΄λž€ μ†Œν”„νŠΈμ›¨μ–΄ 및 일뢀 ν•˜λ“œμ›¨μ–΄μ™€ ν•¨κ»˜ μž‘λ™ν•˜λŠ”λ° ν•„μš”ν•œ λͺ¨λ“ κ²ƒμ„ ν¬ν•¨ν•˜λŠ” νŒ¨ν‚€μ§€ μž…λ‹ˆλ‹€.

λͺ¨λ“ˆλ²ˆλ“€λŸ¬ λž€ μš°λ¦¬κ°€ λ§Œλ“€λ €λŠ” 'ν”„λ‘œμ νŠΈ'에 ν•„μš”ν•œ λͺ¨λ“  μ½”λ“œμ‘°κ°(λͺ¨λ“ˆ)듀을 ν¬ν•¨μ‹œμΌœμ£ΌλŠ” λ„κ΅¬μž…λ‹ˆλ‹€.

μ›ΉνŒ© 은 ν”„λ‘œμ νŠΈμ— ν•„μš”ν•œ λͺ¨λ“  μ˜μ‘΄μ„±νŒŒμΌλ“€μ„ ν•˜λ‚˜μ˜ λ²ˆλ“€νŒŒμΌλ‘œ λ§Œλ“€μ–΄ μ£Όμ–΄ λ°°ν¬ν•˜κΈ° μ‰½κ²Œ λΉŒλ“œν•΄μ£ΌλŠ” λ„κ΅¬μž…λ‹ˆλ‹€.

λͺ¨λ“ˆλ²ˆλ“€λŸ¬μ— λŒ€ν•œ μžμ„Έν•œ 글은 μžλ°”μŠ€ν¬λ¦½νŠΈ λͺ¨λ“ˆ, λͺ¨λ“ˆ 포맷, λͺ¨λ“ˆ λ‘œλ”μ™€ λͺ¨λ“ˆ λ²ˆλ“€λŸ¬μ— λŒ€ν•œ 10λΆ„ μž…λ¬Έμ„œ λ₯Ό μ½μ–΄λ³΄μ‹œκΈ° λ°”λžλ‹ˆλ‹€.

μ›ΉνŒ©μ˜ 4가지 μ£Όμš”κ°œλ…

μ›ΉνŒ©μ—μ„œ λΉŒλ“œλ₯Ό ν•  λ•Œ μ£Όμš”κ°œλ…μ΄ 크게 4가지가 μ‘΄μž¬ν•©λ‹ˆλ‹€. 각각을 λ‹¨κ³„μ μœΌλ‘œ μ•Œμ•„λ³΄κ³  λ‹€μŒ μŠ€ν…μ—μ„œ μ‹€μ œλ‘œ 섀정을 ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

  • entry
  • module
  • plugins
  • output

1단계 : entry

ν”„λ‘œμ νŠΈκ°€ κ΅¬λ™λ˜κΈ° μœ„ν•΄μ„œλŠ” λ‹€μ–‘ν•œ μ˜μ‘΄μ„±νŒŒμΌ(λͺ¨λ“ˆ)λ“€(js, html, css, img λ“±)이 μ‘΄μž¬ν•˜λŠ”λ° 이λ₯Ό 톡해 μ˜μ‘΄μ„±κ·Έλž˜ν”„κ°€ 생기기 λ§ˆλ ¨μž…λ‹ˆλ‹€. μ˜μ‘΄μ„± κ·Έλž˜ν”„μ˜ μ‹œμž‘μ μ΄ λ˜λŠ” 뢀뢄이 entry 이며 보톡 main.js λ˜λŠ” index.js 라고 μ„€μ •ν•©λ‹ˆλ‹€.

2단계 : module

λ‹€μ–‘ν•œ λͺ¨λ“ˆλ“€μ€ 각각의 νŒŒμΌμœ ν˜•μ„ κ°–κ²Œλ©λ‹ˆλ‹€. 이 λ‹¨κ³„μ—μ„œλŠ” 각 λͺ¨λ“ˆλ“€μ„ λͺ¨λ“ˆμœ ν˜•μ— 따라 μ–΄λ–»κ²Œ μ²˜λ¦¬ν• μ§€λ₯Ό μ„€μ •ν•΄μ€λ‹ˆλ‹€. μœ ν˜•λ“€μ€ λ‘œλ” λΌλŠ”κ²ƒμ„ 톡해 μ²˜λ¦¬λ˜μ–΄ μ΅œμ’…μ μœΌλ‘œ js 파일둜 λ§Œλ“€μ–΄μ§‘λ‹ˆλ‹€.

3단계 : plugins

2λ‹¨κ³„μ˜ 과정을 거치게되면 js 파일이 λ‚˜μ˜€κ²Œλ©λ‹ˆλ‹€. ν•΄λ‹Ή js νŒŒμΌμ„ κ·ΈλŒ€λ‘œ μ“Έ μˆ˜λ„ μžˆμ§€λ§Œ μ΅œμ†Œν™”(minify), λ‚œλ…ν™”(uglify) 같은 κΈ°λŠ₯듀을 μ΄μš©ν•  수 μžˆλŠ” μž¬μ •λ ¨λ‹¨κ³„λΌκ³  λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

4단계 : output

3λ‹¨κ³„κΉŒμ§€ λλ‚˜κ²Œλ˜λ©΄ 이름 κ·ΈλŒ€λ‘œ 좜λ ₯μž…λ‹ˆλ‹€. μ΅œμ’…μ μœΌλ‘œ λ²ˆλ“€λ§λ˜μ–΄ λ‚˜μ˜¬ νŒŒμΌμ— λŒ€ν•œ νŒŒμΌμ΄λ¦„, κ²½λ‘œκ°™μ€ 것듀을 지정해 쀄 수 μžˆμŠ΅λ‹ˆλ‹€.


μ›ΉνŒ© μ„€μ •ν•˜κΈ°

μ›ΉνŒ©μ΄ 무엇인지, μ–΄λ–€ 컨셉을 μž‘κ³ μžˆλŠ”μ§€μ— λŒ€ν•΄ μ‚΄νŽ΄λ΄€μŠ΅λ‹ˆλ‹€. 이 λ‹¨κ³„μ—μ„œλŠ” μ‹€μ œλ‘œ μ–΄λ–»κ²Œ μ›ΉνŒ©μ„ κ΅¬μ„±ν•˜λŠ”μ§€μ— λŒ€ν•΄ μ‹€μŠ΅μ„ ν•©λ‹ˆλ‹€.

μ€€λΉ„λ¬Ό

  • λ§ˆμŒκ°€μ§
  • npm

1단계 : ν”„λ‘œμ νŠΈ μ΄ˆκΈ°ν™”

λ¨Όμ € ν”„λ‘œμ νŠΈκ°€ 될 폴더λ₯Ό λ§Œλ“€κ³  μ΄ˆκΈ°ν™” μ‹œμΌœμ€λ‹ˆλ‹€.

$mkdir my-project
$cd my-project
$npm init

$npm init 을 μž…λ ₯ν•˜μ˜€μœΌλ©΄ λ‹€μŒκ³Ό 같은 화면을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
package name: (webpack-tutorial)
version: (1.0.0)
description: webpack-tutorial
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC)

뭐 계속 μ—”ν„° μΉ˜μ…”λ„ 상관 μ—†μŠ΅λ‹ˆλ‹€λ§Œ μ€‘μš”ν•œκ±° λͺ‡ 개만 짚고 λ„˜μ–΄κ°€μžλ©΄

  • package name : νŒ¨ν‚€μ§€ 이름
  • version : νŒ¨ν‚€μ§€ 버젼
  • description : μ„€λͺ…
  • entry point: μ‹œμž‘μ 

μ—¬κΈ°κΉŒμ§€ μ˜€μ…¨μœΌλ©΄ package.json μ΄λΌλŠ” 파일이 ν”„λ‘œμ νŠΈ 폴더에 생성이 λ˜λŠ”κ²ƒμ„ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

package.json μ΄λž€?
κ°„λ‹¨νžˆ μš°λ¦¬κ°€ λ§Œλ“€ νŒ¨ν‚€μ§€(ν”„λ‘œμ νŠΈ λ˜λŠ” μ•±)에 λŒ€ν•œ μ„€λͺ…μ„œμ™€ 같은 νŒŒμΌμž…λ‹ˆλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ λ‹€μŒ 글을 톡해 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

2단계 : ν•„μš”ν•œ λͺ¨λ“ˆλ“€ μ„€μΉ˜ν•˜κΈ°

우리의 ν”„λ‘œμ νŠΈμ˜ λͺ©ν‘œλŠ” κ°„λ‹¨ν•©λ‹ˆλ‹€.

  • λΉŒλ“œν•˜κΈ°
  • 개발 μ„œλ²„ 열어보기
  • ES6 λ₯Ό ES5둜 λ³€ν™˜ν•˜κΈ°

그럼 ν•„μš”ν•œ 각 λͺ¨λ“ˆλ“€μ„ μ„€μΉ˜ν•©λ‹ˆλ‹€.

$npm install -g webpack
$npm install --save-dev webpack@3.11.0 webpack-dev-server@2.11.0
$npm install --save-dev @babel/core @babel/preset-env babel-loader
$npm install --save-dev html-webpack-plugin

λͺ¨λ“ˆ 뒀에 @숫자 λŠ” ν•΄λ‹Ή λͺ¨λ“ˆμ˜ νŠΉμ •λ²„μ Όμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€. webpack은 3.11.0버젼, webpack-dev-server은 2.11.0 버젼을 μ„€μΉ˜ν•©λ‹ˆλ‹€.
@babel/core 와 @babel/preset-env 에 뢙은 @babel 은 babel 7버젼뢀터 생긴 λ„€μž„μŠ€νŽ˜μ΄μŠ€μž…λ‹ˆλ‹€.

잠깐 λͺ…령어듀을 짚고 λ„˜μ–΄κ°€κ² μŠ΅λ‹ˆλ‹€.

νŒ¨ν‚€μ§€ μ„€μΉ˜ λͺ…λ Ήμ–΄

# μ§€μ—­μ„€μΉ˜ & λ°°ν¬μ„€μΉ˜
$npm install <package name>

# μ „μ—­μ„€μΉ˜
$npm install -g <package name>

# κ°œλ°œμ„€μΉ˜
$npm install --save-dev <package name>

κ°œλ°œμ„€μΉ˜μ™€ λ°°ν¬μ„€μΉ˜

κ°œλ°œμ‹œμ—λ§Œ ν•„μš”ν•œ λͺ¨λ“ˆλ“€μ€ --save-dev μ˜΅μ…˜μ„ 톡해 μ„€μΉ˜ν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œ μ˜΅μ…˜μ„ λΆ™μ—¬μ„œ μ„€μΉ˜ν•œ κ²½μš°μ—λŠ” package.json νŒŒμΌμ— devDependencies의 λͺ©λ‘μ— μΆ”κ°€λ©λ‹ˆλ‹€.

λ°°ν¬μ‹œμ— ν•„μš”ν•œ λͺ¨λ“ˆλ“€μ€ --save μ˜΅μ…˜μ„ 톡해 μ„€μΉ˜λ˜λŠ”λ° μƒλž΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€. package.json νŒŒμΌμ— dependencies의 λͺ©λ‘μ— μΆ”κ°€λ©λ‹ˆλ‹€.

μ§€μ—­μ„€μΉ˜μ™€ μ „μ—­μ„€μΉ˜

지역(local)μ„€μΉ˜μ™€ μ „μ—­(global)μ„€μΉ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€. μ˜΅μ…˜μ„ λ³„λ„λ‘œ μ§€μ •ν•˜μ§€μ•ŠμœΌλ©΄ 기본값은 μ§€μ—­μ„€μΉ˜λ‘œ λ©λ‹ˆλ‹€. 그리고 μ„€μΉ˜λœ λͺ¨λ“ˆλ“€μ€ ν•΄λ‹Ή ν”„λ‘œμ νŠΈ λ‚΄μ˜ node_modules λΌλŠ” 디렉토리에 μ„€μΉ˜λ©λ‹ˆλ‹€. μ§€μ—­μ„€μΉ˜λŠ” ν•΄λ‹Ή ν”„λ‘œμ νŠΈ λ‚΄μ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆλ‹€λŠ” νŠΉμ§•μ΄ μžˆμŠ΅λ‹ˆλ‹€.

μ „μ—­μ„€μΉ˜λŠ” $npm install λͺ…λ Ήμ–΄ 뒀에 -g λΌλŠ” μ˜΅μ…˜μ„ λΆ™μ—¬μ€λ‹ˆλ‹€. μ „μ—­μœΌλ‘œ μ„€μΉ˜λœ 경우 λͺ¨λ“  ν”„λ‘œμ νŠΈμ—μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ „μ—­μœΌλ‘œ μ„€μΉ˜λœ λͺ¨λ“ˆλ“€μ€ 각 OS λ§ˆλ‹€ λ‹€λ¦…λ‹ˆλ‹€.

각 λͺ¨λ“ˆλ“€ μ‚΄νŽ΄λ³΄κΈ°

  • webpack : λͺ¨λ“ˆλ²ˆλ“€λŸ¬
  • webpack-dev-server : 개발 μ‹œ μ‹€μ‹œκ°„ λΉŒλ“œλ₯Ό ν•΄μ€λ‹ˆλ‹€.
  • @babel/core : λ°”λ²¨μ˜ 핡심 파일
  • @babel/preset-env : ES6 μ΄μƒμ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμΌμ„ 각 λΈŒλΌμš°μ €μ— λ§žλŠ” μ½”λ“œλ‘œ λ³€ν™˜μ‹œμΌœμ£ΌλŠ” λͺ¨λ“ˆ
  • babel-loader : μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμΌμ„ μ›ΉνŒ©μ—μ„œ λ²ˆλ“€λ§ν•˜κΈ°μœ„ν•΄ μ‚¬μš©ν•˜λŠ” λ‘œλ”
  • html-webpack-plugin : λ²ˆλ“€λœ νŒŒμΌλ“€μ„ script νƒœκ·Έλ₯Ό 톡해 μΆ”κ°€ν•΄μ€˜μ•Ό ν•˜λŠ”λ° 이λ₯Ό μžλ™μ μœΌλ‘œ ν•΄μ€λ‹ˆλ‹€.

이제 λͺ¨λ“ˆλ“€μ„ μ„€μΉ˜ν–ˆμœΌλ©΄ λ‹€μ‹œ package.json νŒŒμΌμ„ μ‚΄νŽ΄λ΄…λ‹ˆλ‹€.

"devDependencies": {
    "@babel/core": "^7.2.2",
    "@babel/preset-env": "^7.2.3",
    "babel-loader": "^8.0.4",
    "webpack": "^3.11.0",
    "webpack-dev-server": "^2.11.0"
  }

devDependencies 에 μΆ”κ°€λœ λͺ©λ‘λ“€μ΄ λ‚˜μ˜€λŠ”κ²ƒμ„ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

λ‹€λ₯Έ ν”„λ‘œμ νŠΈλ“€μ΄ μ–΄λ–»κ²Œ κ΅¬μ„±λ˜μ–΄μžˆλ‚˜ ν™•μΈν•˜λ €λ©΄ κ°€μž₯λ¨Όμ € package.json νŒŒμΌμ„ μ‚΄νŽ΄λ³΄λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€ :)

3단계 : μ›ΉνŒ© μ„€μ •νŒŒμΌ μž‘μ„±ν•˜κΈ°

이제 μ„€μ •νŒŒμΌμ„ μž‘μ„±ν•΄λ΄…λ‹ˆλ‹€. λ¨Όμ € 루트 디렉토리에 webpack.config.js νŒŒμΌμ„ μƒμ„±ν•©λ‹ˆλ‹€.
이 νŒŒμΌμ€ μ›ΉνŒ©μ˜ 섀정이 λ“€μ–΄μžˆλŠ” νŒŒμΌμž…λ‹ˆλ‹€. 이 섀정을 톡해 μ–΄λ–»κ²Œ λΉŒλ“œν•  것인지에 λŒ€ν•΄ μ»€μŠ€ν„°λ§ˆμ΄μ§• ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ›ΉνŒ©μ˜ 4가지 κ°œλ…μ„ λ– μ˜¬λ¦¬λ©΄ λŒ€λž΅ λ‹€μŒκ³Ό 같은 ν˜•νƒœμž…λ‹ˆλ‹€. plugins λŠ” λ°°μ—΄ν˜•νƒœλ‘œ μž‘μ„±ν•œλ‹€λŠ”κ²ƒμ— μ£Όμ˜ν•˜μ„Έμš”!

// webpack.config.js
module.exports = {
  entry: {

  },
  output: {

  },
  module: {

  },
  plugins: [

  ],
};

λ‹¨κ³„λ³„λ‘œ λ‹€μ‹œ μ μš©ν•΄λ³΄κΈ° 전에 폴더ꡬ쑰λ₯Ό ν•œλ²ˆ 짚고 λ„˜μ–΄κ°€κ² μŠ΅λ‹ˆλ‹€.

폴더ꡬ쑰

my-project
β”œβ”€β”€ node_modules/
β”œβ”€β”€ src/
β”‚   └── index.js
β”œβ”€β”€ package.json
β”œβ”€β”€ package-lock.json
└── webpack.config.js

entry μ„€μ •ν•˜κΈ°

// webpack.config.js
module.exports = {
  entry: {
    bundle: './src/index.js',
  }
  // ...
};

μ˜μ‘΄μ„± κ·Έλž˜ν”„μ˜ μ‹œμž‘μ μ΄ λ˜λŠ” index.js 의 경둜λ₯Ό μž‘μ•„μ€λ‹ˆλ‹€. bundle μ΄λΌλŠ” key둜 μ§€μ •ν•œ μ΄μœ λŠ” λ²ˆλ“€νŒŒμΌμ΄ μ—¬λŸ¬κ°œ μžˆμ„ 경우 μ΄λ ‡κ²Œ key: value ν˜•νƒœλ‘œ μž‘μ„±ν•©λ‹ˆλ‹€. μœ„μ˜ μ½”λ“œλŠ” μ•„λž˜ μ½”λ“œμ™€ λ™μΌν•©λ‹ˆλ‹€.

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

output μ„€μ •ν•˜κΈ°

output 은 좜λ ₯이 될 κ²½λ‘œμ™€ 파일 이름을 μ§€μ •ν•΄μ€λ‹ˆλ‹€.

// webpack.config.js
const path = require('path');

module.exports = {
  entry: {
    bundle: './src/index.js',
  },
  output: {
    filename: '[name].js',
    path: path.join(__dirname, 'dist'),
  },
  // ...
};

λ¨Όμ € filename μ†μ„±μ—λŠ” 좜λ ₯ν•  파일의 이름을 μ„€μ •ν•©λ‹ˆλ‹€. μ—¬λŸ¬κ°œμ˜ λ²ˆλ“€νŒŒμΌμ΄ ν•„μš”ν•œ 경우 [name].js 둜 μž‘μ„±μ„ ν•˜λ©΄ 각 λ²ˆλ“€νŒŒμΌμ˜ 이름에 맞게 좜λ ₯λ©λ‹ˆλ‹€.

path μ—λŠ” λ²ˆλ“€λ§ 될 좜λ ₯파일이 μœ„μΉ˜ν•  경둜λ₯Ό μ •ν•΄μ€λ‹ˆλ‹€. nodejs의 λ‚΄μž₯λͺ¨λ“ˆμΈ path λ₯Ό 읽어듀여 μ‚¬μš©ν•©λ‹ˆλ‹€.

path.resolve 와 path.join λΌλŠ” λ©”μ„œλ“œλŠ” 차이가 μžˆμŠ΅λ‹ˆλ‹€ ν•˜μ§€λ§Œ __dirname 을 μ‚¬μš©ν•˜λ©΄ μ˜λ„ν•˜λŠ” 값을 λ°˜ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. - Jbee λ‹˜μ˜ 글쀑 일뢀 인용

__dirname μ΄λž€?
κ°„λ‹¨νžˆ 말해 ν˜„μž¬ μœ„μΉ˜λ₯Ό κ°€λ¦¬ν‚€λŠ” nodejs 의 μ „μ—­λ³€μˆ˜. μžμ„Έν•œλ‚΄μš©μ€ λ‹€μŒ 글을 μ°Έκ³ ν•˜μ„Έμš”

module μ„€μ •ν•˜κΈ°

// webpack.config.js
const path = require('path');

module.exports = {
  entry: './src/index.js',
  output: {
    filename: '[name].js',
    path: path.join(__dirname, 'dist'),
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        loader: 'babel-loader',
        exclude: '/node_modules/',
        include: path.join(__dirname, 'src'),
      },
    ],
  },
  // ...
};

module μ—μ„œλŠ” rules λΌλŠ” μ†μ„±μœΌλ‘œ ν•œλ²ˆ 더 λ“€μ–΄κ°‘λ‹ˆλ‹€. rules λŠ” κ°μ²΄λ°°μ—΄ν˜•νƒœμž„μ„ μ£Όμ˜ν•˜μ„Έμš”!

κ·œμΉ™λ“€(rules)은 κ°μ²΄ν˜•νƒœλ‘œ μ‘΄μž¬ν•˜λŠ”λ° λ‚΄λΆ€λ₯Ό μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

  • test: λ‘œλ”λ₯Ό μ μš©μ‹œν‚¬ νŒŒμΌλ“€μ— λŒ€ν•΄ μ •κ·œμ‹μœΌλ‘œ ν‘œν˜„. .js νŒŒμΌλ“€μ€ λ‹€μŒ λ‘œλ” μ‚¬μš©
  • loader: λ‘œλ” λͺ…μ‹œ. .js νŒŒμΌμ€ babel-loader λ₯Ό 타고 νŠΈλžœμŠ€νŒŒμΌλ©λ‹ˆλ‹€.
  • exclude: λ‘œλ”κ°€ 싀행될 λ•Œ μ œμ™Έμ‹œν‚¬ νŒŒμΌλ“€μ„ λͺ…μ‹œ, /node_modules/ 에 μ‘΄μž¬ν•˜λŠ” λͺ¨λ“  파일 μ œμ™Έ
  • include: λ‘œλ”κ°€ 싀행될 λ•Œ ν¬ν•¨μ‹œν‚¬ νŒŒμΌλ“€μ„ λͺ…μ‹œ, 'src' 폴더에 μžˆλŠ” λͺ¨λ“  .js 파일 포함

바벨을 μ‚¬μš©ν•  λ•Œ ν•œκ°€μ§€ 더 ν•΄μ€˜μ•Όν•˜λŠ” μž‘μ—…μ΄μžˆλ‹€. ES6 μ΄μƒμ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμΌμ„ ES5 ν˜•νƒœλ‘œ λ°”κΏ”μ£ΌλŠ” 섀정인데, λ£¨νŠΈλ””λ ‰ν† λ¦¬μ— .babelrc λΌλŠ” νŒŒμΌμ„ λ§Œλ“€κ³  λ‹€μŒκ³Ό 같이 μž‘μ„±ν•©λ‹ˆλ‹€.

{
  "presets": ["@babel/preset-env"]
}

plugins μ„€μ •ν•˜κΈ°

ν”ŒλŸ¬κ·ΈμΈμ€ μ—¬λŸ¬κ°€μ§€λ₯Ό μ‚¬μš©ν•  수 μžˆμ§€λ§Œ μ—¬κΈ°μ„œλŠ” html-webpack-plugin 을 μ΄μš©ν•©λ‹ˆλ‹€.

μ΄μš©ν•˜κΈ° 전에 λ£¨νŠΈλ””λ ‰ν† λ¦¬μ— index.html 을 생성해 μž‘μ„±ν•˜μž. ν•΄λ‹Ή νŒŒμΌμ€ body νƒœκ·Έκ°€ λ‹«νžˆλŠ” λΆ€λΆ„ 뒀에 bundle.js λ₯Ό import ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ”κ²ƒμ— 주의λ₯Ό κΈ°μšΈμ—¬μ€λ‹ˆλ‹€.

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Webpack Tutorial</title>
</head>
<body>
    Hello Webpack!
</body>
</html>

이제 html-webpack-plugin 을 톡해 bundle.js λ₯Ό λΉŒλ“œμ‹œμ— μžλ™ import 되게 ν•΄λ΄…λ‹ˆλ‹€.

// webpack.config.js
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  entry: './src/index.js',
  output: {
    filename: '[name].js',
    path: path.join(__dirname, 'dist'),
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        loader: 'babel-loader',
        exclude: '/node_modules/',
        include: path.join(__dirname, 'src'),
      },
    ],
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: path.join(__dirname, 'index.html'),
      filename: 'index.html',
      inject: true,
    }),
  ],
};

html-webpack-plugin 을 가져와 HtmlWebpackPlugin 에 λ‹΄κ³  plugins λ°°μ—΄ μ•ˆμ—μ„œ new λ₯Ό ν•΄μ€€λ‹€. λ‚΄λΆ€λ₯Ό μ‚΄νŽ΄λ³΄μžλ©΄

  • template: 기쑴에 μž‘μ„±ν•œ html 파일이 μžˆλ‹€λ©΄ λΆˆλŸ¬μ˜΅λ‹ˆλ‹€.
  • filename: μ΅œμ’…μ μœΌλ‘œ μž‘μ„±λ  html 파일 μ΄λ¦„μž…λ‹ˆλ‹€. 기본값은 index.html μž…λ‹ˆλ‹€.
  • inject: true 둜 ν•˜λ©΄ μžλ™μ μœΌλ‘œ bundle.js λ₯Ό import ν•΄μ€λ‹ˆλ‹€.

λΉŒλ“œν•΄λ³΄κΈ°

섀정을 λ‹€ν–ˆμœΌλ‹ˆ λΉŒλ“œλ₯΄ ν•΄λ³΄λŠ” λ‹¨κ³„μž…λ‹ˆλ‹€. λΉŒλ“œν•˜κΈ°μ „ 폴더ꡬ쑰λ₯Ό ν™•μΈν•΄λ΄…λ‹ˆλ‹€.

폴더ꡬ쑰

my-project
β”œβ”€β”€ node_modules/
β”œβ”€β”€ src/
β”‚   └── index.js
β”œβ”€β”€ index.html
β”œβ”€β”€ .babelrc
β”œβ”€β”€ package.json
β”œβ”€β”€ package-lock.json
└── webpack.config.js

μ΄λ ‡κ²Œ λ˜μ–΄μžˆλ‹€λ©΄ ν•΄λ‹Ή ν”„λ‘œμ νŠΈμ˜ λ£¨νŠΈλ””λ ‰ν† λ¦¬λ‘œ μ΄λ™ν•˜μ—¬ λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•©λ‹ˆλ‹€.

$webpack --config webpack.config.js

μ„±κ³΅ν–ˆλ‹€λ©΄ built λΌλŠ” 메세지와 ν•¨κ»˜ dist λΌλŠ” 폴더가 μƒμ„±λ˜κ³  κ·Έ μ•ˆμ—λŠ” bundle.js κ°€ μƒμ„±λ˜μ—ˆμŒμ„ ν™•μΈν•©λ‹ˆλ‹€.

λͺ…λ Ήμ–΄ 쀄이기

λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•˜κΈ° λ„ˆλ¬΄ κΈ΄ 것 κ°™μŠ΅λ‹ˆλ‹€. package.json 의 scripts λ₯Ό μ•½κ°„λ§Œ μˆ˜μ •ν•˜μ—¬ νŽΈλ¦¬ν•˜κ²Œ μ΄μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€μŒμ„ μΆ”κ°€ν•΄μ£Όμ„Έμš”.

"scripts": {
    "build": "webpack --config webpack.config.js"
},

그리고 λΉŒλ“œν•©λ‹ˆλ‹€.

$npm run build

# npm run build λŠ” λ‹€μŒκ³Ό 같이 μΉ˜ν™˜λ©λ‹ˆλ‹€.
$webpack --config webpack.config.js

λΉŒλ“œ ν™•μΈν•˜κΈ°

λΉŒλ“œκ°€ μ™„λ£Œλ˜λ©΄ dist 폴더에 bundle.js 와 index.html 이 λΉŒλ“œλœ 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. src/index.js 에 ES6 문법을 μž‘μ„±ν•˜κ³  λ²ˆλ“€λ§λœ 파일과 λΉ„κ΅ν•΄λ΄…λ‹ˆλ‹€.

// src/index.js

class Person {
  constructor() {
    console.log('hello!');
  }
}

new Person();

bundle.js 의 맨 μ•„λž˜λ§Œ μ£Όλͺ©ν•΄λ³΄λ©΄ .js 파일이 babel-loader λ₯Ό 톡해 λ‹€μŒκ³Ό 같이 트랜슀파일 λ˜μ—ˆμŒμ„ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

// dist/bundle.js

// ... μƒλž΅
(function(module, exports) {

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var Person = function Person() {
  _classCallCheck(this, Person);

  console.log('hello!');
};

new Person();

κ°œλ°œμ„œλ²„ 열어보기

λΉŒλ“œλ₯Ό λ§ˆμ³€μŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ 개발 ν•  λ•Œ μ†ŒμŠ€μ½”λ“œ μˆ˜μ •μ„ ν•  λ•Œλ§ˆλ‹€ λΉŒλ“œλ₯Ό ν•˜μ—¬ 확인할 μˆ˜λŠ” μ—†λŠ” λ…Έλ¦‡μž…λ‹ˆλ‹€. κ·Έλž˜μ„œ λ‚΄λΆ€ κ°œλ°œμ„œλ²„λ₯Ό μ—΄κ³  μ†ŒμŠ€μ½”λ“œμ˜ 변경사항을 λ³€κ²½ μ‹œ μžλ™μœΌλ‘œ μ»΄νŒŒμΌν•˜μ—¬ μ˜¬λ €μ£ΌλŠ” webpack-dev-server λ₯Ό μ΄μš©ν•©λ‹ˆλ‹€.

μš°λ¦¬λŠ” λͺ¨λ“ˆμ„ μ„€μΉ˜ν–ˆμœΌλ―€λ‘œ λͺ…λ Ήμ–΄λ§Œ μž…λ ₯ν•˜λ©΄ λ©λ‹ˆλ‹€.

$node_modules/.bin/webpack-dev-server --inline --hot

그러면 λΈŒλΌμš°μ €λ₯Ό μ—΄κ³  localhost:8080 λ₯Ό μž…λ ₯ν•˜λ©΄ Hello Webpack κ³Ό ν•¨κ»˜ μ½˜μ†”μ°½μ—λŠ” hello κ°€ μ°ν˜€μžˆλŠ”κ²ƒμ„ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

λͺ…λ Ήμ–΄ 쀄이기

μœ„μ˜ λͺ…령어도 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€. package.json νŒŒμΌμ„ μ—΄κ³  scripts μ•ˆμ— λ‹€μŒμ„ μΆ”κ°€ν•΄μ€λ‹ˆλ‹€.

"scripts": {
    "build": "webpack --config webpack.config.js",
    "start": "webpack-dev-server --hot --inline"
},

이제 더 νŽΈν•˜κ²Œ μ΄μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

$npm run start

#npm run start λŠ” λ‹€μŒκ³Ό 같이 μΉ˜ν™˜λ©λ‹ˆλ‹€.
$node_modules/.bin/webpack-dev-server --inline --hot

inline, hot μ˜΅μ…˜

webpack-dev-server λ₯Ό μ΄μš©ν•  λ•Œ μ˜΅μ…˜μ„ 쀄 수 μžˆλŠ”λ°
inline μ˜΅μ…˜μ€ 전체 νŽ˜μ΄μ§€ μ‹€μ‹œκ°„ λ‘œλ”©μ΄λ©°,
hot μ˜΅μ…˜μ€ 파일이 μˆ˜μ •λ  경우 κ·Έ 뢀뢄에 λŒ€ν•΄ λ¦¬λ‘œλ“œλ₯Ό ν•΄μ£ΌλŠ” μ˜΅μ…˜

더 μžμ„Έν•œ 사항은 κ³΅μ‹λ¬Έμ„œ μ°Έκ³ 

마무리 μ§€μœΌλ©°

λͺ©ν‘œμ— ν•„μš”ν•œ κ°„λ‹¨ν•œ 섀정듀은 λμ΄λ‚¬μŠ΅λ‹ˆλ‹€. μ›ΉνŒ©μ„ μ»€μŠ€ν„°λ§ˆμ΄μ§• ν•˜λŠ” 방법은 μž…λ§›λ”°λΌ λ‹€λ₯΄κ³  λ‹€μ–‘ν•©λ‹ˆλ‹€. μ μž¬μ μ†Œμ— 맞게 μ„€μ •ν•˜λŠ”κ²ƒμ΄ κ°€μž₯ 쒋은 섀정이 μ•„λ‹κΉŒ μ‹ΆμŠ΅λ‹ˆλ‹€. ν•΄λ‹Ή μ €μž₯μ†Œλ₯Ό boilerplate 처럼 μ‚¬μš©ν•΄λ„ 되고 playground 둜 μ‚¬μš©ν•˜μ…”λ„ λ©λ‹ˆλ‹€. 개인적으둜 이 글을 μž‘μ„±ν•˜λ©° μ›ΉνŒ©μ— λŒ€ν•΄ μ’€ 더 정리가 λ˜μ–΄μ„œ μ–»μ–΄κ°€λŠ”κ²Œ λ§ŽμŠ΅λ‹ˆλ‹€. 잘λͺ»λœ 사항이 μžˆλ‹€λ©΄ ν’€λ¦¬ν€˜ λΆ€νƒλ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€.

μ°Έκ³ λ¬Έν—Œ