Tìm hiểu cách triển khai React lazy loading với kỹ thuật tách mã component để cải thiện đáng kể hiệu năng ứng dụng, trải nghiệm người dùng và thời gian tải ban đầu.
React Lazy Loading: Tăng Cường Hiệu Năng Bằng Cách Tách Mã Component
Trong bối cảnh phát triển web ngày nay, hiệu năng là yếu tố tối quan trọng. Người dùng mong đợi thời gian tải nhanh và tương tác mượt mà. Các gói JavaScript lớn, đặc biệt trong các ứng dụng React phức tạp, có thể ảnh hưởng đáng kể đến thời gian tải ban đầu và trải nghiệm người dùng tổng thể. Một kỹ thuật mạnh mẽ để giải quyết vấn đề này là lazy loading, cụ thể là tách mã component. Bài viết này cung cấp một hướng dẫn toàn diện để hiểu và triển khai React lazy loading bằng cách sử dụng React.lazy
và Suspense
.
Lazy Loading và Code Splitting là gì?
Lazy loading, còn được gọi là tải theo yêu cầu, là một kỹ thuật trì hoãn việc tải các tài nguyên (trong trường hợp của chúng ta là các component React) cho đến khi chúng thực sự cần thiết. Thay vì tải toàn bộ mã của ứng dụng ngay từ đầu, chỉ những phần thiết yếu được tải ban đầu, và phần mã còn lại được tải bất đồng bộ khi người dùng điều hướng đến một tuyến đường cụ thể hoặc tương tác với một component nhất định. Điều này làm giảm đáng kể kích thước gói ban đầu và cải thiện thời gian tương tác (time to interactive - TTI).
Code splitting (Tách mã) là quá trình chia mã ứng dụng của bạn thành các phần nhỏ hơn, dễ quản lý hơn (các gói - bundle). Các gói này sau đó có thể được tải một cách độc lập và theo yêu cầu. React lazy loading tận dụng kỹ thuật tách mã để chỉ tải các component khi chúng được yêu cầu.
Lợi ích của Lazy Loading và Code Splitting
- Cải thiện thời gian tải ban đầu: Bằng cách giảm kích thước gói ban đầu, trình duyệt tải xuống và phân tích ít JavaScript hơn, giúp trang tải nhanh hơn. Điều này đặc biệt quan trọng đối với người dùng có kết nối mạng chậm hoặc thiết bị yếu.
- Nâng cao trải nghiệm người dùng: Thời gian tải nhanh hơn dẫn đến trải nghiệm người dùng nhạy hơn và thú vị hơn, giảm tỷ lệ thoát trang và tăng sự tương tác của người dùng.
- Giảm tiêu thụ tài nguyên: Chỉ tải mã cần thiết giúp giảm bộ nhớ mà ứng dụng sử dụng, đặc biệt có lợi cho các thiết bị di động.
- Tốt hơn cho SEO: Các công cụ tìm kiếm ưu tiên các trang web có thời gian tải nhanh, có khả năng cải thiện thứ hạng trang web của bạn trên công cụ tìm kiếm.
Triển khai React Lazy Loading với React.lazy
và Suspense
React cung cấp một cơ chế tích hợp sẵn để lazy load các component bằng cách sử dụng React.lazy
và Suspense
. React.lazy
cho phép bạn nhập động (dynamically import) một component, trong khi Suspense
cung cấp một cách để hiển thị giao diện người dùng dự phòng (fallback UI) trong khi component đang được tải.
Bước 1: Nhập động với React.lazy
React.lazy
nhận một hàm gọi đến import()
. Hàm import()
là một lệnh nhập động trả về một Promise, Promise này sẽ phân giải thành một module chứa component bạn muốn lazy load.
import React, { lazy, Suspense } from 'react';
const MyComponent = lazy(() => import('./MyComponent'));
Trong ví dụ này, MyComponent
không được tải cho đến khi nó được render. Lệnh import('./MyComponent')
nhập động component từ tệp ./MyComponent
. Lưu ý rằng đường dẫn là tương đối so với tệp hiện tại.
Bước 2: Sử dụng Suspense
để xử lý trạng thái tải
Vì lazy loading liên quan đến việc tải component một cách bất đồng bộ, bạn cần một cách để xử lý trạng thái tải và hiển thị một giao diện người dùng dự phòng trong khi component đang được tìm nạp. Đây là lúc Suspense
phát huy tác dụng. Suspense
là một component của React cho phép bạn "tạm dừng" việc render các component con của nó cho đến khi chúng sẵn sàng. Nó nhận một prop fallback
, chỉ định giao diện người dùng sẽ được render trong khi các component con đang tải.
import React, { lazy, Suspense } from 'react';
const MyComponent = lazy(() => import('./MyComponent'));
function App() {
return (
Loading...
Trong ví dụ này, component Suspense
bao bọc MyComponent
. Trong khi MyComponent
đang tải, prop fallback
(
) sẽ được render. Một khi MyComponent
được tải xong, nó sẽ thay thế giao diện người dùng dự phòng.
Ví dụ: Lazy Loading một Route trong ứng dụng React Router
Lazy loading đặc biệt hữu ích cho các route trong ứng dụng React Router. Bạn có thể lazy load toàn bộ các trang hoặc các phần của ứng dụng, cải thiện thời gian tải ban đầu của trang web.
import React, { lazy, Suspense } from 'react';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
const Home = lazy(() => import('./pages/Home'));
const About = lazy(() => import('./pages/About'));
const Contact = lazy(() => import('./pages/Contact'));
function App() {
return (
Loading...