Tối ưu hoá thời gian hiển thị nội dung lớn nhất

Hướng dẫn từng bước về cách phân tích chỉ số LCP và xác định các khía cạnh chính cần cải thiện.

Ngày phát hành: 30/4/2020, Lần cập nhật gần đây nhất: Ngày 31/3/2025

Thời gian hiển thị nội dung lớn nhất (LCP) là một trong ba chỉ số Chỉ số quan trọng chính của trang web và cho biết tốc độ tải nội dung chính của một trang web. Cụ thể, LCP đo lường thời gian từ khi người dùng bắt đầu tải trang cho đến khi hình ảnh hoặc khối văn bản lớn nhất được hiển thị trong khung nhìn.

Để đem lại trải nghiệm tốt cho người dùng, các trang web nên cố gắng đạt được LCP từ 2,5 giây trở xuống cho ít nhất 75% lượt truy cập trang.

Giá trị LCP tốt là từ 2, 5 giây trở xuống, giá trị kém là trên 4 giây và mọi giá trị nằm giữa hai giá trị này đều cần cải thiện
Giá trị LCP tốt là dưới 2,5 giây.

Một số yếu tố có thể ảnh hưởng đến tốc độ tải và hiển thị trang web của trình duyệt, đồng thời độ trễ trên bất kỳ yếu tố nào trong số đó đều có thể ảnh hưởng đáng kể đến LCP.

Hiếm khi việc sửa nhanh một phần trang sẽ đem lại sự cải thiện có ý nghĩa cho LCP. Để cải thiện LCP, bạn phải xem xét toàn bộ quá trình tải và đảm bảo mọi bước trong đó đều được tối ưu hoá.

Tìm hiểu về chỉ số LCP

Trước khi tối ưu hoá LCP, nhà phát triển nên tìm hiểu xem họ có vấn đề về LCP hay không và mức độ nghiêm trọng của vấn đề đó.

Bạn có thể đo lường LCP bằng một số công cụ và không phải tất cả các công cụ này đều đo lường LCP theo cùng một cách. Để hiểu LCP của người dùng thực tế, chúng ta nên xem xét trải nghiệm của người dùng thực tế thay vì kết quả của một công cụ dựa trên phòng thí nghiệm như Lighthouse hoặc kiểm thử cục bộ. Những công cụ dựa trên phòng thí nghiệm này có thể cung cấp nhiều thông tin để giải thích và giúp bạn cải thiện LCP. Tuy nhiên, xin lưu ý rằng chỉ kiểm thử trong phòng thí nghiệm thôi có thể chưa đủ để phản ánh trải nghiệm thực tế của người dùng.

Dữ liệu LCP dựa trên người dùng thực có thể xuất hiện từ các công cụ Giám sát người dùng thực (RUM) được cài đặt trên một trang web hoặc bằng cách sử dụng Báo cáo trải nghiệm người dùng trên Chrome (CrUX). Báo cáo này thu thập dữ liệu ẩn danh từ người dùng Chrome thực trên hàng triệu trang web.

Sử dụng dữ liệu LCP CrUX trong Chrome DevTools

Bảng điều khiển Hiệu suất của Chrome DevTools cho thấy trải nghiệm LCP cục bộ bên cạnh LCP CrUX của trang hoặc nguồn gốc trong chế độ xem chỉ số trực tiếp và trong Thông tin chi tiết của dấu vết hiệu suất, bao gồm thông tin chi tiết về thời gian của các phần phụ của LCP (chúng tôi sẽ giải thích ngay sau đây).

LCP cục bộ và LCP tại trường trong bảng điều khiển Hiệu suất của Công cụ của Chrome cho nhà phát triển
LCP cục bộ và LCP tại trường trong các chỉ số trực tiếp và chế độ xem theo dõi của bảng điều khiển Hiệu suất trong Công cụ cho nhà phát triển của Chrome.

Bằng cách xếp lớp dữ liệu trường vào bảng điều khiển Hiệu suất, bạn có thể đánh giá xem một trang có gặp vấn đề về LCP với người dùng thực tế hay không và điều chỉnh chế độ cài đặt môi trường cục bộ để tái hiện và gỡ lỗi các vấn đề đó hiệu quả hơn.

Sử dụng dữ liệu LCP CrUX của PageSpeed Insights

PageSpeed Insights cung cấp quyền truy cập vào dữ liệu CrUX trong phần trên cùng có nhãn Khám phá nội dung người dùng thực tế của bạn đang trải nghiệm. Bạn có thể xem dữ liệu chi tiết hơn dựa trên phòng thí nghiệm trong phần dưới cùng có nhãn Chẩn đoán vấn đề về hiệu suất. Nếu trang web của bạn có dữ liệu CrUX, hãy luôn tập trung vào dữ liệu người dùng thực trước tiên.

Dữ liệu CrUX hiển thị trong PageSpeed Insights
Dữ liệu CrUX hiển thị trong PageSpeed Insights.

