jvinhit//lab

Search posts

Type to search across journal entries.

navigate open esc close

Webpack · Part 1 — The Mental Model & Your First Build

Why bundlers exist, the dependency graph Webpack builds from a single entry, the four core concepts (entry, output, loaders, plugins), and your first real build. With an interactive dependency-graph visualizer.

Webpack mang tiếng đáng sợ, nhưng ý tưởng cốt lõi rất đơn giản. Một khi bạn hình dung được đồ thị phụ thuộc, mọi tùy chọn config sau đó đều hợp lý. Phần này xây mô hình tư duy đó và cho ra một bundle thật.

Bấm play bên dưới để xem Webpack đi từ một file entry qua mọi import vào một bundle:


1. Vì sao có bundler

Trình duyệt từng buộc bạn ship hàng chục thẻ <script> đúng thứ tự, mọi thứ chia chung một global scope. ES module giúp ích, nhưng ship hàng trăm file nhỏ nghĩa là hàng trăm request, và bạn vẫn không thể import CSS, ảnh, hay biến đổi TypeScript/JSX trong trình duyệt.

Một bundler giải quyết điều này: nó đọc các module nguồn, giải quyết mọi phụ thuộc, biến đổi thứ cần biến đổi, và phát ra một số ít file tối ưu trình duyệt tải hiệu quả.


2. Đồ thị phụ thuộc

Đây là ý tưởng duy nhất cần thấm. Webpack bắt đầu ở một file entry và đi theo mọi import (và require) đệ quy, dựng một đồ thị của mọi module ứng dụng chạm tới:

index.js (entry)
├─ app.js
│  ├─ math.js
│  │  └─ utils.js
│  └─ data.json
└─ styles.css

Bất cứ thứ gì không tới được từ entry sẽ không được gồm vào. Đó là nền tảng của tree shaking (Phần 7). Để ý CSS và JSON cũng là node — với Webpack, mọi thứ đều là module.


3. Bốn khái niệm cốt lõi

Mọi thứ trong Webpack đều thuộc một trong số này:

ConceptCâu hỏi nó trả lời
EntryĐồ thị bắt đầu ở đâu?
OutputBundle đi đâu, tên là gì?
LoadersBiến đổi file không phải JS thế nào?
PluginsMóc vào build để làm việc khác thế nào?

Giữ bốn cái này trong đầu và bạn đọc được mọi webpack.config.js.


4. Build đầu tiên

Dựng một project nhỏ:

mkdir webpack-intro && cd webpack-intro
npm init -y
npm install --save-dev webpack webpack-cli

Tạo source:

// src/index.js
import { greet } from "./greet.js";
document.body.innerHTML = greet("Webpack");
// src/greet.js
export function greet(name) {
  return `Hello, ${name}!`;
}

Giờ chạy Webpack không cần config:

npx webpack

Webpack 5 có mặc định hợp lý: entry ./src/index.js, output ./dist/main.js, mode production. Mở dist/main.js và bạn thấy hai module được gộp và minify thành một file.


5. Thêm npm scripts

Đừng gõ npx webpack mãi — gắn scripts:

{
  "scripts": {
    "build": "webpack --mode production",
    "dev": "webpack --mode development --watch"
  }
}

--watch build lại mỗi lần lưu. Phần 5 sẽ nâng cấp lên dev server tự tải lại.


6. Build thực sự làm gì

Chạy trình trực quan trên và xem trình tự: Webpack giải quyết entry, đọc các import, đệ quy giải quyết từng phụ thuộc vào đồ thị, chạy loader trên module không phải JS, rồi đóng gói mọi thứ vào bundle output, áp dụng tối ưu. Mọi phần sau của series chỉ là cấu hình một trong các bước đó.


7. Bài tập

1. Bạn thêm file helper.js nhưng không bao giờ import nó ở đâu. Nó có trong bundle không? Vì sao?

Lời giải

Không — nó không tới được từ entry, nên không thuộc đồ thị phụ thuộc.

2. Không có file config nào, npx webpack tìm entry ở đâu và ghi output ở đâu?

Lời giải

Entry mặc định ./src/index.js, output ./dist/main.js.

3. Vì sao trình duyệt không thể tải thẳng file src/ bằng <script type="module"> và bỏ qua Webpack?

Lời giải

Được với JS thuần, nhưng không với import phi chuẩn (CSS, TS, JSX, ảnh), và ship nhiều file nhỏ thì tốn request và không tối ưu.

Nâng cao:trong trình trực quan, bấm từng module để đọc import của nó, rồi bấm build và xác nhận thứ tự giải quyết khớp một lượt duyệt theo chiều rộng từ entry.


Điểm chính

  • Bundler đọc module, giải quyết phụ thuộc, biến đổi, và phát ra file tối ưu.
  • Webpack dựng đồ thị phụ thuộc từ một entry duy nhất.
  • Với Webpack, mọi thứ là module — JS, CSS, JSON, ảnh.
  • Bốn khái niệm cốt lõi là entry, output, loader, plugin.
  • Webpack 5 build không cần config nhờ mặc định hợp lý.

Tiếp theo

Phần 2 — Giải phẫu config: webpack.config.js từ đầu — mode, entry, output, context, và resolve — biến phép màu zero-config thành cấu hình tường minh, dễ đọc bạn kiểm soát.