jtwjs Dev Wiki
  • DEV_ROAD
    • ๐Ÿ’ช๐Ÿป ์ƒ์กดํ•˜๊ธฐ
    • Week 1
      • ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ธํŒ…
      • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ
      • ๋ฆฌ์—‘ํŠธ
      • Testing Library
      • Parcel & ESLint
    • Week 2
      • JSX
      • Virtual DOM
    • Week 3
      • React Component
      • React State
    • Week 4
      • Express
      • Fetch API & CORS
      • React Hook
      • useRef & Custom Hook
    • Week 5
      • TDD
      • React Testing Library
      • MSW
      • Playwrite
      • Snapshot
    • Week 6
      • Separtion of Concerns
      • Principle
      • DI, (Dependency Injection)
      • Reflect-metadata
      • TSyringe
      • External Store
      • Follow Redux
      • usestore-ts
      • useSyncExternalStore
    • Week 7
      • Routing
      • Routes
      • Router
      • Navigation
    • Week 8
      • Design System
      • Style Basics
      • CSS-in-JS
      • Styled-Components
      • Global Style & Theme
    • Week 9
      • ๊ฐœ๋ฐœํ•˜๊ธฐ ์ „ ์ค€๋น„
      • ์ƒํ’ˆ ๋ชฉ๋ก ํŽ˜์ด์ง€
      • ์ƒํ’ˆ ์ƒ์„ธ ํŽ˜์ด์ง€
      • ์žฅ๋ฐ”๊ตฌ๋‹ˆ ํŽ˜์ด์ง€
    • Week 10
      • ๋กœ๊ทธ์ธ
      • ๋กœ๊ทธ์•„์›ƒ
      • ํšŒ์›๊ฐ€์ž…
      • ์ฃผ๋ฌธ ๋ชฉ๋ก & ์ฃผ๋ฌธ ์ƒ์„ธ
    • Week 11
      • ๋ฐฐ์†ก ์ •๋ณด ์ž…๋ ฅ
      • ํฌํŠธ์› ๊ฒฐ์ œ ์š”์ฒญ
      • ๋ฐฐ์†ก ๋ฐ ๊ฒฐ์ œ ์ •๋ณด ์ „๋‹ฌ
    • Week 12
      • ๊ด€๋ฆฌ์ž ์›น์‚ฌ์ดํŠธ๊ฐœ๋ฐœ์‹œ์ž‘
  • DEV_NOTE
    • TypeScript
      • ๊ธฐ๋ณธ์  ๋ฌธ๋ฒ•
        • Enum
        • ๋‹คํ˜•์„ฑ
          • Untitled
        • ๊ตฌ์กฐ์  ํƒ€์ดํ•‘
        • ์ œ๋„ˆ๋ฆญ ํƒ€์ž…
        • ์ปจ๋””์…”๋„ ํƒ€์ž…
        • ํ•จ์ˆ˜ ๋ฉ”์„œ๋“œ ํƒ€์ดํ•‘
        • infer๋กœ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ์ถ”๋ก  ์ง์ ‘ ํ™œ์šฉ
        • ์žฌ๊ท€ ํƒ€์ž…
        • ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด ํƒ€์ž…
        • ์ถ”๊ฐ€์ ์ธ ํƒ€์ž… ๊ฒ€์‚ฌ satisfies ์—ฐ์‚ฐ์ž
        • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๊ฑด๋ง์ฆ
        • ์›์‹œ ์ž๋ฃŒํ˜•์—๋„ ๋ธŒ๋žœ๋”ฉ ๊ธฐ๋ฒ• ์‚ฌ์šฉ ๊ฐ€๋Šฅ
        • ํƒ€์ž… ์ขํžˆ๊ธฐ
        • ์œ ์šฉํ•œ ํƒ€์ž… ๋งŒ๋“ค๊ธฐ
        • ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜
        • ์•ฐ๋น„์–ธํŠธ ์„ ์–ธ๋„ ์„ ์–ธ ๋ณ‘ํ•ฉ์ด ๋œ๋‹ค.
        • ์•ฐ๋น„์–ธํŠธ ์„ ์–ธ๋„ ์„ ์–ธ๋ณ‘ํ•ฉ์ด ๋œ๋‹ค.
    • Testing
      • Unit Testing
      • ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์˜ ๋‘ ๋ถ„ํŒŒ
      • ์ข‹์€ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” 4๋Œ€ ์š”์†Œ
      • ํ…Œ์ŠคํŠธ ๋Œ€์—ญ๊ณผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ๋™์ž‘
      • ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์Šคํƒ€์ผ
      • ๊ฐ€์น˜ ์žˆ๋Š” ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ๋ฆฌํŒฉํ† ๋ง
      • ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ
      • Cross Browsing Testing
      • ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ ์ข…๋ฅ˜
      • React Testing Pattern
      • ํ”„๋ก ํŠธ์—”๋“œ ํ…Œ์ŠคํŠธ ์ž…๋ฌธ
        • ํ…Œ์ŠคํŠธ ๋ฒ”์œ„
        • ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๊ฒ€์ฆ
        • Mock
        • UI ์ปดํฌ๋„ŒํŠธ ํ…Œ์ŠคํŠธ
        • ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€
        • ์›น ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ
        • MSW
        • ์Šคํ† ๋ฆฌ๋ถ
        • ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ
        • E2E ํ…Œ์ŠคํŠธ
        • Github Actions ์„ค์ •
        • ๊นƒํ—ˆ๋ธŒ ์•ก์…˜์—์„œ E2E
      • ์‹œํ”„ํŠธ ๋ ˆํ”„ํŠธ
        • ํ…Œ์ŠคํŠธ ๊ธฐ๋ณธ์ค‘์˜ ๊ธฐ๋ณธ
        • ๋‹จ์œ„ ํ…Œ์ŠคํŠธ
        • ์ฝ”๋“œ ๋ณต์žก๋„
        • ๋ฆฌํŒฉํ„ฐ๋ง
        • ์ฝ”๋“œ ๋ฆฌ๋ทฐ
        • ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ํŒจํ„ด
        • ์‹œ์Šคํ…œ ํ…Œ์ŠคํŠธ์˜ ์ž๋™ํ™”
        • ํƒ์ƒ‰์  ํ…Œ์ŠคํŠธ
      • Test Tip
      • vitest
      • playwright
      • Test Data Generator
      • MSW
    • Algorithm
      • coding test
      • Data Structure
    • Next.js
      • Data Fetching
      • Hydration
      • Next 13
      • Optimization
      • Next 15
    • Tailwind
      • Tailwind CSS
      • Theme
      • Directives
      • Tool
      • Design System
    • Storybook
      • Storybook
      • CSF3
      • CDD
      • Headless Component
    • Funtional Programming
      • ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ
      • ์ฐธ์กฐ ํˆฌ๋ช…์„ฑ
      • ๋ถ€์ˆ˜ํšจ๊ณผ
      • ํ•จ์ˆ˜ ํ•ฉ์„ฑ
      • ์ œ๋„ˆ๋ฆญ ํƒ€์ž… ํ™œ์šฉํ•˜๊ธฐ
      • ์•”๋ฌต์  ์ž…์ถœ๋ ฅ
      • ์•ก์…˜๊ณผ ๊ณ„์‚ฐ, ๋ฐ์ดํ„ฐ
      • ๊ณ„์ธตํ˜• ์„ค๊ณ„
      • ํ˜ธ์ถœ ๊ทธ๋ž˜ํ”„
      • ํ•จ์ˆ˜ํ˜• ์„ค๊ณ„
      • ๋ถˆ๋ณ€์„ฑ
      • ์ผ๊ธ‰ ํ•จ์ˆ˜
      • ํ•จ์ˆ˜ํ˜• ๋„๊ตฌ
    • Git
      • Github Actions
      • Conflict
      • Branch ์ „๋žต
    • Contents Format
      • Audio
    • 3D Graphic
      • 3D keyword
      • Three.js
      • Geometry
      • Material
      • Light
      • Camera
      • Decal
      • Rotation
      • Text
      • Shadow
      • Fog
      • Post Processing
      • Animation
      • Math
        • Vector Space
        • ๋ฒกํ„ฐ์˜ ์—ฐ์‚ฐ
        • ํšŒ์ „ ๊ณ„์‚ฐ
      • 3D ์ปจํ…์ธ ๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ณผ์ •
      • R3F
      • Env
      • Scene
      • Transform
      • R3F
      • Interaction & Raycast
      • Rendering Algorithnm
      • Blender
      • Blender
    • Accessibility
      • ์ ‘๊ทผ์„ฑ์ด๋ž€
    • Interactive Web
      • Parallax
      • Canvas
      • requestAnimationFrame
      • Effect
      • HSL
      • React.js + Canvas
      • Matter.js
    • AWS
      • DevOps
      • Amplify
      • S3
      • ํด๋ผ์šฐ๋“œ ์ปดํ“จํŒ…
        • ์˜จํ”„๋ ˆ๋ฏธ์Šค์™€ ํด๋ผ์šฐ๋“œ
        • ํด๋ผ์šฐ๋“œ ๋„์ž…ํšจ๊ณผ
        • ํด๋ผ์šฐ๋“œ ์ปดํ“จํŒ…์˜ ๋ฒ”์œ„
        • ์ปดํ“จํŒ… ์˜ต์…˜
          • EC2 - Virtual Machin
          • ECS, EKS - Container
          • Lambda - Serverless
        • ๋„คํŠธ์›Œํฌ ๊ฐ€์ƒํ™”
        • ์Šคํ† ๋ฆฌ์ง€
        • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
        • ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘
        • ๋จธ์‹  ๋Ÿฌ๋‹ ์˜์—ญ
        • IoT ์˜์—ญ
        • ๋ธ”๋ก์ฒด์ธ ์˜์—ญ
      • ํด๋ผ์šฐ๋“œ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„
    • Network
      • Web Server & WAS
    • System Design
      • System Design
      • Component
      • ์˜์กด์„ฑ์„ ๋ฐฐ์ œํ•œ ๊ฐœ๋ฐœ
      • Error Handling
      • Architecture
        • ๋ชจ๋…ธ๋กœํ‹ฑ ์•„ํ‚คํ…์ฒ˜
        • Clean Architecture
        • Layered Architecture
        • ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜
      • ์ƒํ™ฉ์„ ํŒŒ์•…ํ•˜๋Š” ๋ฉ”ํƒ€์ธ์ง€
      • ์ค‘๋ณต ๋ฌธ์ œ ํ•ด๊ฒฐํ•˜๊ธฐ
      • Monorepo Arhitecture
        • ๋ชจ๋…ธ๋ ˆํฌ ์šด์˜๊ณผ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…
        • Module Federation
      • ์ฝ”๋“œ ๋ณ‘๋ชฉ์ง€์ 
      • API ๋Œ€์‘
      • ๊ณตํ†ต ์ฝ”๋“œ
      • Infra ๊ตฌ์ถ•
      • ๋ชจ๋“ˆ ๊ธฐ๋ฐ˜์˜ ๊ฐœ๋ฐœ ๋ฐฉ์‹
      • Design System
        • ์ตœ์†Œ ์ˆ˜์ค€์˜ ์•„ํ‚คํ…์ฒ˜ ์„ค์ •
        • ๋” ํšจ์œจ์ ์ธ ๋””์ž์ธ์‹œ์Šคํ…œ ๋งŒ๋“ค๊ธฐ
        • ๋””์ž์ธ ์‹œ์Šคํ…œ๊ณผ UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ชฉ์ 
        • ๋””์ž์ธ ํ† ํฐ
      • ํšจ์œจ์ ์ธ ์—…๋ฌด
        • ์—…๋ฌด ํ”„๋กœ์„ธ์Šค ๋ณ‘๋ชฉ ํŒŒ์•…
      • Clean Code
      • Design Pattern
        • CQRS Pattern
        • Strangler Fig Pattern
        • ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด
        • ์ปค๋งจ๋“œ ํŒจํ„ด
        • ์ „๋žต ํŒจํ„ด
        • ์˜ต์ €๋ฒ„ ํŒจํ„ด
      • A/B ํ…Œ์ŠคํŒ…
      • ๋Œ€๊ทœ๋ชจ ๋ฆฌ์—‘ํŠธ ์›น์•ฑ ๊ฐœ๋ฐœ
        • ๋ณต์žก์„ฑ ๊ด€๋ฆฌ
        • ๋ชจ๋“ˆ์„ฑ
        • ์„ฑ๋Šฅ
        • ๋””์ž์ธ ์‹œ์Šคํ…œ
        • ๋ฐ์ดํ„ฐ ํŒจ์นญ
        • ์ƒํƒœ ๊ด€๋ฆฌ
        • ๊ตญ์ œํ™”
        • ์ฝ”๋“œ ์กฐ์งํ™”ํ•˜๊ธฐ
        • ๊ฐœ์ธํ™” A/B ํ…Œ์ŠคํŒ…
        • ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์›น ์•„ํ‚คํ…์ฒ˜
        • ํ…Œ์ŠคํŒ…
        • ํˆด๋ง
        • ๊ธฐ์ˆ ์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜
        • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ
        • ๋ผ์šฐํŒ…
        • ์‚ฌ์šฉ์ž ์ค‘์‹ฌ API ๋””์ž์ธ
        • ๋ฆฌ์•กํŠธ ๋ฏธ๋ž˜
    • Performance
      • React DevTools
      • Component ์ตœ์ ํ™”
      • Page Load
      • API
    • MFA
      • MSA
      • MFA ๋„์ž…ํ•˜๊ธฐ
      • Monorepo
        • Monorepo Tool
        • Yarn Berry Workspace
        • Turborepo
      • MFA Composition
      • SPA ํ†ตํ•ฉ
      • Design System
      • Package Manager
        • Yarn
        • pnpm
      • Transpiler & Bundler
        • Babel
        • Rollup
        • esbuild
        • swc
        • Webpack
        • Vite
      • ๋ถ„ํ•ด์™€ ํ†ตํ•ฉ์„ ์œ„ํ•œ ์—ฌ๋Ÿฌ ๊ธฐ์ˆ  ๋น„๊ต
    • State Management
      • Zustand
    • React v18
      • Automatic batching
      • Suspense
      • Transition
    • SEO
      • Search Engine Optimization
      • Open Graph Element
      • Metadata
    • FE Develop
      • Scrubbing
      • Clipboard
    • Refactoring
      • ๋ฆฌํŒฉํ† ๋ง ๊นŠ๊ฒŒ ๋“ค์—ฌ๋‹ค๋ณด๊ธฐ
      • ๊ธด ์ฝ”๋“œ ์กฐ๊ฐ๋‚ด๊ธฐ
      • ํƒ€์ž… ์ฝ”๋“œ ์ฒ˜๋ฆฌํ•˜๊ธฐ
      • ์œ ์‚ฌํ•œ ์ฝ”๋“œ ์œตํ•ฉํ•˜๊ธฐ
      • ๋ฐ์ดํ„ฐ ๋ณดํ˜ธ
      • ์ฝ”๋“œ ์ถ”๊ฐ€ ๋ฐ ์ œ๊ฑฐ
    • OAuth 2.0
    • Analytics
      • Mixpanel
    • ETC
      • VSCode
    • React Hook In Action
      • useContext & Provider
      • ์ปค์Šคํ…€ ํ›…
      • ์ฝ”๋“œ ๋ถ„ํ• ํ•˜๊ธฐ with Suspense, lazy
      • Suspense์™€ ์ด๋ฏธ์ง€ ์ ์žฌํ•˜๊ธฐ
      • useTransition, uesDeferredValue
      • SuspenseList