PageSpeed Insights hiển thị tối đa 4 loại dữ liệu CrUX:

  • Dữ liệu Di động cho URL này
  • Dữ liệu Máy tính cho URL này
  • Dữ liệu Di động cho toàn bộ Nguồn gốc
  • Dữ liệu Máy tính cho toàn bộ Nguồn gốc

Bạn có thể bật/tắt các chế độ này trong phần điều khiển ở trên cùng và trên cùng bên phải của phần này. Nếu một URL không có đủ dữ liệu để hiển thị ở cấp URL nhưng có dữ liệu cho nguồn gốc, thì PageSpeed Insights sẽ luôn hiển thị dữ liệu nguồn gốc.

PageSpeed Insights sử dụng dữ liệu cấp nguồn khi không có dữ liệu cấp URL
Khi không có dữ liệu cấp URL, PageSpeed Insights sẽ hiển thị dữ liệu cấp nguồn gốc.

LCP cho toàn bộ nguồn gốc có thể rất khác với LCP của một trang riêng lẻ, tuỳ thuộc vào cách LCP được tải trên trang đó so với các trang khác trên nguồn gốc đó. Tỷ lệ này cũng có thể chịu ảnh hưởng của cách khách truy cập chuyển đến các trang này. Trang chủ thường được người dùng mới truy cập, vì vậy, thường được tải "lạnh", không có nội dung nào được lưu vào bộ nhớ đệm và thường là những trang chậm nhất trên trang web.

Việc xem xét 4 danh mục dữ liệu CrUX có thể giúp bạn hiểu được vấn đề về LCP là vấn đề riêng của trang này hay là vấn đề chung trên toàn trang web. Tương tự, báo cáo này có thể cho biết những loại thiết bị gặp vấn đề về LCP.

Sử dụng các chỉ số bổ sung CrUX của PageSpeed Insights

Những người muốn tối ưu hoá LCP cũng nên sử dụng các thông tin về thời gian Hiển thị nội dung đầu tiên (FCP)Thời gian tải byte đầu tiên (TTFB). Đây là những chỉ số chẩn đoán hiệu quả có thể cung cấp thông tin chi tiết có giá trị về LCP.

TTFB là thời gian từ khi khách truy cập bắt đầu chuyển đến một trang (ví dụ: nhấp vào một đường liên kết) cho đến khi nhận được các byte đầu tiên của tài liệu HTML. TTFB cao có thể khiến bạn gặp khó khăn hoặc thậm chí không thể đạt được LCP là 2, 5 giây.

TTFB cao có thể là do nhiều lệnh chuyển hướng máy chủ, khách truy cập ở xa máy chủ trang web gần nhất, khách truy cập ở điều kiện mạng kém hoặc không thể sử dụng nội dung được lưu trong bộ nhớ đệm do các tham số truy vấn.

Khi một trang bắt đầu hiển thị, có thể có một lần vẽ ban đầu (ví dụ: màu nền), sau đó một số nội dung sẽ xuất hiện (ví dụ: tiêu đề trang web). FCP đo lường thời điểm xuất hiện nội dung ban đầu. Sự khác biệt giữa FCP và các chỉ số khác có thể rất rõ ràng.

Độ chênh lệch lớn giữa TTFB và FCP có thể cho biết trình duyệt cần tải nhiều thành phần chặn chế độ hiển thị xuống. Đây cũng có thể là dấu hiệu cho thấy trình duyệt phải hoàn tất nhiều công việc để hiển thị nội dung có ý nghĩa – một dấu hiệu kinh điển của trang web phụ thuộc nhiều vào tính năng hiển thị phía máy khách.

Độ chênh lệch lớn giữa FCP và LCP cho biết trình duyệt không thể ưu tiên tài nguyên LCP ngay lập tức (ví dụ: văn bản hoặc hình ảnh do JavaScript quản lý thay vì có trong HTML ban đầu) hoặc trình duyệt đang hoàn tất công việc khác trước khi có thể hiển thị nội dung LCP.

Sử dụng dữ liệu Lighthouse của PageSpeed Insights

Phần Lighthouse của PageSpeed Insights đưa ra một số hướng dẫn để cải thiện LCP, nhưng trước tiên, bạn nên kiểm tra xem LCP được cung cấp có phù hợp với dữ liệu người dùng thực tế do CrUX cung cấp hay không. Nếu Lighthouse và CrUX không đồng ý với nhau, thì CrUX có thể cung cấp thông tin chính xác hơn về trải nghiệm người dùng. Hãy đảm bảo dữ liệu CrUX của bạn là dành cho trang của bạn, chứ không phải toàn bộ nguồn gốc, trước khi bạn hành động dựa trên dữ liệu đó.

Nếu cả Lighthouse và CrUX đều cho thấy các giá trị LCP cần cải thiện, thì phần Lighthouse có thể cung cấp hướng dẫn có giá trị về cách cải thiện LCP. Sử dụng bộ lọc LCP để chỉ hiển thị các lượt kiểm tra liên quan đến LCP như sau:

Cơ hội và thông tin chẩn đoán về LCP của Lighthouse
Thông tin chẩn đoán và đề xuất của Lighthouse để cải thiện LCP.

Ngoài Cơ hội để cải thiện, bạn cũng có thể xem thông tin Chẩn đoán để biết thêm thông tin giúp chẩn đoán vấn đề. Thông tin chẩn đoán về phần tử Thời gian hiển thị nội dung lớn nhất cho thấy bảng chi tiết hữu ích về các thời điểm tạo nên LCP:

Các phần phụ của LCP trong Lighthouse
Bảng chi tiết của Lighthouse về các phần tử LCP.

Các loại tài nguyên và thành phần phụ của LCP cũng có trong CrUX.

Tiếp theo, chúng ta sẽ tìm hiểu kỹ hơn về các phần phụ này.

Bảng chi tiết về LCP

Việc tối ưu hoá LCP có thể phức tạp hơn khi PageSpeed Insights không đưa ra câu trả lời về cách cải thiện chỉ số này. Với các nhiệm vụ phức tạp, bạn nên chia nhỏ các nhiệm vụ đó thành các nhiệm vụ nhỏ hơn, dễ quản lý hơn và giải quyết riêng từng nhiệm vụ.

Phần này trình bày một phương pháp để phân tích LCP thành các phần phụ quan trọng nhất, sau đó trình bày các đề xuất cụ thể và phương pháp hay nhất để tối ưu hoá từng phần.

Hầu hết các lượt tải trang thường bao gồm một số yêu cầu mạng, nhưng để xác định cơ hội cải thiện LCP, bạn chỉ nên bắt đầu bằng cách xem xét hai yêu cầu sau:

  1. Tài liệu HTML ban đầu
  2. Tài nguyên LCP (nếu có)

Mặc dù các yêu cầu khác trên trang có thể ảnh hưởng đến LCP, nhưng hai yêu cầu này (cụ thể là thời điểm tài nguyên LCP bắt đầu và kết thúc) cho biết liệu trang của bạn có được tối ưu hoá cho LCP hay không.

Để xác định tài nguyên LCP, bạn có thể sử dụng các công cụ dành cho nhà phát triển (chẳng hạn như PageSpeed Insights đã thảo luận trước đó, Chrome DevTools hoặc WebPageTest) để xác định phần tử LCP. Từ đó, bạn có thể so khớp URL (lại một lần nữa, nếu có) do phần tử tải trên dòng thác mạng của tất cả tài nguyên do trang tải.

Ví dụ: hình ảnh trực quan sau đây cho thấy các tài nguyên này được làm nổi bật trên sơ đồ thác nước mạng từ một lượt tải trang thông thường, trong đó phần tử LCP yêu cầu một yêu cầu hình ảnh để hiển thị.

Thác nước mạng có tài nguyên HTML và LCP được làm nổi bật
Sơ đồ dạng thác nước cho biết thời gian tải HTML của trang web và các tài nguyên mà LCP cần.

Để có một trang được tối ưu hoá tốt, bạn muốn yêu cầu tài nguyên LCP bắt đầu tải càng sớm càng tốt và bạn muốn phần tử LCP hiển thị nhanh nhất có thể sau khi tài nguyên LCP tải xong. Để giúp hình dung xem một trang cụ thể có tuân thủ nguyên tắc này hay không, bạn có thể chia tổng thời gian LCP thành các phần phụ sau:

Thời gian tải byte đầu tiên (TTFB)
Thời gian từ khi người dùng bắt đầu tải trang cho đến khi trình duyệt nhận được byte đầu tiên của phản hồi tài liệu HTML.
Độ trễ khi tải tài nguyên
Thời gian giữa TTFB và thời điểm trình duyệt bắt đầu tải tài nguyên LCP. Nếu phần tử LCP không yêu cầu tải tài nguyên để hiển thị (ví dụ: nếu phần tử là nút văn bản được hiển thị bằng phông chữ hệ thống), thì thời gian này là 0.
Thời lượng tải tài nguyên
Khoảng thời gian cần thiết để tải chính tài nguyên LCP. Nếu phần tử LCP không yêu cầu tải tài nguyên để hiển thị, thì thời gian này là 0.
Độ trễ khi hiển thị phần tử
Thời gian từ khi tài nguyên LCP tải xong đến khi phần tử LCP hiển thị đầy đủ.

LCP của mỗi trang bao gồm 4 danh mục phụ này. Không có khoảng trống hoặc sự chồng chéo giữa các lần tải này và chúng cộng lại thành toàn bộ thời gian LCP.

Thông tin chi tiết về LCP cho thấy 4 danh mục phụ
Một sơ đồ dạng thác nước tương tự, với 4 danh mục phụ của LCP được phủ lên dòng thời gian.

Giá trị LCP của mỗi trang có thể được chia nhỏ thành 4 phần phụ này. Không có phần chồng chéo hoặc khoảng trống giữa các phần tử. Tổng thời gian này sẽ bằng thời gian LCP đầy đủ.

