Code Splitting Là Gì?

Code Splitting là kỹ thuật tách file JavaScript lớn thành nhiều file nhỏ hơn, để browser chỉ tải những gì cần thiết khi người dùng mở trang. Thay vì gửi toàn bộ ứng dụng trong một file bundle ngu lìn, bạn chia nhỏ ra và load từng phần theo yêu cầu.
Giải thích đơn giản hơn: tưởng tượng bạn vào nhà hàng và order món ăn. Nếu nhà hàng mang ra hết 50 món trong menu cùng lúc lúc bạn ngồi xuống, chẳng ích gì. Bạn chỉ cần món bạn chọn thôi. Code Splitting làm đúng việc đó cho website.
Tại Sao Code Splitting Quan Trọng?
Khi xây dựng web app hiện đại (React, Vue, Angular), mã nguồn JavaScript của bạn có thể lên đến vài MB. Nếu browser phải tải hết trước khi hiển thị trang, người dùng sẽ phải chờ đợi lâu. Là câu chuyện khiến người dùng nhắm mắt.
Code Splitting giải quyết ba vấn đề chính:
- Giảm thời gian load ban đầu: Browser chỉ tải code cần thiết cho trang hiện tại, không phải cho toàn bộ ứng dụng.
- Tiết kiệm bandwidth: Người dùng không phải tải code của những trang mà họ chưa bao giờ ghé thăm.
- Google yêu thích: Core Web Vitals như LCP (Largest Contentful Paint) cải thiện đáng kể, giúp tăng ranking SEO.
Code Splitting Khác Gì Với Lazy Loading?
Nhiều người nhầm lẫn hai thuật ngữ này. Lazy Loading là kỹ thuật chung để tải tài liệu khi cần thiết. Code Splitting là cách cụ thể để đạt được lazy loading trong JavaScript.
Nói cách khác: Code Splitting là bạn chia bánh ra nhiều miếng. Lazy Loading là bạn quyết định khi nào ăn từng miếng. Bạn cần cả hai để website chạy thật sự nhanh.
Cách Thực Hiện Code Splitting
Trong thực tế, Code Splitting được thực hiện thông qua các build tool như Webpack, Vite, hoặc Turbopack. Cụ thể có ba cách phổ biến:
1. Dynamic Import
Thay vì import file ở đầu file, bạn dùng import() như một hàm để tải code khi cần:
// Thay vì: import HelpModal from './HelpModal'
// Viết như sau:
const handleOpenHelp = async () => {
const HelpModal = (await import('./HelpModal')).default;
// Render modal...
};Khi người dùng click nút “Help”, browser mới bắt đầu tải file HelpModal. Trang chủ vẫn load nhanh vì không phải chờ file này từ đầu.
2. Route-Based Splitting
Cách phổ biến nhất với React và Vue là tách code theo route. Mỗi trang trong ứng dụng sẽ có bundle riêng biệt. React.lazy và Suspense giúp bạn làm việc này dễ dàng:
const Dashboard = React.lazy(() => import('./pages/Dashboard'));
const Settings = React.lazy(() => import('./pages/Settings'));
// Trong component:
<Suspense fallback={<Loading />}>
<Dashboard />
</Suspense>Kết quả: người dùng vào trang Dashboard chỉ tải code của Dashboard. Trang Settings chỉ tải khi họ click vào.
3. Vendor Splitting
Tách code thư viện bên thứ 3 (React, Lodash, Moment.js…) thành file riêng. Vì thư viện ít khi thay đổi, browser sẽ cache file này lại. Khi bạn update code ứng dụng, người dùng không phải tải lại thư viện nữa.
Code Splitting Ảnh Hưởng SEO Như Thế Nào?
Đây là điều nhiều developer bỏ qua. Google Core Web Vitals đánh giá trang web dựa trên ba chỉ số chính: LCP, INP (Interaction to Next Paint), và CLS (Cumulative Layout Shift). Code Splitting tác động trực tiếp vào LCP và INP.
Khi bundle JavaScript nhỏ hơn, browser render trang nhanh hơn. Nội dung chính xuất hiện sớm hơn trên màn hình. LCP giảm xuống. Google đánh giá cao hơn. Đây là lý do Code Splitting không chỉ là vấn đề performance mà còn là vấn đề SEO thực sự.
Theo nghiên cứu của Google, 53% người dùng rời khỏi trang nếu load lâu hơn 3 giây. Code Splitting có thể giúp bạn giảm thời gian load từ 5 giây xuống dưới 2 giây, đặc biệt với ứng dụng lớn.
Lỗi Và Nhược Điểm Cần Lưu Ý
Code Splitting không phải thuốc thần. Nếu làm sai, bạn có thể gây ra nhiều tác hại:
Quá nhiều file nhỏ: Tách quá nhiều thành nhiều file nhỏ cũng không tốt. Browser phải gửi nhiều HTTP requests hơn, và HTTP/2 chỉ giúp được đến một mức nào đó. Nghiên cứu của Web Almanac cho biết giá trị tốt nhất là 200-500KB mỗi chunk.
Waterfall loading: Nếu chunk A phải tải xong mới biết cần tải chunk B, người dùng sẽ chờ đợi đôi lần. Cần sử dụng import() thông minh để dự đoán trước những gì cần thiết.
Khó debug hơn: Khi code nằm rắc rối trong nhiều file, việc debug lỗi trở nên phức tạp hơn. Nhưng dev tools hiện đại đã có hỗ trợ, bạn vẫn cần chú ý.
Quy Trình Áp Dụng Code Splitting Hiệu Quả
Theo kinh nghiệm của mình, đây là cách tốt nhất để bắt đầu:
- Đo trước, sửa sau: Dùng Chrome DevTools hoặc Lighthouse để xem bundle size hiện tại. Biết được bạn đang ở đâu trước khi tối ưu.
- Bắt đầu từ routes: Đây là chỗ dễ nhất và hiệu quả nhất. Tách mỗi trang thành chunk riêng.
- Kiểm tra thư viện lớn: Dùng
webpack-bundle-analyzerhoặcvite-bundle-visualizerđể xem file nào đang chiếm nhiều dung lượng nhất. - Prefetch những gì sắp cần: Khi người dùng đang ở trang chủ, bạn có thể prefetch trang sản phẩm để khi họ click vào, trang đã sẵn sàng.
Kết Luận
Code Splitting là một trong những kỹ thuật hiệu quả nhất để giảm thời gian load website và cải thiện SEO. Nó đặc biệt phù hợp với ứng dụng web lớn nhiều trang, nơi bundle JavaScript lên đến vài MB.
Quan trọng là bạn cần bắt đầu từ route-based splitting trước, đo lường kết quả, rồi mới tối ưu chi tiết hơn. Đừng chạy theo số lượng file mà bỏ đi chất lượng tổng thể. Một website load nhanh không chỉ giữ người dùng lại lâu hơn, còn được Google đánh giá cao hơn trong kết quả tìm kiếm.