Powered by GitBook
On this page
  • Webpack
  • Why webpack
  • Entry
  • Output
  • Loaders
  • Plugins
  • Mode
  1. DEV_NOTE
  2. MFA
  3. Transpiler & Bundler

Webpack

Webpack

  • ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ€์žฅ ์˜ค๋ž˜์ „๋ถ€ํ„ฐ ์‚ฌ์šฉ๋œ ๋ฒˆ๋“ค๋Ÿฌ์ด์ž ํ˜„์žฌ๊นŒ์ง€๋„ ๊ฐ€์žฅ ์•ˆ์ •์ ์ธ ๋ฒˆ๋“ค๋Ÿฌ

  • ๋‹ค๋ฅธ ์‹ ๊ทœ ๋ฒˆ๋“ค๋Ÿฌ๋“ค๋„ ์›นํŒฉ์„ ๊ธฐ์ค€์œผ๋กœ ํ•จ, ๊ฑฐ์˜ ์Šคํƒ ๋‹ค๋“œ

  • ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ์˜ ์„ฑ๋Šฅ ๋ฌธ์ œ๋กœ ์ธํ•ด ๋งŽ์€ ๋‹ค๋ฅธ ๋ฒˆ๋“ค๋Ÿฌ์˜ ๋„์ „์„ ๋ฐ›๊ณ ์žˆ์Œ

    • ์‹ค์ œ ํ”„๋กœ๋•์…˜์˜ ์ตœ์ข… ๊ฒฐ๊ณผ๋ฌผ์€ ๋А๋ฆฌ์ง€ ์•Š๊ณ  ์•ˆ์ •์ ์ž„

  • ์›นํŒฉํŒ€์ด Vercel์— ํ•ฉ๋ฅ˜ํ•˜๋ฉด์„œ Rust ๊ธฐ๋ฐ˜์œผ๋กœ turbopack์ด๋ผ๋Š” ์›นํŒฉ ๋Œ€์ฒดํ’ˆ์„ ๋งŒ๋“ค๊ณ  ์žˆ์Œ

  • Module Federation ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์–ด MFA๋ฅผ ๋„์ž…ํ•œ ํšŒ์‚ฌ๋“ค์€ Webpack์„ ์‚ฌ์šฉํ•จ

