0
0
Lập trình
NM

Tối ưu hiệu suất với Lazy Routing và React Suspense

Đăng vào 6 tháng trước

• 4 phút đọc

Tối ưu hiệu suất với Lazy Routing và React Suspense

Khi xử lý các tác vụ bất đồng bộ trong React, Suspense được sử dụng chủ yếu để tối ưu giao diện người dùng bằng cách hiển thị một giao diện tạm thời trong quá trình render.

Sử dụng component Suspense, giao diện có thể là bất cứ thứ gì từ một placeholder đơn giản đến một spinner tải. fallback là một React node phục vụ như một view nhẹ trước khi component con được thực thi. Suspense sẽ tự động chuyển sang fallback khi các phần tử con của nó vẫn đang tải.

👉 Trường hợp lý tưởng là khi chúng ta không cần tải một component ngay từ đầu. Thay vào đó, chúng ta chỉ render nó khi cần thiết. Trong hầu hết các trường hợp, Suspense được sử dụng với các component lazy-loaded.

🔹 Component lazy-loaded là gì?

Component lazy-loaded là một kỹ thuật tối ưu hiệu suất giúp cải thiện tốc độ và hiệu quả của ứng dụng web bằng cách trì hoãn việc tải các tài nguyên không thiết yếu cho đến khi người dùng thực sự cần chúng.

Tính năng này được giới thiệu trong React 16.6.

🔹 Ví dụ thực tế

Tôi đã gặp vấn đề này khi tạo một modal component mà được render có điều kiện dựa trên một sự kiện cụ thể.

Bên trong modal, có một component con chịu trách nhiệm:

  • Chuyển đổi dữ liệu thành một file
  • Tải file thông qua một dịch vụ web

Thách thức:

  • Dữ liệu của component con là động (thay đổi mỗi lần).
  • Tôi nhận thấy có một độ trễ trong việc mở modal vì component con khá nặng.
  • Kích thước bundle cũng quá lớn.

🔹 Giải pháp: Suspense + Lazy Loading

Để cải thiện hiệu suất của modal, tôi đã sử dụng Suspense với lazy loading:

  1. Thay đổi import của component con thành React.lazy, để nó chỉ tải khi cần thiết.
  2. Bọc nó bằng Suspense và sử dụng một spinner làm UI fallback.

Ví dụ mã

jsx Copy
import React, { useState, lazy, Suspense } from "react";

// Lazy load the child component
const FileUploader = lazy(() => import("./FileUploader"));

function App() {
  const [isModalOpen, setIsModalOpen] = useState(false);

  return (
    <div>
      <button onClick={() => setIsModalOpen(true)}>Mở Modal</button>

      {isModalOpen && (
        <Modal onClose={() => setIsModalOpen(false)}>
          {/* Bọc component lazy-loaded bằng Suspense */}
          <Suspense fallback={<div>Đang tải...</div>}>
            <FileUploader />
          </Suspense>
        </Modal>
      )}
    </div>
  );
}

function Modal({ children, onClose }) {
  return (
    <div className="modal">
      <div className="modal-content">
        <button onClick={onClose}>X</button>
        {children}
      </div>
    </div>
  );
}

export default App;

🔹 Các thực tiễn tốt nhất

  • Sử dụng Suspense với các component lớn: Khi có các component lớn, hãy xem xét sử dụng Suspense để cải thiện trải nghiệm người dùng.
  • Kết hợp với các thư viện khác: Kết hợp Suspense với các thư viện như React Router để quản lý việc tải dữ liệu.

🔹 Những cạm bẫy thường gặp

  • Quá nhiều component lazy-loaded: Không nên lạm dụng lazy loading, vì điều này có thể dẫn đến độ trễ lớn khi người dùng cần tải nhiều component cùng một lúc.
  • Không cung cấp UI fallback hợp lý: Đảm bảo rằng UI fallback không chỉ là một spinner đơn giản mà có thể cung cấp thông tin cho người dùng.

🔹 Mẹo hiệu suất

  • Kiểm tra kích thước bundle: Sử dụng công cụ như Webpack Bundle Analyzer để kiểm tra kích thước bundle của bạn và tìm kiếm cách tối ưu.
  • Tối ưu hóa hình ảnh và tài nguyên: Hãy chắc chắn rằng tất cả hình ảnh và tài nguyên khác đều được tối ưu hóa trước khi sử dụng trong ứng dụng.

🔹 Giải quyết sự cố

  • Kiểm tra lỗi console: Nếu component không tải, hãy kiểm tra lỗi trong console của trình duyệt.
  • Xác minh đường dẫn import: Đảm bảo rằng đường dẫn import cho các component lazy-loaded là chính xác.

🔹 Kết luận

Sử dụng Lazy Routing với React Suspense là một phương pháp hiệu quả để tối ưu hóa hiệu suất ứng dụng của bạn. Hãy thử áp dụng những gì bạn đã học ở đây vào dự án của mình và theo dõi sự cải thiện trong trải nghiệm người dùng.

Nếu bạn có bất kỳ câu hỏi nào hoặc muốn chia sẻ kinh nghiệm của mình, hãy để lại bình luận bên dưới!

Câu hỏi thường gặp (FAQ)

1. Lazy loading có ảnh hưởng đến SEO không?
Có, nếu không được triển khai đúng cách, lazy loading có thể ảnh hưởng đến SEO. Hãy đảm bảo rằng các nội dung quan trọng vẫn có thể được tìm thấy và lập chỉ mục.

2. Tôi có thể sử dụng Suspense với các thư viện bên ngoài không?
Có, bạn có thể sử dụng Suspense với các thư viện hỗ trợ React, nhưng hãy kiểm tra tài liệu của thư viện đó để biết thêm chi tiết.

Tài nguyên tham khảo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào