Webpack

μΈν”„λŸ° ν”„λ‘ νŠΈμ—”λ“œ 개발자λ₯Ό μœ„ν•œ μ›ΉνŒ© / μž₯기효(μΊ‘ν‹΄νŒκ΅)

μ›ΉνŒ© ν•Έλ“œλΆ

μ›ΉνŒ© κ³΅μ‹λ¬Έμ„œ

Node.js와 NPM

μ›ΉνŒ©μ„ μ‚¬μš©ν•˜κΈ° μœ„ν•΄ Node.js와 NPM이 μ„€μΉ˜λ˜μ–΄ μžˆμ–΄μ•Ό 함 Node.jsλ₯Ό μ„€μΉ˜ν•˜λ©΄ NPM은 ν•¨κ»˜ μ„€μΉ˜κ°€ 됨

Node.js

λΈŒλΌμš°μ € λ°–μ—μ„œλ„ μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό μ‹€ν–‰ν•  수 μžˆλŠ” ν™˜κ²½μ„ 의미

NPM(Node Package Manager)

μžλ°”μŠ€ν¬λ¦½νŠΈ 라이브러리(νŒ¨ν‚€μ§€)λ₯Ό κ΄€λ¦¬ν•΄μ£ΌλŠ” 도ꡬ(jQuery, Tensorflow, express λ“±) 라이브러리λ₯Ό 곡개된 μ €μž₯μ†Œμ— μ˜¬λ €λ†“κ³  npm λͺ…λ Ήμ–΄λ‘œ νŽΈν•˜κ²Œ λ‹€μš΄λ‘œλ“œ 받을 수 있음

  • node -v : λ…Έλ“œ 버전 확인

  • npm -v : NPM 버전 확인

  • npm init [-y] : NPM μ΄ˆκΈ°ν™” λͺ…λ Ήμ–΄(-y κΈ°λ³Έκ°’μœΌλ‘œ package.json파일 생성)

  • npm install [library] (--save-prod) : 라이브러리 μ§€μ—­ μ„€μΉ˜1(node_modules/library/dist/library.js)

  • npm install [library] --save-dev(-D) : 라이브러리 μ§€μ—­ μ„€μΉ˜2(devDependencies둜 관리)

  • npm uninstall [library] : 라이브러리 μ‚­μ œ

  • npm install [library] --global(-g) : 라이브러리 μ‹œμŠ€ν…œ λ ˆλ²¨μ— μ „μ—­(global)으둜 μ„€μΉ˜

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

  • μ§€μ—­ μ„€μΉ˜ : ν•΄λ‹Ή 폴더 λ‚΄μ—μ„œ node_modules 폴더λ₯Ό μƒμ„±ν•˜μ—¬ μ„€μΉ˜

  • μ „μ—­ μ„€μΉ˜ : μ‹œμŠ€ν…œ λ ˆλ²¨μ— μ „μ—­μœΌλ‘œ μ„€μΉ˜ν•˜μ—¬ ν„°λ―Έλ„μ—μ„œ 라이브러리 이름을 μž…λ ₯ν–ˆμ„λ•Œ λͺ…λ Ήμ–΄λ‘œ 인식

NPM을 μ‚¬μš©ν•˜λŠ” 이유

  1. ν”„λ‘œμ νŠΈμ— μ‚¬μš©ν•˜λŠ” package(라이브러리)와 버전 관리

  2. ν•΄λ‹Ή package CDN을 직접 μ°Ύμ•„μ„œ κ°€μ Έμ˜€μ§€ μ•Šκ³  npm install둜 λ°”λ‘œ μ„€μΉ˜ κ°€λŠ₯

  3. λŒ€λΆ€λΆ„μ˜ μ›ΉνŒ© ν”„λ‘œμ νŠΈλŠ” 기본적으둜 npm이 λ™λ°˜λ¨

dependencies와 devDependencies

  • dependencies : npm i [library]

    • μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ ν™”λ©΄λ‘œμ§κ³Ό 직접적 관련이 μžˆλŠ” 라이브러리(ex.jquery, vue, react, angular, chart λ“±)

  • devDependencies : npm i [library] -D

    • κ°œλ°œμ„ ν• λ•Œ 도움을 μ£ΌλŠ” 개발 보쑰 라이브러리(ex.webpack, sass, js-compression λ“±)

배포용 라이브러리 dependencies

  • npm run build 둜 λΉŒλ“œλ₯Ό ν•˜λ©΄ μ΅œμ’… μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œ μ•ˆμ— 포함됨

개발용 라이브러리 devDependencies

  • μ΅œμ’… 배포 μ‹œ ν¬ν•¨λ˜μ§€ μ•ŠμŒ

μ›ΉνŒ© Webpack

ν”„λ‘ νŠΈμ—”λ“œ ν”„λ ˆμž„μ›Œν¬μ—μ„œ κ°€μž₯ 많이 μ‚¬μš©λ˜λŠ” λͺ¨λ“ˆ λ²ˆλ“€λŸ¬(Module Bundler) λͺ¨λ“ˆ λ²ˆλ“€λŸ¬λž€? μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ΅¬μ„±ν•˜λŠ” μžμ›μ„ λͺ¨λ‘ 각각 λͺ¨λ“ˆλ‘œ 보고 μ‘°ν•©ν•΄μ„œ λ³‘ν•©λœ ν•˜λ‚˜μ˜ 결과물을 λ§Œλ“œλŠ” 도ꡬ

  • webpack webpack-cli

  • lodash

  • dist/main.js : μ›ΉνŒ©μœΌλ‘œ κ΅¬μ„±ν•œ κ²°κ³Όλ¬Ό(μ¦‰μ‹œμ‹€ν–‰ν•¨μˆ˜IIFE ꡬ성)

  • μžλ°”μŠ€ν¬λ¦½νŠΈλ§Œμ„ μœ„ν•œ 도ꡬ가 μ•„λ‹Œ 웹을 κ΅¬μ„±ν•˜λŠ” λͺ¨λ“  λ¦¬μ†ŒμŠ€μ— λŒ€ν•œ λ„κ΅¬μž„

  • devtool: 'source-map' : λΉŒλ“œ ν›„ μ›λž˜ 파일둜 μ—°κ²°

λͺ¨λ“ˆ λ²ˆλ“€λ§μ΄λž€?

μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ΅¬μ„±ν•˜λŠ” λͺ‡μ‹­, λͺ‡λ°±κ°œμ˜ μžμ›λ“€μ„ ν•˜λ‚˜μ˜ 파일둜 병합 및 μ••μΆ•ν•΄μ£ΌλŠ” λ™μž‘(λΉŒλ“œ==λ³€ν™˜==λ²ˆλ“€λ§)

λͺ¨λ“ˆ μ΄λž€?

ν”„λ‘œκ·Έλž¨μ—μ„œ νŠΉμ • κΈ°λŠ₯을 κ°–λŠ” μž‘μ€ μ½”λ“œ λ‹¨μœ„λ₯Ό 의미

μ›ΉνŒ©μ˜ λ“±μž₯λ°°κ²½

  1. 파일 λ‹¨μœ„μ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ λͺ¨λ“ˆ 관리

    • νŒŒμΌλ‹¨μœ„λ‘œ μŠ€μ½”ν”„κ°€ κ΅¬λΆ„λ˜μ§€ μ•ŠμŒ(μ „μ—­λ³€μˆ˜)

  2. μ›Ή 개발 μž‘μ—… μžλ™ν™” 도ꡬ

  3. μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λΉ λ₯Έ λ‘œλ”© 속도와 높은 μ„±λŠ₯

    • μ›ΉνŒ©μ€ 기본적으둜 ν•„μš”ν•œ μžμ›μ€ 미리 λ‘œλ”©ν•˜λŠ”κ²Œ μ•„λ‹ˆλΌ κ·Έ λ•Œ κ·Έ λ•Œ μš”μ²­ν•˜μžλŠ” 철학을 κ°–κ³  있음

μ›ΉνŒ©μœΌλ‘œ ν•΄κ²°ν•˜λ €λŠ” 문제

  1. λΈŒλΌμš°μ €λ³„ HTTP μš”μ²­ 숫자의 μ œμ•½

    • TCP μŠ€νŽ™μ— 따라 λΈŒλΌμš°μ €μ—μ„œ ν•œλ²ˆμ— μ„œλ²„λ‘œ 보낼 수 μžˆλŠ” HTTPμš”μ²­ μˆ«μžλŠ” μ œμ•½λ˜μ–΄ 있음

  2. Dynamic Loading & Lazy Loading 미지원