Why webpack

๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ, ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด <script> ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์ง€๋ฉด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , <script> ํƒœ๊ทธ๋ฅผ ์ ์ ˆํ•œ ์ˆœ์„œ๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํŒŒ์ผ์ด ๋งŽ์•„์ง€๋ฉด ๋„คํŠธ์›Œํฌ ๋ณ‘๋ชฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์€ ํŒŒ์ผ์„ ํ•ฉ์ณ์„œ ํฐ ํ•˜๋‚˜์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์œ ํšจ ๋ฒ”์œ„, ํฌ๊ธฐ, ๊ฐ€๋…์„ฑ, ์œ ์ง€๋ณด์ˆ˜ ๋“ฑ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด IIFE (Immediately Invoked Function Expression), ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„๋กœ ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํŒŒ์ผ์„ ํ•ฉ์น  ๋•Œ ์œ ํšจ ๋ฒ”์œ„์— ๋Œ€ํ•œ ๊ฑฑ์ • ์—†์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ฐฉ์‹์€ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๊ณ  ์ตœ์ ํ™”ํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Node.js์—์„œ๋Š” CommonJS๋ฅผ ์ฑ„ํƒํ•˜์—ฌ ๋ชจ๋“ˆ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ์ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ CommonJS์—๋Š” ๋ผ์ด๋ธŒ ๋ฐ”์ธ๋”ฉ ์ง€์›์ด ์—†์œผ๋ฉฐ, ์ˆœํ™˜ ์ฐธ์กฐ, ๋™๊ธฐ์ ์ธ ๋ชจ๋“ˆ ํ•ด์„, ๋А๋ฆฐ ๋กœ๋”ฉ ๋“ฑ์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Browserify, RequireJS, SystemJS ๋“ฑ์˜ ๋ฒˆ๋“ค๋Ÿฌ์™€ ํˆด์ด ๋“ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.

ES Module์ด ECMAScript ํ‘œ์ค€์—์„œ ๊ณต์‹ ๊ธฐ๋Šฅ์ด ๋˜์—ˆ์ง€๋งŒ, ์ดˆ๊ธฐ์—๋Š” ๋ธŒ๋ผ์šฐ์ € ์ง€์›์ด ๋ถˆ์™„์ „ํ•˜๊ณ  ๋ฒˆ๋“ค๋ง์ด ์—ฌ์ „ํžˆ ๋” ๋น ๋ฅธ ์ƒํ™ฉ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์•ฑ์„ ๋ฒˆ๋“ค๋กœ ๋ฌถ์„ ์ˆ˜ ์žˆ๋Š” (ESM, CommonJS ๋ชจ๋‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ) ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. webpack์€ ์„ฑ๋Šฅ๊ณผ ๋กœ๋”ฉ ์‹œ๊ฐ„์„ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ๋กœ ๋“ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.

Entry

๋ฒˆ๋“ค๋ง์„ ์‹œ์ž‘ํ•  ์ง„์ž…์ 

์—”ํŠธ๋ฆฌํฌ์ธํŠธ๋Š” ์›นํŒฉ์ด ๋‚ด๋ถ€์˜ ๋””ํŽœ๋˜์‹œ ๊ทธ๋ž˜ํ”„๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ๋ชจ๋“ˆ

  • ์›นํŒฉ์€ ์—”ํŠธ๋ฆฌํฌ์ธํŠธ๊ฐ€ ์ง๊ฐ„์ ‘์ ์œผ๋กœ ์˜์กดํ•˜๋Š” ๋‹ค๋ฅธ ๋ชจ๋“ˆ๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐพ์•„๋‚ธ๋‹ค.

  • ๊ธฐ๋ณธ๊ฐ’์€ src/index ์ด์ง€๋งŒ webpack ์„ค์ •์œผ๋กœ entry ์†์„ฑ์œผ๋กœ ์ปค์Šคํ…€ ๊ฐ€๋Šฅ

