Học tối ưu bundle React với tree shaking cho năm 2025
Đợt vừa rồi mình có support làm cải thiện performance cho 1 dự án Dự án đó dùng React nhưng bundle nặng tới 2MB vì chưa tối ưu tốt, làm thời gian tải chậm đáng kể. Sau khi áp dụng tối ưu bundle React với kỹ thuật tree shaking React, mình đã giảm được gần 70% kích thước – và team mừng rơn luôn! Nếu bạn là một frontend developer muốn nổi bật trong năm 2025, đây là kỹ năng bạn cần nắm. Cùng mình chia sẻ kinh nghiệm chi tiết nhé, biết đâu bạn sẽ tìm ra cách áp dụng cho dự án của mình!
1. Tại sao tối ưu bundle lại quan trọng?
Hãy nghĩ xem, bạn có thích ngồi chờ một trang web load mãi không? Chắc là không đâu! Năm 2025, người dùng ngày càng khó tính, họ muốn mọi thứ nhanh như điện xẹt. Và Google thì cứ “ưu ái” những trang nhẹ nhàng để đẩy lên top. Mình thấy tối ưu bundle React không chỉ là kỹ thuật mà còn là cách giữ khách hàng và nâng cao uy tín team.
Lần điều tra dự án kia, mình phát hiện họ nhập nguyên cả thư viện Lodash (~70KB) dù chỉ dùng vài hàm như _.debounce
. Kết quả? Trang load chậm, và sếp cũng bắt đầu hỏi han. Một bundle nặng có thể:
- Làm chậm thời gian tải: 2MB có thể mất 5-7 giây trên mạng 4G, trong khi bundle tối ưu chỉ mất 1-2 giây.
- Đuổi khách hàng: 40% người dùng bỏ đi nếu trang không load trong 3 giây – con số này làm mình giật mình!
- Tăng chi phí: Bundle lớn tốn băng thông, và hosting không rẻ, nhất là với dự án lớn.
Nếu bạn muốn làm một frontend developer được trọng dụng, bắt đầu với tối ưu bundle React là bước đi thông minh đấy!
2. Tree Shaking là gì, nghe có vẻ lạ?
Lúc đầu, mình cũng hơi ngạc nhiên khi nghe đến tree shaking React. Tưởng là thuật ngữ gì đó liên quan cây cối, hóa ra nó là cách “lắc” code để bỏ đi phần không cần thiết! Nói dễ hiểu, đây là kỹ thuật giúp bạn chỉ giữ lại những đoạn mã mình dùng, loại bỏ code thừa trong bundle.
Cách nó hoạt động thì đơn giản: Khi build dự án với Webpack hay Vite, công cụ sẽ “quét” mã nguồn, thấy cái gì không được gọi thì xóa đi. Nhưng nhớ nha, nó chỉ hiệu quả với module ES6 (import
và export
), chứ kiểu CommonJS (require
) thì chịu thua.
Ví dụ nhé, mình có file math.js
như này:
export function add(a, b) { return a + b; } export function subtract(a, b) { return a - b; } export function multiply(a, b) { return a * b; }
Rồi trong App.js
, chỉ dùng hàm add
:
import { add } from './math.js'; console.log(add(2, 3)); // 5
Khi build, tree shaking tự động bỏ subtract
và multiply
. Nghe tưởng đơn giản, nhưng với dự án lớn, nó giúp tiết kiệm cả đống tài nguyên đấy!
3. Thực hành tree shaking với ví dụ dễ hiểu
Làm senior, mình thích chia sẻ kinh nghiệm thực tế hơn là lý thuyết suông. Hãy cùng thử áp dụng tree shaking React với vài ví dụ từ dự án mình từng xử lý nhé.
3.1. Tối ưu với Ant Design
Dự án mình điều tra dùng Ant Design để làm giao diện, nhưng ban đầu họ nhập nguyên cả thư viện:
import { Button, Table, Modal, Input } from 'antd';
Kết quả? Bundle nặng gần 650KB, và mình biết ngay vấn đề nằm ở đây. Mình đề xuất nhập chọn lọc:
import Button from 'antd/es/button'; import Table from 'antd/es/table'; import Modal from 'antd/es/modal'; import Input from 'antd/es/input';
Bundle giảm còn khoảng 150KB – nhẹ hơn hẳn! Để team dễ quản lý, mình gợi ý tạo file chung:
// utils/antdComponents.js export { default as Button } from 'antd/es/button'; export { default as Table } from 'antd/es/table'; export { default as Modal } from 'antd/es/modal'; export { default as Input } from 'antd/es/input';
// App.js import { Button, Table, Modal, Input } from './utils/antdComponents';
Team áp dụng xong, ai cũng bất ngờ vì tốc độ load tăng lên rõ rệt!
3.2. Tối ưu Lodash
Một lần khác, mình thấy họ dùng Lodash trong phần tìm kiếm. Ban đầu là:
import _ from 'lodash'; const debouncedSearch = _.debounce((query) => console.log(query), 500);
Bundle tăng ~70KB, dù chỉ cần debounce
. Mình đề xuất đổi thành:
import debounce from 'lodash/debounce'; const debouncedSearch = debounce((query) => console.log(query), 500);
Chỉ còn ~2KB – tiết kiệm gần như hoàn toàn! Với dự án lớn, mình tính sơ sơ cũng giảm được kha khá chi phí băng thông.
3.3. Lazy Loading Component
Dự án kia có một dashboard nặng, mình gợi ý lazy load:
const Dashboard = React.lazy(() => import('./components/Dashboard')); function App() { return (Đang tải...