Ảnh hưởng của việc tải từng phần quá nhiều đến hiệu suất

Lời khuyên dựa trên dữ liệu về cách tải từng phần hình ảnh có tính đến Các chỉ số quan trọng về trang web.

Tải từng phần là một kỹ thuật trì hoãn việc tải tài nguyên cho đến khi cần thiết, để tiết kiệm dữ liệu và giảm xung đột mạng cho các thành phần quan trọng. API này đã trở thành tiêu chuẩn web vào năm 2019 và hiện nay, loading="lazy" dành cho hình ảnh được hỗ trợ trên hầu hết các trình duyệt lớn.

Hướng dẫn này tóm tắt cách phân tích dữ liệu minh bạch trên web có sẵn công khai và thử nghiệm A/B đặc biệt để hiểu rõ mức độ sử dụng và đặc điểm hiệu suất của tính năng tải lười hình ảnh ở cấp trình duyệt. Kết quả nghiên cứu cho thấy tính năng tải lười có thể là một công cụ hiệu quả đáng kinh ngạc để giảm số byte hình ảnh không cần thiết, nhưng việc sử dụng quá mức có thể ảnh hưởng tiêu cực đến hiệu suất. Cụ thể, phân tích này cho thấy việc tải nhiều hình ảnh hơn trong khung nhìn ban đầu (trong khi tải lười các hình ảnh còn lại) có thể mang lại cho chúng ta kết quả tốt nhất: tải ít byte hơn và cải thiện Chỉ số quan trọng chính của trang web.

Nghĩa dưỡng

Theo dữ liệu mới nhất trong HTTP Archive, tính năng tải lười hình ảnh tích hợp sẵn được 29% trang web sử dụng và số lượng trang web sử dụng tính năng này đang tăng lên nhanh chóng.

Biểu đồ hình tròn cho thấy WordPress chiếm 84,1% tỷ lệ áp dụng tải từng phần, các CMS khác là 2,3% và các nền tảng không phải CMS là 13,5%.
Bảng chi tiết về các loại trang web sử dụng tính năng tải lười hình ảnh ở cấp trình duyệt. (Nguồn).

Việc truy vấn dữ liệu thô trong dự án Lưu trữ HTTP giúp chúng tôi hiểu rõ hơn về những loại trang web đang thúc đẩy việc áp dụng: 84% trang web sử dụng tính năng tải từng phần hình ảnh ở cấp trình duyệt sử dụng WordPress, 2% sử dụng một CMS khác và 14% còn lại không sử dụng CMS đã biết. Những kết quả này cho thấy rõ cách đó là giải pháp dẫn đầu về mức phí.

Biểu đồ chuỗi thời gian về tỷ lệ sử dụng tính năng tải từng phần với WordPress là nền tảng chiếm ưu thế so với các CMS khác và các nền tảng không phải CMS khác, với tỷ lệ tương tự như biểu đồ trước đó. Số lượng kênh sử dụng tính năng này đã tăng nhanh chóng từ 1% lên 17% từ tháng 7 năm 2020 đến tháng 6 năm 2021.
Bảng phân tích các loại trang web sử dụng tính năng tải từng phần hình ảnh ở cấp trình duyệt. (Nguồn).

Bạn cũng nên lưu ý đến tỷ lệ sử dụng. Một năm trước, vào tháng 7 năm 2020, các trang web WordPress sử dụng tính năng tải lười chiếm hàng chục nghìn trang web trong tập hợp khoảng 6 triệu trang web (1% tổng số). Kể từ đó, chỉ riêng việc sử dụng tính năng tải từng phần trong WordPress đã tăng lên hơn 1 triệu trang web (chiếm 14% tổng số trang web).

Hiệu suất tương quan

Tìm hiểu sâu hơn về Lưu trữ HTTP, bạn có thể so sánh hiệu suất của các trang có và không có tính năng tải từng phần hình ảnh ở cấp trình duyệt với chỉ số Nội dung lớn nhất hiển thị (LCP). Dữ liệu LCP được lấy từ trải nghiệm của người dùng thực tế trong Báo cáo trải nghiệm người dùng trên Chrome (CrUX), thay vì thử nghiệm tổng hợp trong phòng thí nghiệm. Biểu đồ sau đây sử dụng biểu đồ hộp và râu để trực quan hoá mức phân phối của LCP theo phân vị thứ 75 của mỗi trang: các đường biểu thị phân vị thứ 10 và 90, còn các hộp biểu thị phân vị thứ 25 và 75.