const path = require('path');

module.exports = {
  entry: './path/to/my/entry/file.js',
}

Output

์ƒ์„ฑ๋œ ๋ฒˆ๋“ค์„ ๋‚ด๋ณด๋‚ผ ์œ„์น˜์™€ ์ด ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์›นํŒฉ์— ์•Œ๋ ค์ฃผ๋Š” ์—ญํ• 

  • ๊ธฐ๋ณธ ์ถœ๋ ฅ ํŒŒ์ผ์€ ./dist/main.js, ๋กœ ์ƒ์„ฑ๋˜๊ณ  ๊ธฐํƒ€ ํŒŒ์ผ์€ ./dist ๋‚ด๋ถ€์— ์ƒ์„ฑ๋˜๋„๋ก ์„ค์ •๋จ

const path = require('path');

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

__dirname ์ด๋ž€?

  • ๋…ธ๋“œ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์ •๋œ ๊ฐ’

  • webpack.config.js์ด ๋†“์—ฌ์žˆ๋Š” ์œ„์น˜์— ํด๋”๋ฅผ ์˜๋ฏธ

Loaders

  • ์›นํŒฉ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ JSON, JS ํŒŒ์ผ๋งŒ ์ดํ•ดํ•œ๋‹ค.

    • ๊ทธ ์™ธ์— ํŒŒ์ผ ์œ ํ˜•๋“ค์˜ ์ฒ˜๋ฆฌ๋ฅผ ๋กœ๋”์—๊ฒŒ ์œ„์ž„

  • ๋กœ๋”๋ฅผ ์ด์šฉํ•˜๋ฉด ์›นํŒฉ์ด ๋‹ค๋ฅธ ์œ ํ˜•์˜ ํŒŒ์ผ๋“ค์„ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ์›นํŒฉ์ด ์ดํ•ดํ• ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“ˆ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์‚ฌ์šฉ

  • ๋กœ๋”๋Š” ์›นํŒฉ ์„ค์ •์— ๋‘ ๊ฐ€์ง€ ์†์„ฑ์„ ๊ฐ–๋Š”๋‹ค.

    • ๋ณ€ํ™˜์ด ํ•„์š”ํ•œ ์†์„ฑ๋“ค์„ ํŒ๋ณ„ํ•˜๋Š” test (์–ด๋–ค ์ข…๋ฅ˜์˜ ํŒŒ์ผ์„ ์ž„ํฌํŠธํ–ˆ์„ ๋•Œ ์‚ฌ์šฉํ•  ๋กœ๋”์ธ์ง€ ์„ค์ •)

    • ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋กœ๋”๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” use