Khi tối ưu hoá LCP, bạn nên cố gắng tối ưu hoá từng phần phụ này. Tuy nhiên, bạn cũng cần lưu ý rằng bạn cần tối ưu hoá tất cả các thành phần này. Trong một số trường hợp, việc áp dụng biện pháp tối ưu hoá cho một phần sẽ không cải thiện LCP mà chỉ chuyển thời gian tiết kiệm được sang một phần khác.

Ví dụ: trong thác nước mạng trước đó, nếu bạn giảm kích thước tệp của hình ảnh bằng cách nén nhiều hơn hoặc chuyển sang định dạng tối ưu hơn (chẳng hạn như AVIF hoặc WebP), thì điều đó sẽ làm giảm thời lượng tải tài nguyên, nhưng thực sự sẽ không cải thiện LCP vì thời gian sẽ chỉ chuyển sang phần phụ độ trễ kết xuất phần tử:

Bảng chi tiết tương tự về LCP được hiển thị trước đó, trong đó danh mục phụ về thời lượng tải tài nguyên được rút ngắn, nhưng tổng thời gian LCP vẫn giữ nguyên.
Việc rút ngắn thời lượng tải tài nguyên sẽ làm tăng độ trễ hiển thị phần tử mà không làm giảm LCP.

Nguyên nhân là do trên trang này, phần tử LCP bị ẩn cho đến khi mã JavaScript tải xong, sau đó mọi thứ sẽ hiển thị cùng một lúc.

Ví dụ này giúp minh hoạ rằng bạn cần tối ưu hoá tất cả các phần phụ này để đạt được kết quả LCP tốt nhất.

Thời gian tối ưu cho các phần phụ

Để tối ưu hoá từng phần phụ của LCP, điều quan trọng là bạn phải hiểu rõ bảng chi tiết lý tưởng của các phần phụ này trên một trang được tối ưu hoá hiệu quả.

Trong số 4 phần phụ, 2 phần có từ "delay" (độ trễ) trong tên. Đó là gợi ý rằng bạn muốn các thời gian này càng gần bằng 0 càng tốt. Hai phần còn lại liên quan đến các yêu cầu mạng, vốn dĩ mất nhiều thời gian.

Tiểu phần LCP % LCP
Thời gian cho byte đầu tiên Khoảng 40%
Độ trễ khi tải tài nguyên <10%
Thời lượng tải tài nguyên Khoảng 40%
Độ trễ khi hiển thị phần tử <10%
TỔNG CỘNG 100%

Xin lưu ý rằng đây là các nguyên tắc chứ không phải quy tắc nghiêm ngặt. Nếu thời gian LCP trên các trang của bạn luôn nằm trong khoảng 2,5 giây, thì tỷ lệ tương đối không thực sự quan trọng. Tuy nhiên, nếu bạn đang dành nhiều thời gian không cần thiết cho một trong hai phần "đợi", thì sẽ rất khó để liên tục đạt được mục tiêu 2,5 giây.

Bạn có thể xem xét thông tin chi tiết về thời gian LCP theo cách sau:

  • Phần lớn thời gian LCP nên được dùng để tải tài liệu HTML và nguồn LCP.
  • Bất cứ thời điểm nào trước LCP mà một trong hai tài nguyên này không tải là một cơ hội để cải thiện.

Cách tối ưu hoá từng phần

Giờ đây, khi đã hiểu rõ cách phân tích từng thời gian của thành phần phụ LCP trên một trang được tối ưu hoá hiệu quả, bạn có thể bắt đầu tối ưu hoá các trang của riêng mình.

Bốn phần tiếp theo sẽ trình bày các đề xuất và phương pháp hay nhất về cách tối ưu hoá từng phần. Các đề xuất được trình bày theo thứ tự, bắt đầu bằng những đề xuất có khả năng tạo ra tác động lớn nhất.

1. Loại bỏ độ trễ khi tải tài nguyên

Mục tiêu của bước này là đảm bảo tài nguyên LCP bắt đầu tải sớm nhất có thể. Mặc dù về lý thuyết, thời điểm sớm nhất mà tài nguyên có thể bắt đầu tải là ngay sau TTFB, nhưng trên thực tế, luôn có một chút độ trễ trước khi trình duyệt thực sự bắt đầu tải tài nguyên.

Một nguyên tắc hay là tài nguyên LCP của bạn phải bắt đầu tải cùng lúc với tài nguyên đầu tiên mà trang đó tải. Nói cách khác, nếu tài nguyên LCP bắt đầu tải muộn hơn tài nguyên đầu tiên, thì bạn có cơ hội cải thiện.

Biểu đồ thác nước mạng cho thấy tài nguyên LCP bắt đầu sau tài nguyên đầu tiên, cho thấy cơ hội cải thiện
Trên trang này, tài nguyên LCP bắt đầu tải tốt sau khi trang tính kiểu tải trước. Đây là điểm cần cải thiện.

Nhìn chung, có hai yếu tố ảnh hưởng đến tốc độ tải tài nguyên LCP:

  • Khi phát hiện tài nguyên.
  • Mức độ ưu tiên của tài nguyên.

Tối ưu hoá khi phát hiện tài nguyên

Để đảm bảo tài nguyên LCP bắt đầu tải sớm nhất có thể, điều quan trọng là tài nguyên đó phải được trình quét tải trước của trình duyệt phát hiện trong phản hồi tài liệu HTML ban đầu. Ví dụ: trong các trường hợp sau, trình duyệt có thể khám phá tài nguyên LCP bằng cách quét phản hồi tài liệu HTML:

  • Phần tử LCP là một phần tử <img> và các thuộc tính src hoặc srcset của phần tử này có trong mã đánh dấu HTML ban đầu.
  • Phần tử LCP yêu cầu hình nền CSS, nhưng hình ảnh đó được tải trước bằng <link rel="preload"> trong mã đánh dấu HTML (hoặc sử dụng tiêu đề Link).
  • Phần tử LCP là một nút văn bản yêu cầu phông chữ web để hiển thị và phông chữ được tải bằng <link rel="preload"> trong mã đánh dấu HTML (hoặc sử dụng tiêu đề Link).

Dưới đây là một số ví dụ về trường hợp không thể phát hiện tài nguyên LCP khi quét phản hồi tài liệu HTML:

  • Phần tử LCP là một <img> được thêm vào trang một cách linh động bằng JavaScript.
  • Phần tử LCP được tải từng phần bằng một thư viện JavaScript ẩn các thuộc tính src hoặc srcset (thường là data-src hoặc data-srcset).
  • Phần tử LCP yêu cầu hình nền CSS.

Trong mỗi trường hợp như vậy, trình duyệt cần chạy tập lệnh hoặc áp dụng tệp định kiểu (thường phải chờ các yêu cầu mạng hoàn tất) thì mới có thể khám phá tài nguyên LCP và bắt đầu tải tài nguyên đó. Điều này không bao giờ tối ưu.

Để loại bỏ độ trễ tải tài nguyên không cần thiết, tài nguyên LCP của bạn phải được phát hiện từ nguồn HTML. Trong trường hợp tài nguyên chỉ được tham chiếu từ tệp CSS hoặc JavaScript bên ngoài, tài nguyên LCP phải được tải trước với mức độ ưu tiên tìm nạp cao, ví dụ:

<!-- Load the stylesheet that will reference the LCP image. -->
<link rel="stylesheet" href="/path/to/styles.css">

<!-- Preload the LCP image with a high fetchpriority so it starts loading with the stylesheet. -->
<link rel="preload" fetchpriority="high" as="image" href="/path/to/hero-image.webp" type="image/webp">

Tối ưu hoá mức độ ưu tiên của tài nguyên

Ngay cả khi tài nguyên LCP có thể được phát hiện từ mã đánh dấu HTML, tài nguyên này vẫn có thể không bắt đầu tải sớm như tài nguyên đầu tiên. Điều này có thể xảy ra nếu phương thức phỏng đoán ưu tiên của trình quét tải trước trình duyệt không nhận ra tài nguyên đó là quan trọng hoặc nếu phương thức này xác định rằng các tài nguyên khác quan trọng hơn.

Ví dụ: bạn có thể trì hoãn hình ảnh LCP bằng HTML nếu đặt loading="lazy" trên phần tử <img>. Việc sử dụng tính năng tải lười có nghĩa là tài nguyên sẽ không được tải cho đến khi bố cục xác nhận hình ảnh nằm trong khung nhìn, do đó có thể bắt đầu tải muộn hơn so với bình thường.

Ngay cả khi không có tính năng tải từng phần, ban đầu, trình duyệt sẽ không tải hình ảnh ở mức độ ưu tiên cao nhất vì đây không phải là tài nguyên chặn kết xuất. Bạn có thể gợi ý cho trình duyệt về tài nguyên nào quan trọng nhất bằng cách sử dụng thuộc tính fetchpriority cho những tài nguyên có thể hưởng lợi từ mức độ ưu tiên cao hơn:

<img fetchpriority="high" src="/path/to/hero-image.webp">

Bạn nên đặt fetchpriority="high" trên phần tử <img> nếu cho rằng đó có thể là phần tử LCP của trang. Tuy nhiên, việc đặt mức độ ưu tiên cao cho nhiều hình ảnh sẽ khiến việc đặt mức độ ưu tiên không giúp ích gì trong việc giảm LCP.

Bạn cũng có thể giảm mức độ ưu tiên của những hình ảnh có thể xuất hiện sớm trong phản hồi tài liệu nhưng không hiển thị do kiểu, chẳng hạn như hình ảnh trong các trang trình bày băng chuyền không hiển thị khi khởi động:

<img fetchpriority="low" src="/path/to/carousel-slide-3.webp">