Biểu đồ hộp và râu chuột cho thấy các phân vị thứ 10, 25, 75 và 90 cho các trang sử dụng và không sử dụng tính năng tải lười hình ảnh ở cấp trình duyệt. So sánh thì tốc độ phân phối LCP của những trang không sử dụng tính năng này nhanh hơn so với những trang sử dụng.
Sự phân phối trải nghiệm LCP theo phân vị thứ 75 của tất cả các trang, được phân tích theo việc các trang có sử dụng tính năng tải lười hình ảnh ở cấp trình duyệt hay không. (Nguồn).

Trang trung bình không tải lười có LCP theo phân vị thứ 75 là 2.922 mili giây, so với 3.546 mili giây cho trang trung bình có tải lười. Nhìn chung, những trang web sử dụng tính năng tải từng phần thường có hiệu suất LCP kém hơn.

Điều quan trọng cần chỉ ra là đây là kết quả phụ thuộc và không nhất thiết cho thấy tính năng tải lười là nguyên nhân khiến hiệu suất chậm hơn. Giả sử nếu các trang web WordPress có xu hướng tải chậm hơn một chút và xét đến tỷ lệ phần trăm các trang web WordPress trong nhóm tải lười, thì điều đó có thể giải thích sự khác biệt. Để loại bỏ sự biến thiên đó, bạn có thể thu hẹp phạm vi tập trung chỉ dành cho các trang web WordPress.

Biểu đồ hộp và râu cho thấy các phân vị thứ 10, 25, 75 và 90 cho các trang WordPress sử dụng và không sử dụng tính năng tải lười hình ảnh ở cấp trình duyệt. Tương tự như biểu đồ trước, mức phân phối LCP của những trang không sử dụng tính năng này nhanh hơn so với những trang sử dụng.
Sự phân phối trải nghiệm LCP ở phân vị thứ 75 của các trang WordPress, được phân tích theo việc các trang đó có sử dụng tính năng tải từng phần hình ảnh ở cấp trình duyệt hay không. (Nguồn).

Thật không may, cùng một mẫu lại xuất hiện khi xem chi tiết các trang WordPress; những trang sử dụng tính năng tải từng phần có xu hướng có hiệu suất LCP chậm hơn. Trang WordPress trung bình không có tính năng tải lười có LCP theo phân vị thứ 75 là 3.495 mili giây, so với 3.768 mili giây cho trang trung bình có tính năng tải lười.

Điều này vẫn không chứng minh được rằng tính năng tải từng phần khiến các trang tải chậm hơn, nhưng việc sử dụng phương pháp này đồng nghĩa với việc có hiệu suất chậm hơn. Để cố gắng trả lời câu hỏi về mối quan hệ nhân quả, chúng tôi đã thiết lập một thử nghiệm A/B dựa trên phòng thí nghiệm.

Hiệu suất nhân quả

Mục tiêu của thử nghiệm A/B là chứng minh hoặc bác bỏ giả thuyết rằng tính năng tải từng phần hình ảnh tích hợp sẵn (như được triển khai trong lõi WordPress) dẫn đến hiệu suất LCP chậm hơn và ít byte hình ảnh hơn. Phương pháp được sử dụng là kiểm thử một trang web WordPress minh hoạ bằng giao diện twentytwentyone. Cả loại trang lưu trữ và trang đơn (giống như trang chủ và trang bài viết) đều được kiểm thử trên máy tính và thiết bị di động được mô phỏng bằng WebPageTest. Chúng tôi đã kiểm thử từng tổ hợp trang có và không bật tính năng tải lười, đồng thời chạy mỗi lần kiểm thử 9 lần để lấy giá trị LCP trung bình và số byte hình ảnh.

Chương trình dài tập mặc định đã vô hiệu Sự khác biệt so với giá trị mặc định
twentytwentyone-archive-desktop 2.029 1.759 -13%
twentytwentyone-archive-mobile 1.657 1.403 Giảm 15%
twentytwentyone-single-desktop 1.655 1.726 4%
twentytwentyone-single-mobile 1.352 1.384 2%
Thay đổi về LCP (ms) bằng cách tắt tính năng tải từng phần hình ảnh ở cấp trình duyệt trên các trang WordPress mẫu.

Những kết quả này so sánh LCP trung bình tính bằng mili giây cho các thử nghiệm trên bản lưu trữ và trang đơn trên máy tính và thiết bị di động. Khi tính năng tải lười bị tắt trên các trang lưu trữ, LCP đã cải thiện đáng kể. Tuy nhiên, trên các trang đơn, sự khác biệt không đáng kể.

Việc tắt tính năng tải từng phần có vẻ giúp các trang tải nhanh hơn một chút. Tuy nhiên, sự khác biệt về LCP nhỏ hơn một độ lệch chuẩn đối với cả thử nghiệm trên máy tính và thiết bị di động. Do đó, sự khác biệt này có thể là do sự biến thiên và nhìn chung, sự thay đổi này là trung tính. So sánh thì chênh lệch đối với các trang lưu trữ gần với 2 đến 3 độ lệch chuẩn.

