Skip to content

Webpack

jch422 edited this page Dec 19, 2020 · 6 revisions

πŸ“Œ Webpack μ΄λž€?

  • λͺ¨λ“ˆ λ²ˆλ“€λŸ¬(Module Bundler)
    • λͺ¨λ“ˆ: ν”„λ‘œκ·Έλž˜λ° κ΄€μ μ—μ„œ νŠΉμ • κΈ°λŠ₯을 κ°–λŠ” μž‘μ€ μ½”λ“œ λ‹¨μœ„
    • λ²ˆλ“€λŸ¬: μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ΅¬μ„±ν•˜λŠ” μžμ›(HTML, CSS, Javscript, Images λ“±)을 λͺ¨λ‘ 각각의 λͺ¨λ“ˆλ‘œ 보고 이λ₯Ό μ‘°ν•©ν•΄μ„œ λ³‘ν•©λœ ν•˜λ‚˜μ˜ 결과물을 λ§Œλ“œλŠ” 도ꡬ

πŸ“Œ μ›ΉνŒ©μœΌλ‘œ ν•΄κ²°ν•˜κ³ μž ν•˜λŠ” 문제

  • μžλ°”μŠ€ν¬λ¦½νŠΈ λ³€μˆ˜ 유효 λ²”μœ„
  • λΈŒλΌμš°μ €λ³„ HTTP μš”μ²­ 숫자의 μ œμ•½
  • μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” μ½”λ“œμ˜ 관리
  • Dynamic Loading & Lazy Loading 미지원
    • μ›ΉνŒ©μ˜ Code Splitting κΈ°λŠ₯을 μ΄μš©ν•˜μ—¬ μ›ν•˜λŠ” λͺ¨λ“ˆμ„ μ›ν•˜λŠ” 타이밍에 λ‘œλ”©ν•  수 μžˆλ‹€.

πŸ“Œ μ›ΉνŒ©μ˜ 4κ°€μ§€ μ£Όμš” 속성

  • entry

    • μ›Ή μžμ›μ„ λ³€ν™˜ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ 졜초 μ§„μž…μ μ΄μž μžλ°”μŠ€ν¬λ¦½νŠΈ 파일 경둜
    •   module.exports = {
          entry: './src/index.js'
        }
      
    • entry 속성에 μ§€μ •λœ νŒŒμΌμ—λŠ” μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ „λ°˜μ μΈ ꡬ쑰와 λ‚΄μš©μ΄ 담겨져 μžˆμ–΄μ•Ό ν•œλ‹€.
  • output

    • μ›ΉνŒ©μ„ 돌리고 λ‚œ 결과물의 파일 경둜
    •   const path = require('path');
      
        module.exports = {
          output: {
            filename: 'bundle.js',
            path: path.resolve(__dirname, './dist')
          }
        }
      
    • filename: μ›ΉνŒ©μœΌλ‘œ λΉŒλ“œν•œ 파일의 이름
    • path: ν•΄λ‹Ή 파일의 경둜λ₯Ό 의미
  • loader

    • μ›ΉνŒ©μ΄ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ 해석할 λ•Œ μžλ°”μŠ€ν¬λ¦½νŠΈ 파일이 μ•„λ‹Œ μ›Ή μžμ›(HTML, CSS, Images, 폰트 λ“±)듀을 λ³€ν™˜ν•  수 μžˆλ„λ‘ λ„μ™€μ£ΌλŠ” 속성
    •   module.exports = {
          module: {
            rules: [
                {
                    test: /\.css$/,
                    use: ['css-loader']
                }
            ]
          }
        }
      
    • test : λ‘œλ”λ₯Ό μ μš©ν•  파일 μœ ν˜•
    • use : ν•΄λ‹Ή νŒŒμΌμ— μ μš©ν•  λ‘œλ”μ˜ 이름
    • λ‘œλ” 적용 μˆœμ„œ: 였λ₯Έμͺ½μ—μ„œ μ™Όμͺ½ 순으둜 적용됩
    • 자주 μ‚¬μš©λ˜λŠ” λ‘œλ”
      • babel Loader
      • css-Loader
      • file-Loader
  • plugin

    • μ›ΉνŒ©μ˜ 기본적인 λ™μž‘μ— 좔가적인 κΈ°λŠ₯을 μ œκ³΅ν•˜λŠ” 속성
    • loaderλŠ” νŒŒμΌμ„ ν•΄μ„ν•˜κ³  λ³€ν™˜ν•˜λŠ” 과정에 κ΄€μ—¬ν•˜λŠ” 반면, plugin은 ν•΄λ‹Ή 결과물의 ν˜•νƒœλ₯Ό λ°”κΎΈλŠ” 역할을 ν•œλ‹€
    •   var webpack = require('webpack');
        var HtmlWebpackPlugin = require('html-webpack-plugin');
      
        module.exports = {
          plugins: [
            new HtmlWebpackPlugin(),
            new webpack.ProgressPlugin()
          ]
        }   
      
    • HtmlWebpackPlugin : μ›ΉνŒ©μœΌλ‘œ λΉŒλ“œν•œ 결과물둜 HTML νŒŒμΌμ„ μƒμ„±ν•΄μ£ΌλŠ” ν”ŒλŸ¬κ·ΈμΈ
    • ProgressPlugin : μ›ΉνŒ©μ˜ λΉŒλ“œ μ§„ν–‰μœ¨μ„ ν‘œμ‹œν•΄μ£ΌλŠ” ν”ŒλŸ¬κ·ΈμΈ

πŸ“Œ μš”μ•½

  • Entry 속성은 μ›ΉνŒ©μ„ μ‹€ν–‰ν•  λŒ€μƒ 파일. μ§„μž…μ 
  • Output 속성은 μ›ΉνŒ©μ˜ 결과물에 λŒ€ν•œ 정보λ₯Ό μž…λ ₯ν•˜λŠ” 속성. 일반적으둜 filenameκ³Ό pathλ₯Ό μ •μ˜
  • Loader 속성은 CSS, 이미지와 같은 λΉ„ μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμΌμ„ μ›ΉνŒ©μ΄ 인식할 수 있게 μΆ”κ°€ν•˜λŠ” 속성. λ‘œλ”λŠ” 였λ₯Έμͺ½μ—μ„œ μ™Όμͺ½ 순으둜 적용
  • Plugin 속성은 μ›ΉνŒ©μœΌλ‘œ λ³€ν™˜ν•œ νŒŒμΌμ— 좔가적인 κΈ°λŠ₯을 λ”ν•˜κ³  싢을 λ•Œ μ‚¬μš©ν•˜λŠ” 속성. μ›ΉνŒ© λ³€ν™˜ κ³Όμ • μ „λ°˜μ— λŒ€ν•œ μ œμ–΄κΆŒμ„ κ°–κ³  있음