module.exports = {
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'name.js'
  },
  module: {
  // 'require(), import()๋ฌธ ๋‚ด์—์„œ '.txt'ํŒŒ์ผ๋กœ ํ™•์ธ๋˜๋Š” ๊ฒฝ๋กœ๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด 
  // ๋ฒˆ๋“ค์— ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „ raw-loader๋ฅผ ์‚ฌ์šฉํ•ด ๋ณ€ํ™˜
    rules: [{ test: /\.txt$/, use: 'row-loader'}]
  }
}

Plugins

  • ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ํ™œ์šฉํ•˜์—ฌ ๋ฒˆ๋“ค์„ ์ตœ์ ํ™”ํ•˜๊ฑฐ๋‚˜, ์—์…‹์„ ๊ด€๋ฆฌ, ๋˜๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ฃผ์ž… ๋“ฑ ๊ด‘๋ฒ”์œ„ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰

  • ํ”Œ๋Ÿฌ๊ทธ์ธ์€ require()๋ฅผ ํ†ตํ•ด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์š”์ฒญํ•˜๊ณ  "plugins" ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.

  • ๋Œ€๋ถ€๋ถ„์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์˜ต์…˜์„ ํ†ตํ•ด ์ปค์Šคํ…€ ๊ฐ€๋Šฅ

  • ๋‹ค๋ฅธ ๋ชฉ์ ์œผ๋กœ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์—ฌ๋Ÿฌ๋ฒˆ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ new ์—ฐ์‚ฐ์ž๋กœ ํ˜ธ์ถœํ•˜์—ฌ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•จ

  • html-webpack-plugin ์€ ์ƒ์„ฑ๋œ ๋ชจ๋“  ๋ฒˆ๋“ค์„ ์ž๋™์œผ๋กœ ์‚ฝ์ž…ํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์šฉ HTML์„ ์ƒ์„ฑ

