PRPL là từ viết tắt mô tả một mẫu dùng để giúp trang web tải và tương tác nhanh hơn:
- Tải trước các tài nguyên phát hiện sau.
- Hiển thị tuyến ban đầu sớm nhất có thể.
- Lưu trước vào bộ nhớ đệm các thành phần còn lại.
- Tải lười các tuyến đường khác và các thành phần không quan trọng.
Trong hướng dẫn này, hãy tìm hiểu cách mỗi kỹ thuật này phù hợp với nhau nhưng vẫn có thể được sử dụng độc lập để đạt được kết quả về hiệu suất.
Kiểm tra trang bằng Lighthouse
Chạy Lighthouse để xác định các cơ hội cải thiện phù hợp với kỹ thuật PRPL:
- Nhấn tổ hợp phím `Ctrl+Shift+J` (hoặc `Command+Option+J` trên máy Mac) để mở DevTools.
- Nhấp vào thẻ Lighthouse (Tháp hải đăng).
- Đánh dấu vào hộp đánh dấu Hiệu suất và Ứng dụng web tiến bộ.
- Nhấp vào Chạy quy trình kiểm tra để tạo báo cáo.
Để biết thêm thông tin, hãy xem bài viết Khám phá các cơ hội cải thiện hiệu suất bằng Lighthouse.
Tải trước các tài nguyên quan trọng
Lighthouse sẽ cho thấy quy trình kiểm tra không thành công sau đây nếu một tài nguyên nhất định được phân tích cú pháp và tìm nạp trễ:
Tải trước là một yêu cầu tìm nạp khai báo yêu cầu trình duyệt yêu cầu một tài nguyên mà trình quét tải trước của trình duyệt không thể phát hiện được, chẳng hạn như hình ảnh được tham chiếu bằng thuộc tính background-image
. Tải trước các tài nguyên phát hiện sau bằng cách thêm thẻ <link>
có rel="preload"
vào phần đầu của tài liệu HTML:
<link rel="preload" as="image" href="hero-image.jpg">
Việc thêm một lệnh <link rel="preload">
sẽ bắt đầu một yêu cầu cho tài nguyên đó và lưu trữ tài nguyên đó trong bộ nhớ đệm. Sau đó, trình duyệt có thể truy xuất cookie đó khi cần.
Để biết thêm thông tin về cách tải trước các tài nguyên quan trọng, hãy tham khảo hướng dẫn Tải trước các thành phần quan trọng.
Kết xuất tuyến đường ban đầu càng sớm càng tốt
Lighthouse đưa ra cảnh báo nếu có tài nguyên làm chậm Lần hiển thị đầu tiên, tức là thời điểm trang web của bạn hiển thị các pixel trên màn hình:
Để cải thiện lần vẽ đầu tiên, Lighthouse đề xuất bạn nên chèn JavaScript quan trọng vào cùng dòng và
trì hoãn phần còn lại bằng cách sử dụng
async
,
cũng như chèn CSS quan trọng được sử dụng ở đầu trang vào cùng dòng. Điều này giúp cải thiện hiệu suất bằng cách loại bỏ các lượt truy cập đến máy chủ để tìm nạp các thành phần chặn kết xuất.
Tuy nhiên, mã nội tuyến khó duy trì hơn từ góc độ phát triển và trình duyệt không thể lưu vào bộ nhớ đệm riêng biệt.
Một phương pháp khác để cải thiện Lần hiển thị đầu tiên là hiển thị phía máy chủ HTML ban đầu của trang. Thao tác này sẽ hiển thị nội dung ngay lập tức cho người dùng trong khi các tập lệnh vẫn đang được tìm nạp, phân tích cú pháp và thực thi. Tuy nhiên, việc này có thể làm tăng đáng kể tải trọng của tệp HTML, từ đó ảnh hưởng đến Thời gian phản hồi hoặc thời gian để ứng dụng của bạn trở nên tương tác và có thể phản hồi hoạt động đầu vào của người dùng.
Không có giải pháp chính xác nào để giảm Lần vẽ đầu tiên trong ứng dụng. Bạn chỉ nên cân nhắc việc nội tuyến các kiểu và kết xuất phía máy chủ nếu lợi ích lớn hơn sự đánh đổi cho ứng dụng. Bạn có thể tìm hiểu thêm về cả hai khái niệm này thông qua các tài nguyên sau.
Lưu trước thành phần vào bộ nhớ đệm
Bằng cách đóng vai trò là proxy, trình làm việc của dịch vụ có thể tìm nạp các thành phần trực tiếp từ bộ nhớ đệm thay vì máy chủ trong các lượt truy cập lặp lại. Điều này không chỉ cho phép người dùng sử dụng ứng dụng của bạn khi không có mạng mà còn giúp thời gian tải trang nhanh hơn khi người dùng truy cập lại.
Sử dụng thư viện bên thứ ba để đơn giản hoá quá trình tạo trình chạy dịch vụ, trừ phi bạn có các yêu cầu lưu vào bộ nhớ đệm phức tạp hơn những gì thư viện có thể cung cấp. Ví dụ: Workbox cung cấp một bộ công cụ cho phép bạn tạo và duy trì một worker dịch vụ để lưu các thành phần vào bộ nhớ đệm. Để biết thêm thông tin về trình chạy dịch vụ và độ tin cậy khi không có mạng, hãy tham khảo hướng dẫn về trình chạy dịch vụ trong lộ trình học tập về độ tin cậy.
Tải từng phần
Lighthouse sẽ cho thấy kết quả kiểm tra không thành công nếu bạn gửi quá nhiều dữ liệu qua mạng.
Điều này bao gồm tất cả các loại thành phần, nhưng tải trọng JavaScript lớn đặc biệt tốn kém do thời gian cần thiết để trình duyệt phân tích cú pháp và biên dịch các thành phần đó. Lighthouse cũng đưa ra cảnh báo về vấn đề này khi thích hợp.
Để gửi một tải trọng JavaScript nhỏ hơn chỉ chứa mã cần thiết khi người dùng tải ứng dụng của bạn lần đầu tiên, hãy phân tách toàn bộ gói và tải từng phần theo yêu cầu.
Sau khi bạn đã chia gói, hãy tải trước các phần quan trọng hơn (xem hướng dẫn Tải trước các thành phần quan trọng). Tính năng tải trước đảm bảo trình duyệt tìm nạp và tải xuống các tài nguyên quan trọng hơn sớm hơn.
Ngoài việc phân tách và tải các đoạn JavaScript khác nhau theo yêu cầu, Lighthouse cũng cung cấp quy trình kiểm tra để tải từng phần hình ảnh không quan trọng.
Nếu bạn tải nhiều hình ảnh trên trang web, hãy trì hoãn tất cả hình ảnh nằm ngoài khung nhìn thiết bị hoặc bên dưới màn hình khi trang tải (xem phần Sử dụng lazysizes để tải từng phần hình ảnh).
Các bước tiếp theo
Giờ đây, bạn đã hiểu một số khái niệm cơ bản đằng sau mẫu PRPL, hãy tiếp tục với hướng dẫn tiếp theo trong phần này để tìm hiểu thêm. Điều quan trọng cần nhớ là không phải tất cả các kỹ thuật đều cần được áp dụng cùng nhau. Mọi nỗ lực thực hiện với bất kỳ nội dung nào sau đây đều sẽ giúp cải thiện đáng kể hiệu suất.
- Tải trước các tài nguyên quan trọng.
- Hiển thị tuyến đường ban đầu càng sớm càng tốt.
- Lưu trước vào bộ nhớ đệm các thành phần còn lại.
- Tải lười các tuyến đường khác và các thành phần không quan trọng.
Bạn có thể đọc thêm về các mẫu PRPL.