πŸ“Œ μ›ΉνŒ© μ‹€ν–‰ λͺ¨λ“œ - mode

  • μ›ΉνŒ© 버전 4λΆ€ν„° modeλΌλŠ” κ°œλ…μ΄ μΆ”κ°€

    • none : λͺ¨λ“œ μ„€μ • μ•ˆν•¨
    • development : 개발 λͺ¨λ“œ
    • production : 배포 λͺ¨λ“œ(default
  • development mode인 κ²½μš°μ—λŠ” κ°œλ°œμžλ“€μ΄ μ’€ 더 보기 νŽΈν•˜κ²Œ μ›ΉνŒ© λ‘œκ·Έλ‚˜ 결과물이 보여지고, production mode인 κ²½μš°μ—λŠ” μ„±λŠ₯ μ΅œμ ν™”λ₯Ό μœ„ν•΄ 기본적인 파일 μ••μΆ• λ“±μ˜ λΉŒλ“œ 과정이 μΆ”κ°€λ©λ‹ˆλ‹€.

πŸ“Œ μ†ŒμŠ€ λ§΅ - devtool

  • 배포용으둜 λΉŒλ“œν•œ 파일과 원본 νŒŒμΌμ„ μ„œλ‘œ μ—°κ²°μ‹œμΌœμ£ΌλŠ” κΈ°λŠ₯

  • λ²ˆλ“€ 파일의 νŠΉμ • λΆ€λΆ„(주둜 μ—λŸ¬κ°€ λ°œμƒν•œ λΆ€λΆ„)이 원본 μ†ŒμŠ€μ˜ μ–΄λ–€ 뢀뢄인지 ν™•μΈν•˜κ³  싢을 λ•Œ 유용

  •   module.exports = {
        devtool: 'cheap-eval-source-map'
      }
    
  • μ†ŒμŠ€ λ§΅ μ„€μ • μ˜΅μ…˜ λΉ„κ΅ν‘œ

  • πŸ“Œ Advanced

    • file loader vs url loader

      • url-loader은 이미지 νŒŒμΌμ„ base-64둜 λ³€ν™˜ν•˜μ—¬ 이미지 νŒŒμΌμ„ λ²ˆλ“€ νŒŒμΌμ— 포함 μ‹œν‚€λŠ” κΈ°λŠ₯을 κ°€μ§€κ³  μžˆλ‹€.
      • 이미지 νŒŒμΌμ„ λ²ˆλ“€ νŒŒμΌμ— 포함 μ‹œν‚΄μœΌλ‘œμ¨ 파일 μš”μ²­ 횟수λ₯Ό 쀄일 수 μžˆλ‹€. κ·ΈλŸ¬λ‚˜ 파일이 λ„ˆλ¬΄ 크면 μ•ˆν•˜λŠ”κ²Œ μ’‹λ‹€.
      • https://jeonghwan-kim.github.io/js/2017/05/22/webpack-file-loader.html
    • λ‚˜λ¬΄ 흔듀기(tree shaking)

      • (λ²ˆλ“€μ‹œ) λΆˆν•„μš”ν•œ μ½”λ“œλ₯Ό μ œκ±°ν•΄ μ£ΌλŠ” κΈ°λŠ₯
      • 기본적으둜 제곡 λ˜μ–΄ μžˆλ‹€
      //util.js
      export const func1 = () => {
        console.log('func1');
      }
      export const func2 = () => {
        console.log('func2')
      }
      //use.js
      import { func1 } from ./util.js
      func1();
      • μœ„ μ½”λ“œ λ²ˆλ“€μ‹œμ— func2λŠ” λ²ˆλ“€μ— μ•ˆλ“€μ–΄κ°€ μžˆλ‹€.(treeshaking)
      • tree shaking μ‹€νŒ¨ ν•˜λŠ” 경우
        • μ‚¬μš©λ˜λŠ” λͺ¨λ“ˆμ΄ ESM이 μ•„λ‹Œ 경우
        • μ‚¬μš©ν•˜λŠ” μͺ½μ—μ„œ ESM이 μ•„λ‹Œ λ‹€λ₯Έ λͺ¨λ“ˆ μ‹œμŠ€ν…œμ„ μ‚¬μš©ν•˜λŠ” 경우
        • 동적 μž„ν¬νŠΈλ₯Ό μ‚¬μš©ν•˜λŠ” 경우
      • μ™ΈλΆ€ νŒ¨ν‚€μ§€ tree shaking
      //잘λͺ»λœ 예
      import { fill } from 'lodash'
      //잘 μ‚¬μš©ν•œ 예
      import fill from 'lodash/fill'
    • μ½”λ“œ λΆ„ν• 

      • λ²ˆλ“€μ„ μž‘κ²Œ λΆ„ν• ν•΄μ„œ μ‚¬μš©.
      • κ·Έλ•Œκ·Έλ•Œ ν•„μš”ν•œ μ½”λ“œκ°€ λ“€μ–΄κ°€ μžˆλŠ” λ²ˆλ“€λ§Œ μ‚¬μš©
      • λΆˆν•„μš”ν•œ μ½”λ“œκΉŒμ§€ 전솑 λ˜λŠ”κ²ƒμ„ λ°©μ§€
      • μž‘κ²Œ λΆ„ν• ν•˜μ—¬ νŽ˜μ΄μ§€ λ Œλ”λ§ μ΅œμ†Œν™”
    • ProvidePlugin

      • μ„€μ •ν•œ λͺ¨λ“ˆμ„ μžλ™μœΌλ‘œ 등둝 ν•΄μ€€λ‹€.
      new webpack.ProvidePlugin({
          React: 'react'
      })
      • μœ„ μ½”λ“œλ₯Ό μ‚¬μš©μ‹œ Reactλ₯Ό μžλ™μœΌλ‘œ 등둝 ν•΄μ€ŒμœΌλ‘œμ¨ 맀번 import React from 'react'λ₯Ό μ“Έ ν•„μš”κ±° μ—†μ–΄μ§„λ‹€.

Clone this wiki locally