Việc giảm mức độ ưu tiên của một số tài nguyên có thể cung cấp nhiều băng thông hơn cho những tài nguyên cần nhiều băng thông hơn. Tuy nhiên, hãy cẩn thận. Luôn kiểm tra mức độ ưu tiên của tài nguyên trong DevTools và kiểm thử các thay đổi bằng công cụ trong phòng thử nghiệm và công cụ thực địa.

Sau khi bạn tối ưu hoá mức độ ưu tiên và thời gian khám phá của tài nguyên LCP, thác nước mạng sẽ có dạng như sau (với tài nguyên LCP bắt đầu cùng lúc với tài nguyên đầu tiên):

Sơ đồ thác nước mạng cho thấy tài nguyên LCP hiện bắt đầu cùng lúc với tài nguyên đầu tiên
Tài nguyên LCP hiện bắt đầu tải cùng lúc với trang kiểu.

2. Loại bỏ độ trễ khi hiển thị phần tử

Mục tiêu của bước này là đảm bảo phần tử LCP có thể hiển thị ngay lập tức sau khi tài nguyên của phần tử đó tải xong, bất kể thời điểm tải là khi nào.

Lý do chính khiến phần tử LCP không thể hiển thị ngay sau khi tài nguyên của phần tử đó tải xong là nếu quá trình hiển thị bị chặn vì một lý do nào đó:

  • Việc hiển thị toàn bộ trang bị chặn do các tệp kiểu hoặc tập lệnh đồng bộ trong <head> vẫn đang tải.
  • Tài nguyên LCP đã tải xong, nhưng phần tử LCP chưa được thêm vào DOM (đang chờ một số mã JavaScript tải).
  • Phần tử này đang bị một số mã khác ẩn, chẳng hạn như thư viện thử nghiệm A/B vẫn đang xác định thử nghiệm nào người dùng sẽ tham gia.
  • Luồng chính bị chặn do các tác vụ dài và công việc kết xuất cần phải đợi cho đến khi các tác vụ dài đó hoàn tất.

Các phần sau đây giải thích cách giải quyết những nguyên nhân phổ biến nhất gây ra độ trễ kết xuất phần tử không cần thiết.

Giảm hoặc đưa các kiểu phông chữ chặn hiển thị vào cùng dòng

Các trang kiểu được tải từ mã đánh dấu HTML sẽ chặn việc hiển thị tất cả nội dung theo sau, điều này là tốt vì bạn thường không muốn hiển thị HTML không có kiểu. Tuy nhiên, nếu trang kiểu quá lớn khiến thời gian tải lâu hơn đáng kể so với tài nguyên LCP, thì trang kiểu đó sẽ ngăn phần tử LCP hiển thị, ngay cả sau khi tài nguyên của phần tử đó đã tải xong, như trong ví dụ sau:

Sơ đồ thác nước mạng cho thấy một tệp CSS lớn chặn quá trình kết xuất phần tử LCP vì tệp này mất nhiều thời gian tải hơn tài nguyên LCP
Hình ảnh và trang kiểu bắt đầu tải cùng một lúc, nhưng hình ảnh không thể hiển thị cho đến khi trang kiểu sẵn sàng.

Để khắc phục vấn đề này, bạn có thể:

  • đưa trang tính kiểu vào HTML để tránh yêu cầu mạng bổ sung; hoặc,
  • giảm kích thước của trang tính kiểu.

Nhìn chung, bạn chỉ nên nội tuyến trang kiểu nếu trang kiểu của bạn có kích thước nhỏ vì nội dung nội tuyến trong HTML không thể hưởng lợi từ việc lưu vào bộ nhớ đệm trong các lần tải trang tiếp theo. Nếu một trang kiểu quá lớn khiến thời gian tải lâu hơn tài nguyên LCP, thì trang kiểu đó có thể không phù hợp để nội tuyến.

Trong hầu hết các trường hợp, cách tốt nhất để đảm bảo rằng trang tính kiểu không chặn quá trình kết xuất phần tử LCP là giảm kích thước của trang tính kiểu để nhỏ hơn tài nguyên LCP. Điều này sẽ đảm bảo rằng đó không phải là nút thắt cổ chai đối với hầu hết các lượt truy cập.

Dưới đây là một số đề xuất để giảm kích thước của trang tính kiểu:

Trì hoãn hoặc nội tuyến JavaScript chặn hiển thị

Hầu như không bao giờ cần thêm tập lệnh đồng bộ (tập lệnh không có thuộc tính async hoặc defer) vào <head> của các trang. Việc này hầu như luôn ảnh hưởng tiêu cực đến hiệu suất.

Trong trường hợp mã JavaScript cần chạy sớm nhất có thể trong quá trình tải trang, tốt nhất bạn nên đưa mã đó vào cùng dòng để quá trình hiển thị không bị trì hoãn khi chờ một yêu cầu mạng khác. Tuy nhiên, giống như các tệp kiểu, bạn chỉ nên đưa các tập lệnh vào cùng dòng nếu chúng rất nhỏ.

Không nên
<head>
  <script src="/path/to/main.js"></script>
</head>
Nên
<head>
  <script>
    // Inline script contents directly in the HTML.
    // IMPORTANT: only do this for very small scripts.
  </script>
</head>

Sử dụng tính năng hiển thị phía máy chủ

Kết xuất phía máy chủ (SSR) là quá trình chạy logic ứng dụng phía máy khách trên máy chủ và phản hồi các yêu cầu tài liệu HTML bằng mã đánh dấu HTML đầy đủ.

Từ góc độ tối ưu hoá LCP, có hai lợi thế chính của SSR:

  • Bạn có thể khám phá tài nguyên hình ảnh của mình từ nguồn HTML (như đã thảo luận trong bước 1 trước đó).
  • Nội dung trang của bạn sẽ không yêu cầu thêm yêu cầu JavaScript để hoàn tất trước khi có thể hiển thị.

Nhược điểm chính của SSR là yêu cầu thêm thời gian xử lý máy chủ, điều này có thể làm chậm TTFB. Tuy nhiên, sự đánh đổi này thường đáng giá vì bạn có thể kiểm soát thời gian xử lý của máy chủ, trong khi bạn không thể kiểm soát khả năng mạng và thiết bị của người dùng.

Một tuỳ chọn tương tự như SSR được gọi là tạo trang web tĩnh (SSG) hoặc kết xuất trước. Đây là quy trình tạo trang HTML trong một bước xây dựng thay vì theo yêu cầu. Nếu có thể kết xuất trước bằng cấu trúc của bạn, thì đây thường là lựa chọn tốt hơn về hiệu suất.

Chia nhỏ các tác vụ dài

Ngay cả khi bạn đã làm theo lời khuyên ở trên và mã JavaScript không chặn việc hiển thị cũng như không chịu trách nhiệm hiển thị các phần tử, thì mã này vẫn có thể làm chậm LCP.

Lý do phổ biến nhất khiến điều này xảy ra là khi các trang tải các tệp JavaScript lớn. Các tệp này cần được phân tích cú pháp và thực thi trên luồng chính của trình duyệt. Điều này có nghĩa là ngay cả khi tài nguyên hình ảnh của bạn được tải xuống đầy đủ, tài nguyên đó vẫn có thể phải đợi cho đến khi một tập lệnh không liên quan thực thi xong thì mới có thể hiển thị.

Tất cả trình duyệt hiện nay đều hiển thị hình ảnh trên luồng chính, tức là mọi thứ chặn luồng chính cũng có thể dẫn đến độ trễ hiển thị phần tử không cần thiết.

3. Giảm thời lượng tải tài nguyên

Mục tiêu của bước này là giảm thời gian chuyển các byte của tài nguyên qua mạng đến thiết bị của người dùng. Nói chung, có 4 cách để thực hiện việc đó:

  • Giảm kích thước của tài nguyên.
  • Giảm khoảng cách mà tài nguyên phải di chuyển.
  • Giảm tình trạng tranh chấp băng thông mạng.
  • Loại bỏ hoàn toàn thời gian mạng.

Giảm kích thước của tài nguyên

Tài nguyên LCP của một trang (nếu có) sẽ là hình ảnh hoặc phông chữ web. Các hướng dẫn sau đây trình bày chi tiết về cách giảm kích thước của cả hai:

Giảm khoảng cách mà tài nguyên phải di chuyển

Ngoài việc giảm kích thước của tài nguyên, bạn cũng có thể giảm thời gian tải bằng cách đặt máy chủ ở vị trí địa lý gần với người dùng nhất có thể. Và cách tốt nhất để làm điều đó là sử dụng mạng phân phối nội dung (CDN).

Đặc biệt, CDN hình ảnh rất hữu ích vì không chỉ giảm khoảng cách mà tài nguyên phải di chuyển, mà còn thường giảm kích thước của tài nguyên – tự động triển khai tất cả các đề xuất giảm kích thước trước đó cho bạn.

Giảm tình trạng tranh chấp băng thông mạng

Ngay cả khi bạn đã giảm kích thước tài nguyên và khoảng cách mà tài nguyên đó phải di chuyển, tài nguyên vẫn có thể mất nhiều thời gian để tải nếu bạn đang tải nhiều tài nguyên khác cùng một lúc. Vấn đề này được gọi là xung đột mạng.

Nếu bạn đã đặt tài nguyên LCP của mình ở mức fetchpriority caobắt đầu tải tài nguyên đó sớm nhất có thể, thì trình duyệt sẽ cố gắng hết sức để ngăn các tài nguyên có mức độ ưu tiên thấp hơn cạnh tranh với tài nguyên đó. Tuy nhiên, nếu bạn đang tải nhiều tài nguyên có fetchpriority cao hoặc nếu bạn chỉ đang tải nhiều tài nguyên nói chung, thì điều này có thể ảnh hưởng đến tốc độ tải tài nguyên LCP.

Loại bỏ hoàn toàn thời gian mạng

Cách tốt nhất để giảm thời gian tải tài nguyên là loại bỏ hoàn toàn mạng khỏi quy trình. Nếu bạn phân phát tài nguyên bằng một chính sách kiểm soát bộ nhớ đệm hiệu quả, thì những khách truy cập yêu cầu tài nguyên đó lần thứ hai sẽ được phân phát từ bộ nhớ đệm, giúp thời lượng tải tài nguyên về cơ bản là bằng 0!

Nếu tài nguyên LCP của bạn là phông chữ web, ngoài việc giảm kích thước phông chữ web, bạn cũng nên cân nhắc xem có cần chặn quá trình kết xuất khi tải tài nguyên phông chữ web hay không. Nếu bạn đặt giá trị font-display thành bất kỳ giá trị nào khác ngoài auto hoặc block, thì văn bản sẽ luôn hiển thị trong khi tải và LCP sẽ không bị chặn trên một yêu cầu mạng bổ sung.

Cuối cùng, nếu tài nguyên LCP của bạn có kích thước nhỏ, bạn nên nội tuyến các tài nguyên đó dưới dạng URL dữ liệu. Việc này cũng sẽ loại bỏ yêu cầu mạng bổ sung. Tuy nhiên, việc sử dụng URL dữ liệu có một số lưu ý vì sau đó, các tài nguyên không thể được lưu vào bộ nhớ đệm và trong một số trường hợp, có thể dẫn đến độ trễ kết xuất lâu hơn do chi phí giải mã bổ sung.

4. Giảm thời gian cho byte đầu tiên

Mục tiêu của bước này là phân phối HTML ban đầu nhanh nhất có thể. Bước này được liệt kê ở cuối vì thường là bước mà nhà phát triển có ít quyền kiểm soát nhất. Tuy nhiên, đây cũng là một trong những bước quan trọng nhất vì nó ảnh hưởng trực tiếp đến mọi bước sau đó. Không có gì có thể xảy ra trên giao diện người dùng cho đến khi phần phụ trợ phân phối byte nội dung đầu tiên đó. Vì vậy, mọi việc bạn có thể làm để tăng tốc TTFB cũng sẽ cải thiện mọi chỉ số tải khác.

Một nguyên nhân thường gặp khiến TTFB chậm đối với một trang web vốn nhanh là do khách truy cập đến thông qua nhiều lệnh chuyển hướng, chẳng hạn như từ quảng cáo hoặc đường liên kết rút gọn. Luôn giảm thiểu số lệnh chuyển hướng mà khách truy cập phải chờ.

Một nguyên nhân phổ biến khác là khi không thể sử dụng nội dung được lưu vào bộ nhớ đệm từ máy chủ biên CDN và tất cả yêu cầu phải được chuyển hướng về máy chủ gốc. Điều này có thể xảy ra nếu khách truy cập sử dụng các tham số URL riêng biệt cho mục đích phân tích, ngay cả khi các tham số đó không dẫn đến các trang khác nhau.

Để biết hướng dẫn cụ thể về cách tối ưu hoá TTFB, hãy tham khảo hướng dẫn tối ưu hoá TTFB.

Theo dõi bảng chi tiết về LCP trong JavaScript

Bạn có thể xem thông tin về thời gian của tất cả các phần phụ của LCP đã thảo luận trước đó trong JavaScript thông qua sự kết hợp của các API hiệu suất sau:

Nhiều sản phẩm RUM đã tính toán các thành phần phụ bằng các API này. Thư viện web-vitals cũng bao gồm các thời gian của các phần phụ LCP này trong bản dựng mô hình phân bổ và bạn có thể tham khảo mã của thư viện này để biết cách tính các thời gian này trong JavaScript.

Công cụ của Chrome cho nhà phát triển và Lighthouse cũng đo lường các phần phụ này như trong ảnh chụp màn hình trước, giúp bạn không cần phải tính toán các phần phụ đó theo cách thủ công trong JavaScript khi sử dụng các công cụ đó.

Tóm tắt

LCP là một chỉ số phức tạp và thời điểm đo lường có thể chịu ảnh hưởng của một số yếu tố. Tuy nhiên, nếu bạn xem xét việc tối ưu hoá LCP chủ yếu là tối ưu hoá tải của tài nguyên LCP, thì việc này có thể đơn giản hoá đáng kể mọi thứ.

Nhìn chung, bạn có thể tóm tắt quy trình tối ưu hoá LCP trong 4 bước sau:

  1. Đảm bảo tài nguyên LCP bắt đầu tải càng sớm càng tốt.
  2. Đảm bảo phần tử LCP có thể hiển thị ngay khi tài nguyên của phần tử đó tải xong.
  3. Giảm thời gian tải tài nguyên LCP nhiều nhất có thể mà không làm giảm chất lượng.
  4. Cung cấp tài liệu HTML ban đầu nhanh nhất có thể.

Nếu có thể làm theo các bước này trên trang của mình, bạn có thể yên tâm rằng mình đang mang đến trải nghiệm tải tối ưu cho người dùng và bạn sẽ thấy điều đó được phản ánh trong điểm số LCP thực tế.