Chương trình dài tập mặc định đã vô hiệu Mức chênh lệch so với giá trị mặc định
twentytwentyone-archive-desktop 577 1173 103%
twentytwentyone-archive-mobile 172 378 120%
twentytwentyone-single-desktop 301 850 183%
twentytwentyone-single-mobile 114 378 Tăng 233%
Thay đổi số byte hình ảnh (KB) bằng cách tắt tính năng tải lười hình ảnh ở cấp trình duyệt trên các trang WordPress mẫu.

Những kết quả này so sánh số byte hình ảnh trung vị (tính bằng KB) cho mỗi lần kiểm thử. Như dự kiến, tính năng tải lười có tác động tích cực rất rõ ràng đến việc giảm số byte hình ảnh. Nếu người dùng thực cuộn qua toàn bộ trang, thì tất cả hình ảnh sẽ tải khi chúng đi vào khung nhìn, nhưng những kết quả này cho thấy hiệu suất cải thiện của lượt tải trang ban đầu.

Tóm tắt kết quả của thử nghiệm A/B, kỹ thuật tải lười mà WordPress sử dụng rất rõ ràng giúp giảm số byte hình ảnh với chi phí là độ trễ LCP.

Kiểm thử bản sửa lỗi

Khía cạnh quan trọng nhất của việc triển khai tính năng tải từng phần hiện tại của WordPress cho thử nghiệm này là tính năng này tải từng phần hình ảnh trong khung nhìn (phần trên cùng). Bài đăng trên blog CMS nhận thấy đây là một mẫu cần tránh, nhưng dữ liệu thử nghiệm tại thời điểm đó cho thấy tác động đến LCP là rất nhỏ và đáng để đơn giản hoá việc triển khai trong lõi WordPress.

Dựa trên dữ liệu mới này, chúng tôi đã tạo một bản sửa lỗi thử nghiệm để tránh tải lười hình ảnh ở đầu trang. Bản sửa lỗi này đã được kiểm thử trong cùng điều kiện với thử nghiệm A/B đầu tiên.

Chương trình dài tập mặc định đã vô hiệu sửa Sự khác biệt so với giá trị mặc định Sự khác biệt với trạng thái tắt
twentytwentyone-archive-desktop 2.029 1.759 1.749 -14% -1%
twentytwentyone-archive-mobile 1.657 1.403 1.352 -18% -4%
twentytwentyone-single-desktop 1.655 1.726 1.676 1% Giảm 3%
twentytwentyone-single-mobile 1.352 1.384 1.342 Giảm 1% -3%
Thay đổi về LCP (ms) theo biện pháp khắc phục đề xuất cho tính năng tải từng phần hình ảnh ở cấp trình duyệt trên các trang WordPress mẫu.

Những kết quả này đầy hứa hẹn hơn nhiều. Việc chỉ tải lười các hình ảnh bên dưới màn hình sẽ khiến hồi quy LCP đảo ngược hoàn toàn và thậm chí có thể cải thiện một chút so với việc tắt hoàn toàn tính năng tải lười. Làm cách nào để có thể nhanh hơn so với việc không tải từng phần? Có một lý do giải thích là bằng cách không tải hình ảnh dưới màn hình đầu tiên, sẽ có ít tranh chấp về mạng hơn với hình ảnh LCP, giúp hình ảnh tải nhanh hơn.

Chương trình dài tập mặc định đã vô hiệu sửa Sự khác biệt so với giá trị mặc định Sự khác biệt với trạng thái tắt
twentytwentyone-archive-desktop 577 1173 577 0% -51%
twentytwentyone-archive-mobile 172 378 172 0% -54%
twentytwentyone-single-desktop 301 850 301 0% -65%
twentytwentyone-single-mobile 114 378 114 0% -70%
Thay đổi về số byte hình ảnh (KB) theo bản sửa lỗi đề xuất cho tính năng tải lười hình ảnh ở cấp trình duyệt trên các trang WordPress mẫu.

Về số byte ảnh, cách khắc phục hoàn toàn không có thay đổi nào so với hành vi mặc định. Điều này rất tuyệt vì đó là một trong những điểm mạnh của phương pháp hiện tại.