const HtmlWebpackPlugin = require('html-webpack-plugin');
const webpack = require('webpack'); // ๋‚ด์žฅ ํ”Œ๋Ÿฌ๊ทธ์ธ์— ์ ‘๊ทผํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋จ

module.exports = {
  module: {
    rules: [{ test: /\.txt$/, use: 'row-loader'}]
  },
  plugins: [new HtmlWebpackPlugin({ template: './src/index.html' })]
}

Mode

  • mode ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ development, production, ๋˜๋Š” none์„ ์„ค์ •ํ•˜๋ฉด ์›นํŒฉ์— ๋‚ด์žฅ๋œ ํ™˜๊ฒฝ ๋ณ„ ์ตœ์ ํ™”๋ฅผ ํ™œ์„ฑํ™”ํ•จ

  • ๊ธฐ๋ณธ๊ฐ’์€ production

  • development

    • DefinePlugin์˜ process.env.NODE_ENV๋ฅผ development๋กœ ์„ค์ •

    • ๋ชจ๋“ˆ๊ณผ ์ฒญํฌ์— ์œ ์šฉํ•œ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•จ

  • production

    • process.env.NODE_ENV ๋ฅผ production์œผ๋กœ ์„ค์ •

    • ๋ชจ๋“ˆ๊ณผ ์ฒญํฌ, FlagDependencyUsagePlugin, FlagIncludedChunksPlugin, ModuleConcatenationPlugin, NoEmitOnErrorsPlugin, TerserPlugin ๋“ฑ์— ๋Œ€ํ•ด ๊ฒฐ์ •์  ๋ง๊ธ€์ด๋ฆ„ (mangled name)์„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

  • none

    • ๊ธฐ๋ณธ ์ตœ์ ํ™” ์˜ต์…˜์—์„œ ์ œ์™ธ

module.exports = {
  mode: 'proudction'
}

Tree shaking

  • ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ๋ฒˆ๋“ค๋ง์—์„œ ์ œ๊ฑฐ

  • ES Module ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑํ•˜๋ฉด ๊ฐ„ํŽธํ•˜๊ฒŒ Tree Shaking ์„ค์ • ๊ฐ€๋Šฅ

  • lodash๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ require๋ฅผ ์‚ฌ์šฉํ•œ ํŒจํ‚ค์ง€๋กœ Tree shaking์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.

    • lodash-es๋Š” ES Module ๋ฐฉ์‹์œผ๋กœ ์ œ๊ณต

esm์€ ์ •์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ณ  ๋นŒ๋“œ์‹œ์ ์— ๋ถ„์„(import, export๋ฅผ ๋ณด๊ณ  ์˜์กด์„ฑ ๊ด€๊ณ„ ํŒŒ์•…)ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ํŒŒ์•…ํ•ด์„œ ์ œ๊ฑฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

  • require ๊ตฌ๋ฌธ ์ฆ‰, ๋™์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” CJS๋Š” ๋ถ„์„์‹œ์ ์ด ๋Ÿฐํƒ€์ž„์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ํŒŒ์•…ํ•˜๋Š”๊ฒƒ์ด ์–ด๋ ค์›€

Transpiler

  • ์›นํŒฉ์€ ๋ฒˆ๋“ค๋งํ•˜๋Š”๋ฐ ์ง‘์ค‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŠธ๋žœ์ŠคํŒŒ์ผ์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • ๋ฒˆ๋“ค๋ง ์ „ ์ „์ฒ˜๋ฆฌ ์ž‘์—…์œผ๋กœ ๋กœ๋”๋ฅผ ํ†ตํ•ด ํŠธ๋žœ์ŠคํŒŒ์ผ ์ž‘์—…์„ ์ง„ํ–‰

