Họ đang đo gì
Bạn có biết công cụ nào chỉ ra cái gì đang nặng không, và có phân biệt được bundle với thứ thật sự được tải.
Trả lời ngắn~30 giây
Chạy bundle analyzer trước — bao giờ cũng có bất ngờ. Bốn hướng theo thứ tự hiệu quả: bỏ hoặc thay thư viện nặng (moment, lodash toàn bộ, một thư viện icon nhập cả bộ), chia code theo route và theo tương tác, kiểm tra tree shaking có thật sự chạy không, và cuối cùng mới tới nén. Nhưng con số đáng quan tâm không phải tổng bundle mà là JavaScript tải trong đường tới hiển thị đầu tiên — 2MB chia thành 20 chunk lười tải khác hẳn 2MB trong một file.
Giải thích sâu
Về thư viện, ba thủ phạm quen mặt: moment.js kéo theo toàn bộ locale (thay bằng date-fns hoặc Intl có sẵn trong trình duyệt), import _ from 'lodash' kéo cả thư viện thay vì một hàm, và các bộ icon nhập kiểu import { Icon } from 'lib' mà thư viện không có tree shaking. Kiểm tra nhanh: xem package.json của thư viện có "sideEffects": false và có bản ESM không — thiếu một trong hai là tree shaking gần như không làm được gì.
Chia code hiệu quả nhất theo hai trục. Theo route là hiển nhiên: trang thanh toán không cần code của trang quản trị. Theo TƯƠNG TÁC thì ít người làm hơn mà lợi ích lớn: trình soạn thảo rich text, thư viện biểu đồ, bản đồ — tất cả đều nạp được lúc người dùng bấm mở, không phải lúc tải trang. Một biểu đồ nặng 300KB mà 90% người dùng không cuộn tới là 300KB tải vô ích.
Điều cần cẩn thận là chia quá nhỏ cũng có giá: mỗi chunk là một request, và với HTTP/2 thì rẻ hơn nhưng không miễn phí — vẫn có chi phí phân tích và chi phí xử lý phụ thuộc. Ngưỡng thực dụng là đừng tạo chunk dưới khoảng 20KB; gộp những cái nhỏ lại thường nhanh hơn tách ra.
Câu hỏi tiếp theo họ sẽ hỏi
?Kích thước nào là đủ tốt?
Không có con số phổ quát, nhưng một mốc hay được dùng là dưới 170KB nén cho đường tới hiển thị đầu tiên, tương ứng khoảng vài giây trên mạng 3G chậm. Quan trọng hơn con số là đặt ngân sách trong CI để nó không lặng lẽ phình ra.
Trả lời thế này là mất điểm
- Cắt bundle mà không đo lại thời gian tải thật. Nhỏ hơn không tự động nghĩa là nhanh hơn với người dùng.