Cách Trendsol giảm INP, giúp tỷ lệ nhấp tăng 1%

Nghiên cứu điển hình này mô tả quy trình từng bước để gỡ lỗi và cải thiện INP trong React được Trendyol sử dụng bằng cách tận dụng các công cụ của Google như PageSpeed Insights (PSI), Công cụ của Chrome cho nhà phát triểnscheduler.yield API.

Hai thành phần quan trọng của bất kỳ trang web thương mại điện tử nào là Trang danh sách sản phẩm (PLP) và Trang chi tiết sản phẩm (PDP). Lưu lượng truy cập thương mại điện tử thường đến từ trang thông tin sản phẩm, cho dù là thông qua chiến dịch tiếp thị qua email, mạng xã hội hay quảng cáo. Do đó, điều tối quan trọng là phải đảm bảo trải nghiệm PLP được thiết kế cẩn thận để giảm thời gian cần thiết để mua hàng. Ưu tiên chất lượng trải nghiệm người dùng là yếu tố thiết yếu để đạt được thành công. Ấn phẩm nghiên cứu chẳng hạn như Milligiây Make Mai đã cho biết tác động của hiệu suất web đến người tiêu dùng mức độ sẵn sàng chi tiền và tương tác với các thương hiệu trực tuyến.

Trendyol là một nền tảng thương mại điện tử có khoảng 30 triệu khách hàng và 240.000 người bán, thúc đẩy chúng tôi trở thành doanh nghiệp đầu tiên ở Thổ Nhĩ Kỳ với định giá hơn 10 tỷ USD và là một trong những nền tảng thương mại điện tử hàng đầu tại thế giới.

Để đạt được mục tiêu cung cấp trải nghiệm người dùng tốt nhất có thể trên quy mô lớn mà vẫn duy trì được tính linh hoạt của nội dung và làm việc với phiên bản cũ hơn React, Hàn Quốc tập trung vào Lượt tương tác với nội dung hiển thị tiếp theo (INP) làm chỉ số chính để để cải thiện. Nghiên cứu điển hình này mô tả hành trình cải thiện INP của Tensorol trên PLP, giúp giảm 50% INPtăng 1% trên kết quả tìm kiếm kết quả kinh doanh.

Quy trình điều tra INP của Hàn Quốc

INP đo lường khả năng phản hồi của trang web đối với hoạt động đầu vào của người dùng. Một INP tốt cho biết rằng trình duyệt có thể phản hồi nhanh chóng và đáng tin cậy tất cả hoạt động đầu vào của người dùng và vẽ lại trang, đây là thành phần quan trọng để mang đến trải nghiệm tốt cho người dùng.

Hành trình cải thiện INP (Lượt tương tác đến nội dung) trên PLP của Tenorol bắt đầu bằng một phân tích kỹ lưỡng về trải nghiệm người dùng trước khi thực hiện bất kỳ cải tiến nào. Dựa trên báo cáo PSI, trải nghiệm người dùng thực tế của PLP có INP là 963 mili giây trên di động, như được minh hoạ trong hình tiếp theo.

INP của Tensorol theo chỉ số CrUX trong PageSpeed Insights. Chỉ số INP (tính đến ngày 5/9/2023) của Tenorol là 963 mili giây, tức là ở mức "kém" dải ô.
Số liệu báo cáo trước đó về INP của Hàn Quốc, tính đến ngày 5 tháng 9 năm 2023 (theo PSI).

Để đảm bảo khả năng thích ứng tốt, chủ sở hữu trang web nên nhắm đến INP thấp hơn hoặc bằng 200 mili giây, tức là vào thời điểm đó, INP của Tenorol nằm ở "kém" dải ô.

Thật may, PSI cung cấp cả hai dữ liệu trường cho các trang có trong phần Người dùng Chrome Báo cáo trải nghiệm (CrUX) và dữ liệu chẩn đoán chi tiết trong phòng thí nghiệm. Xem xét phòng thí nghiệm dữ liệu, kết quả kiểm tra thời gian thực thi JavaScript của Lighthouse cho thấy rằng Tập lệnh search-result-v2 đã chiếm luồng chính nhiều hơn so với các tập lệnh khác tập lệnh trên trang.

Tài liệu về các nguồn thực hiện những nhiệm vụ dài trong Lighthouse cho trang web của Tenorol. Một trong những nguồn chính để thực hiện công việc dài là một tập lệnh xử lý kết quả tìm kiếm trên PLP của Tenorol.
Kiểm tra Thời gian thực thi JavaScript của Wideol từ Lighthouse kể từ tháng 9 Ngày 5 tháng 5 năm 2023 của PSI.

Để xác định điểm tắc nghẽn trong thực tế, chúng tôi đã sử dụng bảng hiệu suất trong Chrome Công cụ cho nhà phát triển để khắc phục sự cố về trải nghiệm PLP và xác định nguồn gốc của vấn đề. Mô phỏng hiệu suất trên thiết bị di động với chế độ làm chậm CPU gấp 4 lần trong Công cụ cho nhà phát triển của Chrome đã tiết lộ một tác vụ dài 700-900 mili giây trên luồng chính. Nếu số điện thoại chính bị chiếm dụng bởi các tác vụ khác trong hơn 50 mili giây thì nó có thể không thể phản hồi thông tin đầu vào của người dùng kịp thời, dẫn đến trải nghiệm người dùng.

Ảnh chụp màn hình một phiên lập hồ sơ hiệu suất trong Công cụ của Chrome cho nhà phát triển đối với PLP của Tenorol. Tác vụ dài được mô tả chạy trong 737, 6 mili giây và là một phần của lệnh gọi lại Intersection Observer.
Một trình phân tích hiệu suất cho các nhiệm vụ dài trên PLP của Tenorol trong phần biểu diễn trong Công cụ của Chrome cho nhà phát triển.