DevServer

  • ์ผ๋ จ์˜ ๋ช…๋ น์–ด๋“ค๋กœ ์ผ์ผ์ด ์ปค๋งจ๋“œ ์ž…๋ ฅํ•˜์—ฌ ์ˆ˜์ •์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ•˜๋Š”๊ฑฐ ๊ท€์ฐฎ์Œ

  • devServer ์„ค์ •์„ ํ†ตํ•ด ์ˆ˜์ •์‚ฌํ•ญ์„ ์•Œ์•„์„œ ๋ฐ˜์˜ํ•˜๋„๋ก ์„ค์ •

    • hot reload replacement

  • webpack-dev-server

  • pnpm exec webpack serve

module.exports = {
  devServer: {
    port: 3000,
    static: {
      directory: path.join(__dirname, "public"),
    },
    compress: true,
  },
}

SourceMap

  • ๋””๋ฒ„๊น…์„ ํ•  ๋•Œ ๋ฒˆ๋“ค๋ง ๊ฒฐ๊ณผ๋ฌผ๋กœ ์•Œ๋ ค์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์‰ฝ์ง€ ์•Š๋‹ค.

  • ์ด๋Ÿด ๋•Œ ์†Œ์Šค๋งต์„ ์„ค์ •ํ•˜์—ฌ ๊ฐœ๋ฐœํ™˜๊ฒฝ์˜ ์ฝ”๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ฒดํฌ ๊ฐ€๋Šฅ

  • Production Mode์ธ ๊ฒฝ์šฐ๋Š” X

module.exports = {
  devtool: "inline-source-map",
}

Serve

// package.json
"script": {
  "dev": "webpack serve",
  "build": "webpack --mode production",
  "start" :"serve dist -p 4000",
}
  • ๊ฐœ๋ฐœ ์„œ๋ฒ„๋Š” public/๊ณผ dist/ ๋ฅผ ์ ์ ˆํžˆ ํ™œ์šฉํ•ด์ฃผ์ง€๋งŒ ๋นŒ๋“œํ•  ๋•Œ๋Š” X

  • ๊ทธ๋ž˜์„œ public/ ํŒŒ์ผ๋“ค์„ dist/๋กœ ์˜ฎ๊ฒจ์ฃผ๋Š” ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค.

  • ์œ„ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์ด copy-webpack-plugin

const path = require("path");
const CopyWebpackPlugin = require("copy-webpack-plugin");

module.exports = {
  plugins: [
    new CopyWebpackPlugin({
      patterns: [{ from: "./public", to: "./" filter: (resourcePath) => {
            return !resourcePath.endsWith("index.html");
          },
       }],
    }),
  ],
};

to ์†์„ฑ์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด output์œผ๋กœ ์ง€์ •๋œ path๋กœ ์นดํ”ผ๋œ๋‹ค.

Env

  • ํ™˜๊ฒฝ๋งˆ๋‹ค ๋‹ค๋ฅธ ์˜ต์…˜์„ ์ง€์ •ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ ๊ฐ์ฒด๋ฅผ ์ต์ŠคํฌํŠธ ํ•˜์ง€๋ง๊ณ  ์„ค์ • ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์ž.

  • ์ฒซ๋ฒˆ์งธ ์ธ์ž๋กœ env, ๋‘๋ฒˆ์งธ ์ธ์ž๋กœ mode ๊ฐ€ ๋“ค์–ด์˜จ๋‹ค.

const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const CopyWebpackPlugin = require("copy-webpack-plugin");

module.exports = (env, { mode }) => ({
  entry: "./src/index.js",
  output: {
    path: path.resolve(__dirname, "dist"),
    filename: "main.js",
  },
  mode: "development",
  module: {
    rules: [
      // {
      //   test: /\.(?:js|mjs|cjs)$/,
      //   use: {
      //     loader: "babel-loader",
      //     options: {
      //       presets: ["@babel/preset-env"],
      //     },
      //   },
      //   exclude: /node_modules/,
      // },
      {
        test: /\.m?js$/,
        exclude: /node_modules/,
        use: {
          loader: "swc-loader",
        },
      },
    ],
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: "./public/index.html",
    }),
    new CopyWebpackPlugin({
      patterns: [
        {
          from: "./public",
          to: "./",
          filter: (resourcePath) => {
            return !resourcePath.endsWith("index.html");
          },
        },
      ],
    }),
  ],
  devServer: {
    static: {
      directory: path.join(__dirname, "public"),
    },
    port: 3000,
    compress: true,
  },
  // ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ์„ค์ • ๋ถ„๊ธฐ
  devtool: mode === 'production' ? false : "inline-source-map",
});
 
PreviousswcNextVite

Last updated 4 months ago