Thích ứng với người dùng bằng Gợi ý của khách hàng

Việc phát triển các trang web có tốc độ nhanh ở mọi nơi có thể là một khách hàng tiềm năng khó nhằn. Vô vàn khả năng của thiết bị—và chất lượng của mạng mà chúng kết nối có thể khiến công việc này dường như là một nhiệm vụ không thể vượt qua. Mặc dù chúng tôi có thể thực hiện tận dụng các tính năng của trình duyệt để cải thiện hiệu suất tải, làm cách nào để chúng ta biết khả năng của thiết bị của người dùng hoặc chất lượng mạng của họ kết nối không? Giải pháp là khách hàng gợi ý!

Gợi ý ứng dụng khách là một tập hợp các tiêu đề yêu cầu HTTP lựa chọn tham gia nhằm cung cấp cho chúng tôi thông tin chi tiết về những khía cạnh này của thiết bị của người dùng và mạng mà họ kết nối. Theo khi khai thác phía máy chủ thông tin này, chúng ta có thể thay đổi cách phân phối dựa trên điều kiện thiết bị và/hoặc mạng. Điều này có thể giúp chúng tôi tạo ra trải nghiệm người dùng hoà nhập hơn.

Thương lượng nội dung

Gợi ý ứng dụng là một phương pháp khác để thương lượng nội dung, tức là thay đổi phản hồi nội dung dựa trên tiêu đề của yêu cầu của trình duyệt.

Một ví dụ về thương lượng nội dung bao gồm Accept tiêu đề của yêu cầu. Tài liệu này mô tả loại nội dung mà trình duyệt hiểu được, mà máy chủ có thể sử dụng để thương lượng phản hồi. Đối với yêu cầu về hình ảnh, nội dung trong tiêu đề Accept của Chrome là:

Accept: image/webp,image/apng,image/*,*/*;q=0.8

Mặc dù tất cả trình duyệt đều hỗ trợ các định dạng hình ảnh như JPEG, PNG và GIF, nhưng nút Chấp nhận cho biết Trong trường hợp này, trình duyệt cũng hỗ trợ WebPAPNG. Nhờ thông tin này, chúng tôi có thể thương lượng các loại hình ảnh tốt nhất cho từng trình duyệt:

<?php
// Check Accept for an "image/webp" substring.
$webp = stristr($_SERVER["HTTP_ACCEPT"], "image/webp") !== false ? true : false;

// Set the image URL based on the browser's WebP support status.
$imageFile = $webp ? "whats-up.webp" : "whats-up.jpg";
?>
<img src="<?php echo($imageFile); ?>" alt="I'm an image!">

Giống như Accept, gợi ý khách hàng là một cách khác để thương lượng nội dung, nhưng trong bối cảnh về khả năng của thiết bị và điều kiện mạng. Với gợi ý từ khách hàng, chúng tôi có thể đưa ra quyết định về hiệu suất phía máy chủ dựa trên cá nhân trải nghiệm người dùng, chẳng hạn như quyết định xem có nên phân phát các tài nguyên không quan trọng cho người dùng có điều kiện mạng kém. Trong hướng dẫn này, chúng tôi sẽ mô tả tất cả các gợi ý có sẵn và một số cách sử dụng chúng để giúp nội dung được phân phối hiệu quả hơn phù hợp với người dùng.

Chọn tham gia

Không giống như tiêu đề Accept, gợi ý ứng dụng không chỉ xuất hiện một cách kỳ diệu (với ngoại lệ của Save-Data mà chúng ta sẽ thảo luận sau). Nhằm duy trì của yêu cầu ở mức tối thiểu, bạn sẽ cần chọn sử dụng gợi ý ứng dụng khách nào muốn nhận bằng cách gửi tiêu đề Accept-CH khi người dùng yêu cầu tài nguyên:

Accept-CH: Viewport-Width, Downlink

Giá trị của Accept-CH là danh sách các gợi ý được yêu cầu được phân tách bằng dấu phẩy trên trang web sẽ sử dụng trong việc xác định kết quả cho yêu cầu tài nguyên tiếp theo. Khi khách hàng đọc tiêu đề này, tức là có thông báo "trang web này muốn có Viewport-WidthDownlink gợi ý ứng dụng khách." Đừng lo lắng về các gợi ý cụ thể. Chúng tôi sẽ trả lời các câu hỏi đó sau giây lát.

Bạn có thể đặt các tiêu đề chọn tham gia này bằng bất kỳ ngôn ngữ phụ trợ nào. Ví dụ: PHP Bạn có thể sử dụng hàm header. Bạn thậm chí có thể đặt các tiêu đề chọn tham gia này bằng http-equiv thuộc tính trên thẻ <meta>:

<meta http-equiv="Accept-CH" content="Viewport-Width, Downlink" />

Tất cả gợi ý của khách hàng!

Gợi ý về ứng dụng mô tả một trong hai nội dung: thiết bị mà người dùng sử dụng, cách sử dụng và mạng mà họ đang dùng để truy cập vào trang web của bạn. Hãy cùng xem nhanh tất cả các gợi ý có sẵn.

Gợi ý về thiết bị

Một số gợi ý của ứng dụng mô tả các đặc điểm về thiết bị của người dùng, thường là màn hình đặc điểm. Một vài công cụ trong số đó có thể giúp bạn chọn tài nguyên đa phương tiện tối ưu cho màn hình của một người dùng nhất định, nhưng không phải tất cả màn hình đều tập trung vào phương tiện truyền thông.

Trước khi chúng ta tìm hiểu danh sách này, có thể bạn nên tìm hiểu một vài thuật ngữ chính thường dùng để mô tả màn hình và độ phân giải của nội dung nghe nhìn:

Kích thước nội tại: Kích thước thực tế của tài nguyên nội dung nghe nhìn. Ví dụ: nếu bạn mở một hình ảnh trong Photoshop, kích thước được hiển thị trong hộp thoại kích thước hình ảnh mô tả kích thước nội tại của nó.

Kích thước nội tại được điều chỉnh theo mật độ: các kích thước của tài nguyên nội dung đa phương tiện sau nó đã được sửa cho mật độ pixel. Đó là kích thước nội tại của hình ảnh chia cho pixel thiết bị . Ví dụ: chúng ta hãy cùng xem mã đánh dấu này:

<img
  src="whats-up-1x.png"
  srcset="whats-up-2x.png 2x, whats-up-1x.png 1x"
  alt="I'm that image you wanted."
/>

Giả sử kích thước nội tại của hình ảnh 1x trong trường hợp này là 320x240 và Kích thước nội tại của hình ảnh 2x là 640x480. Nếu mã đánh dấu này được khách hàng phân tích cú pháp được cài đặt trên một thiết bị có tỷ lệ pixel của thiết bị màn hình là 2 (ví dụ: màn hình Retina màn hình), hình ảnh 2x sẽ được yêu cầu. Kích thước nội tại được điều chỉnh theo mật độ của hình ảnh 2x là 320x240, vì 640x480 chia cho 2 là 320x240.

Kích thước bên ngoài: kích thước của tài nguyên đa phương tiện sau CSS và bố cục khác các yếu tố (chẳng hạn như các thuộc tính widthheight) đã được áp dụng cho yếu tố đó. Hãy giả sử bạn có một phần tử <img> tải một hình ảnh có mật độ đã được chỉnh sửa kích thước nội tại là 320x240, nhưng cũng có các thuộc tính CSS widthheight có giá trị 256px192px được áp dụng tương ứng. Trong ví dụ này, kích thước bên ngoài của phần tử <img> đó trở thành 256x192.

Hình minh hoạ kích thước nội tại so với
kích thước bên ngoài. Một hộp có kích thước 320x240 pixel hiển thị với nhãn INTRINSIC
KÍCH THƯỚC. Bên trong nó là một hộp nhỏ hơn với kích thước 256x192 pixel, đại diện cho
Phần tử img HTML có áp dụng CSS. Hộp này được gắn nhãn EXTRINSIC
KÍCH THƯỚC. Ở bên phải là một hộp chứa CSS được áp dụng cho phần tử
sửa đổi bố cục của phần tử img để kích thước bên ngoài của nó khác
từ kích thước nội tại của nó.
Hình 1. Hình minh hoạ sự so sánh giữa hàm nội tại và kích thước bên ngoài. Hình ảnh đạt được kích thước bên ngoài sau khi đã có các yếu tố bố cục được áp dụng cho nội dung đó. Trong trường hợp này, việc áp dụng các quy tắc CSS của width: 256px;height: 192px; biến đổi hình ảnh có kích thước sẵn có 320x240 thành hình ảnh có kích thước cực lớn 256x192.

Chúng ta hãy xem qua một số thuật ngữ, hãy đi vào danh sách gợi ý khách hàng có sẵn cho bạn.

Chiều rộng khung nhìn

Viewport-Width là chiều rộng khung nhìn của người dùng, tính bằng pixel CSS:

Viewport-Width: 320

Bạn có thể sử dụng gợi ý này với các gợi ý khác dành riêng cho từng màn hình để đưa ra những gợi ý khác nhau phương pháp xử lý (tức là cắt ảnh) của một hình ảnh tối ưu cho các kích thước màn hình cụ thể (ví dụ: nghệ thuật chỉ đường), hoặc bỏ qua các tài nguyên không cần thiết cho chiều rộng màn hình hiện tại.

DPR

DPR (viết tắt của từ viết tắt tỷ lệ pixel của thiết bị) báo cáo tỷ lệ pixel vật lý so với CSS pixel trên màn hình của người dùng:

DPR: 2

Gợi ý này rất hữu ích khi chọn các nguồn hình ảnh tương ứng với mật độ pixel (như phần mô tả x thực hiện trong srcset ).

Chiều rộng

Gợi ý Width xuất hiện trên các yêu cầu về tài nguyên hình ảnh được <img> kích hoạt hoặc Thẻ <source> sử dụng sizes . sizes cho trình duyệt biết kích thước bên ngoài của tài nguyên đó; Width sử dụng kích thước bên ngoài đó để yêu cầu một hình ảnh có kích thước nội tại là tối ưu cho bố cục hiện tại.

Ví dụ: giả sử người dùng yêu cầu một trang có màn hình rộng 320 pixel CSS với DPR là 2. Thiết bị tải một tài liệu có phần tử <img> chứa giá trị thuộc tính sizes85vw (ví dụ: 85% chiều rộng khung nhìn cho tất cả kích thước màn hình). Nếu chọn sử dụng gợi ý Width, khách hàng sẽ gửi Width này sẽ gợi ý đến máy chủ cùng với yêu cầu cho src của <img>:

Width: 544

Trong trường hợp này, máy khách đang gợi ý cho máy chủ rằng một hàm nội tại tối ưu chiều rộng của hình ảnh được yêu cầu sẽ là 85% chiều rộng của khung nhìn (272 pixel) nhân với DPR của màn hình (2), bằng 544 pixel.

Gợi ý này đặc biệt mạnh mẽ vì không chỉ tính đến chiều rộng được điều chỉnh theo mật độ của màn hình, nhưng cũng điều chỉnh phần quan trọng này thông tin với kích thước bên ngoài của hình ảnh trong bố cục. Điều này mang lại cho các máy chủ cơ hội thương lượng phản hồi hình ảnh tối ưu cho cả hai màn hình bố cục.

DPR nội dung

Mặc dù bạn đã biết rằng màn hình có tỷ lệ pixel của thiết bị, nhưng các tài nguyên cũng có có tỷ lệ pixel riêng. Trong các trường hợp sử dụng lựa chọn tài nguyên đơn giản nhất, pixel tỷ lệ giữa thiết bị và tài nguyên có thể giống nhau. Tuy nhiên! Trong trường hợp cả hai các tiêu đề DPRWidth đang hoạt động, kích thước bên ngoài của tài nguyên có thể tạo ra các tình huống trong đó hai yếu tố khác nhau. Đây là nơi gợi ý Content-DPR bắt đầu phát huy tác dụng.

Không giống như các gợi ý khác của ứng dụng, Content-DPR không phải là tiêu đề yêu cầu để sử dụng mà là máy chủ tiêu đề phản hồi phải gửi bất cứ khi nào DPR và Gợi ý Width dùng để chọn tài nguyên. Giá trị của Content-DPR phải là kết quả của phương trình này:

Content-DPR = [Kích thước tài nguyên hình ảnh đã chọn] / ([Width] / [DPR])

Khi tiêu đề của yêu cầu Content-DPR được gửi, trình duyệt sẽ biết cách mở rộng quy mô hình ảnh đã cho cho bố cục và tỷ lệ pixel của thiết bị trên màn hình. Nếu không có dịch vụ này, hình ảnh có thể không điều chỉnh được theo tỷ lệ.

Bộ nhớ thiết bị

Về mặt kỹ thuật, đây là một phần của Bộ nhớ thiết bị API, Device-Memory cho biết các số tiền gần đúng kỷ niệm thiết bị hiện tại có trong GiB:

Device-Memory: 2

Trường hợp có thể sử dụng gợi ý này là giảm lượng JavaScript được gửi đến các trình duyệt trên những thiết bị có bộ nhớ hạn chế, vì JavaScript là các trình duyệt loại nội dung chuyên sâu về tài nguyên thường tải. Hoặc bạn có thể gửi hình ảnh DPR thấp hơn vì chúng sử dụng ít bộ nhớ hơn để giải mã.

Gợi ý về mạng

Network Information API cung cấp một danh mục gợi ý về ứng dụng mô tả hiệu suất mạng của người dùng kết nối. Theo tôi, đây là bộ gợi ý hữu ích nhất. Với họ, chúng tôi có thể điều chỉnh trải nghiệm cho phù hợp với người dùng bằng cách thay đổi cách chúng tôi cung cấp cho máy khách trên các kết nối chậm.

RTT

Gợi ý RTT cung cấp Thời gian trọn vòng gần đúng, tính bằng mili giây, bật lớp ứng dụng. Gợi ý RTT, không giống như RTT của lớp truyền tải, bao gồm thời gian xử lý của máy chủ.

RTT: 125

Gợi ý này hữu ích vì độ trễ đóng vai trò quan trọng trong hiệu suất tải. Bằng cách sử dụng gợi ý RTT, chúng ta có thể đưa ra quyết định dựa trên khả năng phản hồi của mạng, giúp tăng tốc độ phân phối toàn bộ trải nghiệm (ví dụ: thông qua bỏ qua một số yêu cầu).

Mặc dù độ trễ là yếu tố quan trọng trong việc tải hiệu suất nhưng băng thông cũng có ảnh hưởng, của Google. Gợi ý Downlink, được biểu thị bằng megabit/giây (Mb/giây), cho biết Tốc độ kết nối của người dùng ước chừng về sau:

Downlink: 2.5

Cùng với RTT, Downlink có thể hữu ích trong việc thay đổi cách thức nội dung được phân phối cho người dùng dựa trên chất lượng của kết nối mạng.

ECT

Gợi ý ECT là viết tắt của effective Connection Type (Loại kết nối hiệu quả). Giá trị của nó là một trong những danh sách liệt kê các loại kết nối, mỗi loại mô tả một kết nối trong phạm vi được chỉ định của cả RTTDownlink giá trị.

Tiêu đề này không giải thích loại kết nối thực tế là gì—đối với ví dụ: cổng vào không báo cáo liệu cổng vào của bạn là trạm phát sóng hay là quyền truy cập Wi-Fi điểm. Thay vào đó, công cụ này phân tích độ trễ, băng thông của kết nối hiện tại và sẽ xác định hồ sơ mạng giống với hồ sơ đó nhất. Ví dụ: nếu bạn kết nối qua Wi-Fi đến một mạng chậm, ECT có thể được điền sẵn giá trị là 2g, đây là kết nối gần đúng nhất của kết nối hiệu quả:

ECT: 2g

Các giá trị hợp lệ cho ECT4g, 3g, 2gslow-2g. Gợi ý này có thể là được sử dụng làm điểm bắt đầu để đánh giá chất lượng kết nối, sau đó được tinh chỉnh bằng các gợi ý RTTDownlink.

Tiết kiệm dữ liệu

Save-Data không phải là gợi ý mô tả tình trạng mạng vì đó là người dùng lựa chọn ưu tiên nêu rõ rằng các trang sẽ gửi ít dữ liệu hơn.

Tôi muốn phân loại Save-Data là gợi ý mạng vì có nhiều điều bạn sẽ thực hiện tương tự như các gợi ý mạng khác. Người dùng cũng có thể có thể bật chế độ này trong môi trường có độ trễ cao/băng thông thấp. Gợi ý này, khi hiện tại, luôn có dạng như sau:

Save-Data: on

Tại Google, chúng tôi đã thảo luận về những việc bạn có thể làm với Save-Data. Tác động của hệ thống đối với hiệu suất có thể rất lớn. Đó là tín hiệu cho biết người dùng theo đúng nghĩa đen là yêu cầu bạn gửi cho họ ít nội dung hơn! Nếu bạn lắng nghe và hành động dựa trên điều đó của Google, người dùng sẽ đánh giá cao điều đó.

Cùng nhau hợp tác

Những việc bạn làm với gợi ý về ứng dụng phụ thuộc vào bạn. Vì chúng cung cấp rất nhiều thông tin, bạn có nhiều lựa chọn. Để có một số ý tưởng tuôn trào, hãy cùng tìm hiểu gợi ý ứng dụng khách có thể làm cho Sconnie Gỗ, một loại gỗ hư cấu đặt tại vùng nông thôn miền Trung Trung Tây. Như thường lệ trong các trường hợp , kết nối mạng có thể yếu. Đây là nơi công nghệ như gợi ý của ứng dụng có thể thực sự tạo ra sự khác biệt cho người dùng.

Hình ảnh thích ứng

Tất cả trừ những trường hợp sử dụng hình ảnh thích ứng đơn giản nhất có thể trở nên phức tạp. Nếu bạn có nhiều cách xử lý các biến thể của cùng một hình ảnh cho các màn hình khác nhau kích thước— định dạng khác nhau không? Mã đánh dấu đó rất phức tạp rất . Rất dễ bị nhầm lẫn, và cũng dễ quên hoặc hiểu lầm là quan trọng các khái niệm khác (chẳng hạn như sizes).

Mặc dù <picture>srcset không thể phủ nhận là những công cụ tuyệt vời, nhưng chúng có thể tốn thời gian phát triển và duy trì cho các trường hợp sử dụng phức tạp. Chúng tôi có thể tự động hoá bạn có thể tạo mã đánh dấu, nhưng việc này cũng khó khăn do chức năng <picture>srcset cung cấp đủ phức tạp để đáp ứng nhu cầu tự động hoá được thực hiện theo cách duy trì tính linh hoạt mà chúng mang lại.

Gợi ý ứng dụng có thể giúp đơn giản hoá việc này. Đang thương lượng về phản hồi bằng hình ảnh với khách hàng gợi ý sẽ có dạng như sau:

  1. Nếu phù hợp với quy trình làm việc của bạn, trước tiên, hãy chọn một hình ảnh xử lý (tức là hình ảnh định hướng nghệ thuật) bằng cách chọn gợi ý Viewport-Width.
  2. Chọn độ phân giải hình ảnh bằng cách kiểm tra gợi ý Width và gợi ý DPR, và chọn nguồn phù hợp với kích thước bố cục và mật độ màn hình của hình ảnh (tương tự về cách hoạt động của trình mô tả xw trong srcset).
  3. Chọn định dạng tệp tối ưu nhất mà trình duyệt hỗ trợ (định dạng Accept giúp chúng tôi làm được trong hầu hết các trình duyệt).

Khi nghĩ rằng khách hàng của công ty gỗ hư cấu của tôi, tôi đã ngây thơ quy trình chọn hình ảnh thích ứng trong PHP sử dụng gợi ý ứng dụng. Điều này có nghĩa là thay vì gửi mã đánh dấu này cho tất cả người dùng:

<picture>
  <source
    srcset="
      company-photo-256w.webp   256w,
      company-photo-512w.webp   512w,
      company-photo-768w.webp   768w,
      company-photo-1024w.webp 1024w,
      company-photo-1280w.webp 1280w
    "
    type="image/webp"
  />
  <img
    srcset="
      company-photo-256w.jpg   256w,
      company-photo-512w.jpg   512w,
      company-photo-768w.jpg   768w,
      company-photo-1024w.jpg 1024w,
      company-photo-1280w.jpg 1280w
    "
    src="company-photo-256w.jpg"
    sizes="(min-width: 560px) 251px, 88.43vw"
    alt="The Sconnie Timber Staff!"
  />
</picture>

Tôi đã có thể giảm xuống mức sau dựa trên sự hỗ trợ của từng trình duyệt:

<img
  src="/image/sizes:true/company-photo.jpg"
  sizes="(min-width: 560px) 251px, 88.43vw"
  alt="SAY CHEESY PICKLES."
/>

Trong ví dụ này, URL /image là một tập lệnh PHP, theo sau là các tham số viết lại bởi mod_rewrite. Nó lấy tên tệp hình ảnh và các tham số bổ sung để giúp tập lệnh phụ trợ chọn hình ảnh tốt nhất trong điều kiện đã cho.

Tôi hiểu "Nhưng không chỉ là triển khai lại <picture>srcset trên không?" là câu hỏi đầu tiên của bạn.

Có, nhưng có một điểm khác biệt quan trọng là: khi một ứng dụng sử dụng gợi ý của khách hàng để tạo ra câu trả lời cho nội dung đa phương tiện, hầu hết (nếu không phải là tất cả) công việc là dễ tự động hoá hơn. Bạn có thể sử dụng một dịch vụ (chẳng hạn như CDN) để thực hiện việc này thay mặt bạn. Trái lại, với giải pháp HTML, bạn cần ghi mã đánh dấu mới vào cung cấp cho mọi trường hợp sử dụng. Chắc chắn là bạn có thể tự động tạo mã đánh dấu. Nếu thiết kế hoặc yêu cầu thay đổi, có thể bạn vẫn cần xem lại chiến lược tự động hoá của mình trong tương lai.

Gợi ý khách hàng giúp bạn có thể bắt đầu với hình ảnh không tổn hao, độ phân giải cao hình ảnh sau đó có thể được đổi kích thước linh động để tối ưu cho bất kỳ cách kết hợp nào màn hình và bố cục. Không giống như srcset, đòi hỏi bạn phải liệt kê một giá trị cố định danh sách hình ảnh có thể dùng để trình duyệt chọn, phương pháp này có thể linh hoạt hơn. Trong khi srcset buộc bạn cung cấp cho trình duyệt một tập hợp tương đối gồm nhiều biến thể, chẳng hạn như 256w, 512w, 768w1024w – một gợi ý của ứng dụng có thể phân phát ở mọi chiều rộng mà không cần phải có quá nhiều mã đánh dấu.

Tất nhiên, bạn không phải tự viết logic lựa chọn hình ảnh. Đám mây sử dụng gợi ý của ứng dụng để tạo phản hồi bằng hình ảnh khi bạn sử dụng w_auto tham số, và quan sát thấy rằng trung bình số người dùng tải xuống số byte ít hơn 42% khi sử dụng trình duyệt hỗ trợ gợi ý ứng dụng.

Nhưng hãy cẩn thận! Những thay đổi trong phiên bản Chrome 67 dành cho máy tính đã ngừng hỗ trợ cho ứng dụng trên nhiều nguồn gốc gợi ý. Rất may là những hạn chế này không ảnh hưởng đến các phiên bản Chrome dành cho thiết bị di động và chúng sẽ được gỡ bỏ hoàn toàn cho tất cả các nền tảng khi hoạt động trên Tính năng Chính sách đã hoàn tất.

Hỗ trợ người dùng trên mạng chậm

Hiệu suất thích ứng là ý tưởng giúp chúng ta điều chỉnh cách phân phối tài nguyên dựa trên thông tin mà khách hàng cung cấp cho chúng tôi; cụ thể thông tin về trạng thái hiện tại kết nối mạng của người dùng.

Trong trường hợp có liên quan đến trang web của Sconnie Timber, chúng tôi thực hiện các bước để giảm tải khi mạng chậm, với các tiêu đề Save-Data, ECT, RTTDownlink là mà chúng tôi đã xem xét trong mã phụ trợ. Khi quá trình này hoàn tất, chúng tôi sẽ tạo ra chất lượng mạng điểm số chúng tôi có thể dùng để xác định xem có nên can thiệp để mang lại người dùng tốt hơn không của bạn. Điểm số mạng này nằm trong khoảng từ 0 đến 1, trong đó 0 là thấp nhất chất lượng mạng tốt nhất và 1 là tốt nhất.

Ban đầu, chúng tôi kiểm tra xem Save-Data có xuất hiện hay không. Nếu đúng như vậy, điểm số sẽ được đặt thành 0, vì chúng ta giả định người dùng muốn chúng ta làm bất cứ điều gì cần thiết để khiến nhẹ hơn và nhanh hơn.

Tuy nhiên, nếu không có Save-Data, chúng ta sẽ tiếp tục và cân các giá trị của ECT, RTTDownlink gợi ý để tính điểm mô tả mạng chất lượng kết nối. Nguồn tạo điểm số mạng mã có trên GitHub. Bài học rút ra là nếu chúng ta sử dụng các gợi ý liên quan đến mạng trong một số nội dung thời trang, chúng tôi có thể cải thiện trải nghiệm cho những người chạy chậm mạng.

So sánh một trang web không sử dụng ứng dụng
gợi ý thích ứng với kết nối mạng chậm (bên trái) và trang web tương tự
(phải).
Hình 2. Trang "giới thiệu về chúng tôi" cho một trang web doanh nghiệp của bạn. Trải nghiệm cơ sở bao gồm phông chữ trên web, JavaScript để thúc đẩy băng chuyền và hoạt động phong cầm, cũng như hình ảnh nội dung. Đây là tất cả những thứ chúng tôi có thể bỏ qua khi điều kiện mạng quá chậm để tải một cách nhanh chóng.

Khi các trang web thích ứng với thông tin do khách hàng cung cấp, chúng tôi không cần phải áp dụng áp dụng phương pháp "tất cả hoặc không có gì". Chúng ta có thể quyết định một cách thông minh những tài nguyên gửi. Chúng tôi có thể sửa đổi logic lựa chọn hình ảnh thích ứng để gửi chất lượng thấp hơn hình ảnh cho một màn hình cụ thể để tăng hiệu suất tải khi chất lượng mạng kém.

Trong ví dụ này, chúng ta có thể thấy gợi ý của khách hàng tác động như thế nào đến cải thiện hiệu suất của trang web trên các mạng chậm hơn. Dưới đây là một WebPagetest thác nước của một trang web trên mạng chậm không thích ứng với gợi ý của ứng dụng:

Thác nước WebPagetest của thác Sconnie
Trang web gỗ đang tải tất cả tài nguyên trên kết nối mạng chậm.
Hình 3. Một trang web tải nhiều tài nguyên hình ảnh, tập lệnh và phông chữ trên kết nối chậm.

Giờ đây, bạn sẽ thấy thác nước cho cùng một trang web trên cùng một kết nối chậm, ngoại trừ thời gian, trang web sẽ sử dụng gợi ý ứng dụng khách để loại bỏ các tài nguyên trang không quan trọng:

Thác nước WebPagetest của thác Sconnie
Trang web gỗ sử dụng gợi ý ứng dụng để quyết định không tải các tài nguyên không quan trọng trên
kết nối mạng chậm.
Hình 4. Cùng một trang web trên cùng một kết nối, chỉ những tài nguyên "nên có" bị loại trừ và thay vào đó là những tài nguyên nhanh hơn đang tải.

Gợi ý ứng dụng giúp giảm thời gian tải trang từ hơn 45 giây xuống ít hơn . Lợi ích của gợi ý về ứng dụng trong tình huống này không thể được nhấn mạnh đủ và có thể mang lại lợi ích nghiêm trọng cho những người dùng đang tìm kiếm qua các mạng chậm.

Hơn nữa, bạn có thể sử dụng gợi ý ứng dụng mà không làm hỏng trải nghiệm cho các trình duyệt không hỗ trợ các tuỳ chọn này. Ví dụ: nếu chúng ta muốn điều chỉnh tài nguyên phân phối dựa trên giá trị của gợi ý ECT mà vẫn phân phối đầy đủ đối với các trình duyệt không hỗ trợ, chúng tôi có thể đặt lại về giá trị mặc định như thế:

// Set the ECT value to "4g" by default.
$ect = isset($_SERVER["HTTP_ECT"]) ? $_SERVER["HTTP_ECT"] : "4g";

Ở đây, "4g" đại diện cho kết nối mạng có chất lượng cao nhất, tiêu đề ECT mô tả. Nếu chúng ta khởi chạy $ect đến "4g", thì các trình duyệt không hỗ trợ ứng dụng các gợi ý sẽ không bị ảnh hưởng. Chọn sử dụng FTW!

Lưu ý đến những bộ nhớ đệm!

Mỗi khi thay đổi phản hồi dựa trên tiêu đề HTTP, bạn cần lưu ý cách bộ nhớ đệm sẽ xử lý các lần tìm nạp trong tương lai cho tài nguyên đó. Vary tiêu đề là không thể thiếu ở đây, vì khoá này khoá các mục nhập trong bộ nhớ đệm thành giá trị của tiêu đề yêu cầu được cung cấp cho nó. Nói một cách đơn giản, nếu bạn sửa đổi bất kỳ phản hồi nào dựa trên một HTTP nhất định tiêu đề của yêu cầu, hầu như lúc nào bạn cũng nên đưa yêu cầu đó vào tiêu đề Vary như thế:

Vary: DPR, Width

Tuy nhiên, có một cảnh báo lớn về điều này: Bạn không bao giờ muốn Vary có thể lưu vào bộ nhớ đệm nội dung phản hồi trên tiêu đề thay đổi thường xuyên (như Cookie) vì những tiêu đề đó không thể lưu vào bộ nhớ đệm một cách hiệu quả. Khi biết được điều này, bạn nên tránh Vary trên các tiêu đề gợi ý ứng dụng như RTT hoặc Downlink, vì đó là các yếu tố kết nối có thể thay đổi khá thường xuyên. Nếu bạn muốn sửa đổi phản hồi trên các tiêu đề đó, hãy cân nhắc chỉ nhập tiêu đề ECT. Điều này sẽ giảm thiểu số lần thiếu bộ nhớ đệm.

Tất nhiên, điều này chỉ áp dụng nếu bạn đang lưu phản hồi vào bộ nhớ đệm ngay từ đầu. Ví dụ: bạn sẽ không lưu nội dung HTML vào bộ nhớ đệm nếu nội dung của nội dung đó là động, vì có thể làm hỏng trải nghiệm người dùng trong các lượt truy cập lặp lại. Trong những trường hợp như thế này, hãy cảm thấy tự do sửa đổi các phản hồi đó trên bất kỳ cơ sở nào bạn cảm thấy cần thiết và không lo lắng về Vary.

Thông tin về ứng dụng trong trình chạy dịch vụ

Thương lượng nội dung không chỉ dành cho máy chủ nữa! Vì nhân viên dịch vụ hành động dưới dạng proxy giữa máy khách và máy chủ, bạn có quyền kiểm soát cách các tài nguyên đều được phân phối qua JavaScript. Quy tắc này bao gồm cả gợi ý của ứng dụng. Trong trình chạy dịch vụ fetch, bạn có thể sử dụng mã của đối tượng event request.headers.get để đọc tiêu đề của yêu cầu của một tài nguyên như sau:

self.addEventListener('fetch', (event) => {
  let dpr = event.request.headers.get('DPR');
  let viewportWidth = event.request.headers.get('Viewport-Width');
  let width = event.request.headers.get('Width');

  event.respondWith(
    (async function () {
      // Do what you will with these hints!
    })(),
  );
});

Bạn có thể đọc mọi tiêu đề gợi ý ứng dụng mà bạn chọn sử dụng theo cách này. Tuy vậy không phải là cách duy nhất để tìm hiểu một số thông tin này. Gợi ý dành riêng cho mạng có thể được đọc trong các thuộc tính JavaScript tương đương trong đối tượng navigator:

Gợi ý khách hàng Hàm JS tương đương
"ECT" `navigator.connection.effectiveType`
"RTT" `navigator.connection.rtt`
"Save-Data" (Lưu dữ liệu) `navigator.connection.saveData`
"Đường liên kết xuống" `navigator.connection.downlink`
"Bộ nhớ thiết bị" `navigator.deviceMemory`
Trình bổ trợ Imagemin dành cho các loại tệp.

Vì các API này không có sẵn ở mọi nơi mà bạn cần kiểm tra tính năng bằng in toán tử:

if ('connection' in navigator) {
  // Work with netinfo API properties in JavaScript!
}

Từ đây, bạn có thể sử dụng logic tương tự như logic bạn sẽ sử dụng trên máy chủ, ngoại trừ bạn không cần máy chủ để thương lượng nội dung dựa trên gợi ý của ứng dụng. Dịch vụ chỉ mình nhân viên mới có khả năng tạo ra trải nghiệm nhanh hơn và bền bỉ hơn vào khả năng phân phát nội dung khi người dùng không có kết nối mạng.

Kết thúc

Nhờ có gợi ý từ khách hàng, chúng tôi có thể mang đến trải nghiệm nhanh hơn cho người dùng một cách hoàn toàn tiến bộ. Chúng tôi có thể phân phát nội dung nghe nhìn dựa trên thiết bị của người dùng giúp phân phát hình ảnh thích ứng dễ dàng hơn so với việc dựa vào trên <picture>srcset, đặc biệt là đối với các trường hợp sử dụng phức tạp. Điều này cho phép chúng tôi để không chỉ giảm thời gian và công sức ở khía cạnh phát triển, mà còn tối ưu hoá tài nguyên (đặc biệt là hình ảnh) theo cách nhắm đến màn hình của người dùng tốt hơn và srcset có thể.

Có lẽ quan trọng hơn, chúng ta có thể phát hiện được các kết nối mạng kém và cầu nối khoảng cách cho người dùng bằng cách sửa đổi những gì chúng tôi gửi—và cách chúng tôi gửi nó. Điều này có thể nỗ lực dài để giúp người dùng truy cập vào trang web dễ dàng hơn trên các mạng yếu ớt. Khi kết hợp với trình chạy dịch vụ, chúng tôi có thể tạo ra các trang web cực kỳ nhanh có thể sử dụng khi không có mạng.

Mặc dù gợi ý ứng dụng chỉ có trong Chrome và dựa trên Chromium các trình duyệt—có thể sử dụng chúng theo cách không gây cản trở các trình duyệt không hỗ trợ chúng. Cân nhắc sử dụng gợi ý của khách hàng để sáng tạo thật sự trải nghiệm dành cho tất cả mọi người và có thể điều chỉnh cho phù hợp với từng thiết bị của người dùng và mạng mà các thiết bị này kết nối. Hy vọng rằng, các nhà cung cấp trình duyệt khác sẽ thấy giá trị của chúng và cho thấy ý định triển khai.

Tài nguyên

Cảm ơn Ilya Grigorik, Eric Portis, Jeff Posnick, Yoav WeissEstelle Weyl ý kiến phản hồi và nội dung chỉnh sửa hữu ích cho bài viết này.