Tác vụ mất nhiều thời gian nhất do lệnh gọi lại Intersection Observer API gây ra trên tập lệnh kết quả tìm kiếm bên trong thành phần React. Đến đây, chúng tôi bắt đầu xem xét chia nhỏ tác vụ mất nhiều thời gian đó thành các phần nhỏ để cung cấp cho trình duyệt cơ hội phản hồi những công việc có mức độ ưu tiên cao hơn, bao gồm cả tương tác của người dùng.

Hoá ra là việc sử dụng thao tác setState để kích hoạt React việc kết xuất lại bên trong lệnh gọi lại Intersection Observer sẽ tốn chi phí cao, Đây có thể là vấn đề đối với các thiết bị cấp thấp vì chiếm luồng chính trong quá dài.

Một phương pháp mà các nhà phát triển đã sử dụng để chia nhỏ công việc thành các nhiệm vụ nhỏ hơn liên quan đến setTimeout. Chúng tôi đã sử dụng kỹ thuật này để hoãn việc thực thi Lệnh gọi setState vào một tác vụ riêng. Mặc dù setTimeout cho phép trì hoãn Việc thực thi JavaScript không cung cấp bất kỳ quyền kiểm soát nào đối với mức độ ưu tiên. Điều này đã dẫn đến chúng tôi tham gia bản dùng thử theo nguyên gốc scheduler.yield nhằm nỗ lực đảm bảo tiếp tục thực thi tập lệnh sau khi chuyển sang luồng chính:

/*
* Yielding method using scheduler.yield, falling back to setTimeout:
*/
async function yieldToMain() {
  if('scheduler' in window && 'yield' in scheduler) {
    return await scheduler.yield();
  }

  return new Promise(resolve => {
    setTimeout(resolve, 0);
  });
}

/*
* Yielding to the main thread before changing the state of the component:
*/
const observer = new IntersectionObserver((entries) => {
  entries.forEach(handleIntersection);
  const maxNumberOfEntries = Math.max(...this.intersectingEntries);

  if (Number.isFinite(maxNumberOfEntries)) {
    await this.yieldToMain();

    this.setState({ count: maxNumberOfEntries });
  }
}, { threshold: 0.5 });

Việc thêm phương thức tạo ra này vào mã PLP đã giúp cải thiện INP, vì tác vụ chính dài đã được chia thành một loạt các nhiệm vụ nhỏ hơn, cho phép công việc có mức độ ưu tiên cao hơn—chẳng hạn như các tương tác của người dùng và công việc kết xuất tiếp theo—để diễn ra sớm hơn so với dự kiến.

Ảnh chụp màn hình một phiên lập hồ sơ hiệu suất trong Công cụ của Chrome cho nhà phát triển đối với PLP của Tenorol. Tác vụ dài trước đây chạy trong 737,6 mili giây hiện được chia thành nhiều tác vụ nhỏ hơn.
Hãy chia việc cần làm thành các phần nhỏ hơn.

Lưu ý rằng Tensorol sử dụng khung PuzzleJs để triển khai giao diện người dùng vi mô bằng React v16.9.0. Với React 18, hiệu suất tương tự có thể đạt được đã đạt được, nhưng vì một số lý do, Duetol không thể nâng cấp tại thời điểm này bất cứ lúc nào.

Kết quả kinh doanh

Để đo lường tác động của việc cải thiện INP được triển khai, chúng tôi đã chạy thử nghiệm A/B để xem các chỉ số kinh doanh bị ảnh hưởng như thế nào. Nhìn chung, những thay đổi của chúng tôi đối với PLP đã giúp trong một sự cải thiện đáng kể, bao gồm giảm 50% INP cũng như giảm 1% là mức tăng tỷ lệ nhấp từ trang thông tin đến trang chi tiết sản phẩm trên mỗi phiên người dùng. Trong hình bên dưới, bạn có thể thấy INP được cải thiện như thế nào trên PLP theo thời gian:

Ảnh chụp màn hình INP phân vị thứ 75 của Tenorol trong suốt 6 tháng. Đến cuối sáu tháng, INP của Tenorol giảm xuống gần 650 mili giây từ gần 1.400 mili giây.
Mức độ cải thiện INP ở bách phân vị thứ 75 theo thời gian.

Kết luận

Tối ưu hoá INP là một quá trình phức tạp và lặp đi lặp lại, nhưng có thể thực hiện dễ dàng hơn bằng quy trình làm việc rõ ràng. Một phương pháp đơn giản để gỡ lỗi và cải thiện INP của trang web phụ thuộc vào việc bạn có đang thu thập dữ liệu trường của riêng mình hay không. Nếu bạn PSI và Lighthouse là một điểm khởi đầu tốt. Khi bạn đã xác định được trang có vấn đề, bạn có thể sử dụng Công cụ cho nhà phát triển để tìm hiểu kỹ hơn nhằm cố tái tạo vấn đề.

Đôi khi chuyển đến luồng chính để cung cấp thêm cho trình duyệt cơ hội để thực hiện các công việc khẩn cấp sẽ làm cho trang web của bạn phản hồi nhanh hơn, đảm bảo rằng khách hàng của bạn sẽ có trải nghiệm người dùng tốt hơn. API lập lịch mới hơn như scheduler.yield(), giúp công việc này trở nên dễ dàng hơn.

Xin đặc biệt cảm ơn Jeremy Wagner, Barry Poleard và Houssein Djirdeh của kênh Google và Nhóm kỹ thuật của Tenorol vì những đóng góp của họ trong công trình này.