Bản sửa lỗi này có một số lưu ý. WordPress xác định những hình ảnh cần tải từng phần ở phía máy chủ, tức là không biết gì về kích thước khung nhìn của người dùng hoặc liệu hình ảnh có tải từng phần trong đó hay không. Vì vậy, bản sửa lỗi sử dụng thông tin phỏng đoán về vị trí tương đối của hình ảnh trong mã đánh dấu để đoán xem hình ảnh có tải trong khung nhìn hay không. Cụ thể, nếu hình ảnh là hình ảnh nổi bật đầu tiên trên trang hoặc hình ảnh đầu tiên trong nội dung chính, thì hình ảnh đó được giả định là nằm trong màn hình đầu tiên hoặc gần màn hình đầu tiên và sẽ không được tải lười.

Các điều kiện cấp trang như số từ trong tiêu đề hoặc lượng văn bản trong đoạn văn ở đầu nội dung chính có thể ảnh hưởng đến việc hình ảnh có nằm trong khung nhìn hay không. Ngoài ra, còn có các điều kiện ở cấp người dùng có thể ảnh hưởng đến độ chính xác của phương pháp phỏng đoán, đặc biệt là kích thước khung nhìn và việc sử dụng các đường liên kết neo thay đổi vị trí cuộn của trang.

Vì những lý do đó, bạn cần lưu ý rằng bản sửa lỗi chỉ được điều chỉnh để mang lại hiệu suất tốt trong trường hợp chung và có thể cần phải điều chỉnh để áp dụng những kết quả này cho tất cả các trường hợp thực tế.

Triển khai

Giờ đây, khi đã xác định được cách tải hình ảnh lười biếng hiệu quả hơn, tất cả hình ảnh được tiết kiệm và hiệu suất LCP nhanh hơn, làm cách nào để các trang web có thể bắt đầu sử dụng cách này? Thay đổi có mức độ ưu tiên cao nhất là gửi bản vá đến cốt lõi WordPress để triển khai bản sửa lỗi thử nghiệm. Hướng dẫn trong bài đăng trên blog Tải lười ở cấp trình duyệt cho CMS cũng sẽ được cập nhật để làm rõ những tác động tiêu cực của tính năng tải lười ở đầu trang và cách CMS có thể sử dụng phương pháp phỏng đoán để tránh điều này.

Vì những phương pháp hay nhất này áp dụng cho tất cả nhà phát triển web, nên bạn cũng nên gắn cờ các mẫu tải lười trong các công cụ như Lighthouse. Hãy tham khảo yêu cầu về tính năng trên GitHub nếu bạn muốn theo dõi tiến trình của quy trình kiểm tra đó. Cho đến lúc đó, có một việc mà nhà phát triển có thể làm để tìm các bản sao của phần tử LCP đang được tải từng phần là thêm nhật ký chi tiết hơn vào dữ liệu trường của họ.

new PerformanceObserver((list) => {
  const latestEntry = list.getEntries().at(-1);

  if (latestEntry?.element?.getAttribute('loading') == 'lazy') {
    console.warn('Warning: LCP element was lazy loaded', latestEntry);
  }
}).observe({type: 'largest-contentful-paint', buffered: true});

Đoạn mã JavaScript trước đó sẽ đánh giá phần tử LCP gần đây nhất và ghi lại một cảnh báo nếu phần tử này được tải từng phần.

Điều này cũng làm nổi bật ưu điểm vượt trội của kỹ thuật tải từng phần và tiềm năng cải thiện API ở cấp nền tảng. Ví dụ: có một vấn đề chưa được giải quyết trong Chromium để thử nghiệm việc tải một số hình ảnh đầu tiên một cách nhanh chóng, tương tự như bản sửa lỗi, mặc dù thuộc tính loading.

Kết luận

Nếu trang web của bạn sử dụng tính năng tải lười hình ảnh ở cấp trình duyệt, hãy kiểm tra cách triển khai tính năng này và chạy thử nghiệm A/B để hiểu rõ hơn về chi phí hiệu suất của tính năng này. Bạn có thể hưởng lợi từ việc tải hình ảnh nhanh hơn trong màn hình đầu tiên. Nếu bạn có trang web WordPress, hy vọng là bản vá sẽ sớm được phát hành trong lõi WordPress. Và nếu bạn đang sử dụng một CMS khác, hãy đảm bảo rằng họ nắm được các vấn đề tiềm ẩn về hiệu suất được mô tả ở đây.

Việc thử nghiệm các API nền tảng web tương đối mới có thể mang lại cả rủi ro và phần thưởng. Đó là lý do vì sao chúng được gọi là các tính năng tiên tiến. Mặc dù bắt đầu hiểu được sự phức tạp của tính năng tải lười hình ảnh ở cấp trình duyệt, nhưng chúng ta cũng thấy được những mặt tích cực của cách sử dụng tính năng này để đạt được hiệu suất tốt hơn.

Ảnh chụp của Frankie Lopez trên Unsplash