μ›ΉνŒ©μ˜ μ£Όμš”μ†μ„±

  1. mode

    • 버전4 μ΄μƒμ—μ„œ μΆ”κ°€λœ 속성

    • 'none' 'production' 'development'

  2. Entry

    • μ›ΉνŒ©μ—μ„œ μ›Ή μžμ›μ„ λ³€ν™˜ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ 졜초 μ§„μž…μ μ΄μž μžλ°”μŠ€ν¬λ¦½νŠΈ 파일, 경둜

    • μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ „λ°˜μ μΈ ꡬ쑰와 λ‚΄μš©μ΄ λ‹΄κΉ€

  3. Output

    • μ›ΉνŒ©μ„ 돌리고 λ‚œ 결과물의 파일 경둜

    • μ΅œμ†Œν•œ filename은 μ§€μ •ν•΄μ€˜μ•Όν•¨

    • 파일 이름 μ˜΅μ…˜μ— λ§€ λΉŒλ“œμ‹œ 고유 ν•΄μ‹œκ°’μ„ λΆ™μ—¬ μƒˆλ‘œκ³ μΉ¨ν•΄μ•Όν•˜λŠ” 상황을 λ°©μ§€ν•  수 있음

  4. Loader(module)

    • μ›ΉνŒ©μ΄ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ ν•΄μ„ν• λ•Œ μžλ°”μŠ€ν¬λ¦½νŠΈ 파일이 μ•„λ‹Œ μ›Ή μžμ›λ“€μ„ λ³€ν™˜ν•  수 μžˆλ„λ‘ λ„μ™€μ£ΌλŠ” 속성

    {
        test: /\.css$/,
        use: ['style-loader', 'css-loader']
        // λͺ¨λ“  cssνŒŒμΌμ— λŒ€ν•΄ λ‘œλ” 적용
        // rules μ•„λž˜μ— 객체λ₯Ό μΆ”κ°€ν•΄ λ‚˜κ°€λ©΄μ„œ 각 νŒŒμΌλ“€μ— 적용
        // λ‘œλ” μˆœμ„œλ„ 영ν–₯이 있음(였λ₯Έμͺ½μ—μ„œ μ™Όμͺ½μˆœμ„œλ‘œ 적용)
    }
  5. plugin(plugins)

    • μ›ΉνŒ©μ˜ 기본적인 λ™μž‘μ— 좔가적인 κΈ°λŠ₯을 μ œκ³΅ν•˜λŠ” 속성

    • ν”ŒλŸ¬κ·ΈμΈμ€ 결과물의 ν˜•νƒœλ₯Ό λ°”κΎΈλŠ” μ—­ν• 

Webpack Dev Server

μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•˜λŠ” κ³Όμ •μ—μ„œ μœ μš©ν•˜κ²Œ μ“°μ΄λŠ” 도ꡬ μ›ΉνŒ©μ˜ λΉŒλ“œ λŒ€μƒ 파일이 λ³€κ²½ λ˜μ—ˆμ„ λ•Œ μ½”λ“œλ§Œ λ³€κ²½ν•˜κ³  μ €μž₯ν•˜λ©΄ μ›ΉνŒ©μœΌλ‘œ λΉŒλ“œν•œ ν›„ μƒˆλ‘œκ³ μΉ¨ ν•΄μ€Œ μ›ΉνŒ©μ˜ λΉŒλ“œ μ‹œκ°„ λ˜ν•œ μ€„μ—¬μ€Œ

// package.json
"scripts": {
    "dev": "webpack serve",
    "build": "webpack"
}

//webpack.config.js
devServer: {
    port: 9000,
}
  • μ›ΉνŒ© 데브 μ„œλ²„λ‘œ λΉŒλ“œν•œ 결과물은 λ©”λͺ¨λ¦¬μ— μ €μž₯되고 파일둜 μƒμ„±ν•˜μ§€ μ•ŠμŒ(파일 μ‹œμŠ€ν…œμ— λ‚˜μ˜€μ§€ μ•ŠμŒ)

  • μ›ΉνŒ© 데브 μ„œλ²„λŠ” κ°œλ°œν•  λ•Œλ§Œ μ‚¬μš©ν•˜λ‹€κ°€ μ™„λ£Œλ˜λ©΄ μ›ΉνŒ© λͺ…λ Ήμ–΄λ₯Ό μ΄μš©ν•΄ 결과물을 파일둜 생성

  • 컴퓨터 ꡬ쑰 κ΄€μ μ—μ„œ 파일 μž…μΆœλ ₯보닀 λ©”λͺ¨λ¦¬ μž…μΆœλ ₯이 더 λΉ λ₯΄κ³  μžμ›μ΄ 덜 μ†Œλͺ¨λ¨

Last updated