Giới thiệu về tính năng Tìm nạp trước NoState

Katie Hempenius
Katie Hempenius

Giới thiệu

Tìm nạp trước NoState là một cơ chế mới trong Chrome, thay thế cho quy trình kết xuất trước không dùng nữa, dùng để hỗ trợ các tính năng như <link rel="prerender">. Giống như tính năng kết xuất trước, tính năng này sẽ tìm nạp trước các tài nguyên; nhưng không giống như tính năng kết xuất trước, tính năng này không thực thi JavaScript hoặc kết xuất trước bất kỳ phần nào của trang. Mục tiêu của tính năng Tìm nạp trước NoState là sử dụng ít bộ nhớ hơn so với tính năng kết xuất trước, trong khi vẫn giảm thời gian tải trang.

Tìm nạp trước NoState không phải là một API mà là một cơ chế mà Chrome sử dụng để triển khai nhiều API và tính năng. API gợi ý tài nguyên cũng như tính năng tải trước trang bằng thanh địa chỉ của Chrome đều được triển khai bằng tính năng Tải trước không có trạng thái. Nếu bạn đang sử dụng Chrome 63 trở lên, trình duyệt của bạn đã sử dụng tính năng Tìm nạp trước NoState cho các tính năng như <link rel="prerender">.

Bài viết này giải thích cách hoạt động của NoStatePrefetch, lý do giới thiệu tính năng này và hướng dẫn sử dụng biểu đồ của Chrome để xem số liệu thống kê về việc sử dụng tính năng này.

Động lực

Có hai động lực chính để giới thiệu tính năng Tìm nạp trước NoState:

Giảm mức sử dụng bộ nhớ

Tính năng Tìm nạp trước NoState chỉ sử dụng khoảng 45 MiB bộ nhớ. Việc duy trì trình quét tải trước là chi phí bộ nhớ chính cho tính năng Tải trước NoState và chi phí này vẫn tương đối ổn định trên các trường hợp sử dụng khác nhau. Việc tăng kích thước hoặc số lượng lượt tìm nạp không ảnh hưởng đáng kể đến lượng bộ nhớ mà tính năng Tìm nạp trước NoState sử dụng.

Ngược lại, tính năng kết xuất trước thường tiêu tốn 100 MiB bộ nhớ và mức sử dụng bộ nhớ được giới hạn ở mức 150 MiB. Mức tiêu thụ bộ nhớ cao này khiến ứng dụng không phù hợp với các thiết bị cấp thấp (tức là có RAM <= 512 MB). Do đó, Chrome không kết xuất trước trên các thiết bị cấp thấp mà sẽ kết nối trước.

Hỗ trợ các tính năng mới của nền tảng web

Khi kết xuất trước, không được có hành động nào dành cho người dùng (ví dụ: phát nhạc hoặc video) hoặc hành động có trạng thái (ví dụ: thay đổi phiên hoặc bộ nhớ cục bộ). Tuy nhiên, việc ngăn chặn các hành động này xảy ra trong khi hiển thị trang có thể khó khăn và phức tạp. Tính năng Tìm nạp trước NoState chỉ tìm nạp trước tài nguyên: không thực thi mã hoặc hiển thị trang. Điều này giúp đơn giản hoá việc ngăn chặn các thao tác có trạng thái và thao tác mà người dùng nhìn thấy.

Triển khai

Các bước sau đây giải thích cách hoạt động của tính năng Tìm nạp trước NoState.

  1. NoStatePrefetch được kích hoạt.

    Gợi ý tài nguyên kết xuất trước (tức là <link rel="prerender">) và một số tính năng của Chrome sẽ kích hoạt tính năng Tìm nạp trước NoState, miễn là đáp ứng hai điều kiện sau: a) người dùng không sử dụng thiết bị cấp thấp và b) người dùng không sử dụng mạng di động.

  2. Một trình kết xuất mới, chuyên dụng được tạo cho tính năng Tìm nạp trước NoState.

    Trong Chrome, "trình kết xuất" là một quy trình chịu trách nhiệm lấy một tài liệu HTML, phân tích cú pháp tài liệu đó, tạo cây kết xuất và vẽ kết quả lên màn hình. Mỗi thẻ trong Chrome cũng như mỗi quy trình Tìm nạp trước NoState đều có trình kết xuất riêng để cung cấp tính năng tách biệt. Điều này giúp giảm thiểu tác động của sự cố (ví dụ: một thẻ gặp sự cố) cũng như ngăn mã độc truy cập vào các thẻ khác hoặc các phần khác của hệ thống.

  3. Tài nguyên đang được tải bằng tính năng Tải trước NoState được tìm nạp. Sau đó, HTMLPreloadScanner sẽ quét tài nguyên này để khám phá mọi tài nguyên phụ cần được tìm nạp. Nếu tài nguyên chính hoặc bất kỳ tài nguyên phụ nào của tài nguyên chính có một worker dịch vụ đã đăng ký, thì các yêu cầu này sẽ được chuyển qua worker dịch vụ thích hợp.

    Tính năng Tìm nạp trước NoState chỉ hỗ trợ phương thức HTTP GET; tính năng này sẽ không tìm nạp bất kỳ tài nguyên phụ nào yêu cầu sử dụng các phương thức HTTP khác. Ngoài ra, trình này sẽ không tìm nạp bất kỳ tài nguyên nào yêu cầu hành động của người dùng (ví dụ: cửa sổ bật lên xác thực, chứng chỉ ứng dụng SSL hoặc ghi đè thủ công).

  4. Các tài nguyên phụ được tìm nạp sẽ được tìm nạp với Mức độ ưu tiên mạng "RỖI".

    Mức độ ưu tiên mạng "RỖI" là mức độ ưu tiên mạng thấp nhất có thể trong Chrome.

  5. Tất cả tài nguyên được truy xuất bằng tính năng Tìm nạp trước NoState đều được lưu vào bộ nhớ đệm theo tiêu đề bộ nhớ đệm của tài nguyên đó.

    Tính năng Tìm nạp trước NoState sẽ lưu tất cả tài nguyên vào bộ nhớ đệm, ngoại trừ những tài nguyên có tiêu đề Cache-Control no-store. Tài nguyên sẽ được xác thực lại trước khi sử dụng nếu có tiêu đề phản hồi Vary, tiêu đề Cache-Control no-cache hoặc nếu tài nguyên đã tồn tại hơn 5 phút.

  6. Trình kết xuất bị huỷ sau khi tất cả tài nguyên phụ được tải.

    Nếu tài nguyên phụ hết thời gian chờ, trình kết xuất sẽ bị tắt sau 30 giây.

  7. Trình duyệt không thực hiện bất kỳ sửa đổi trạng thái nào ngoài việc cập nhật kho cookie và bộ nhớ đệm DNS cục bộ. Điều này rất quan trọng vì đây là "NoState" trong "Tìm nạp trước NoState".

    Tại thời điểm này trong quá trình tải trang "bình thường", trình duyệt có thể thực hiện những thao tác sẽ sửa đổi trạng thái trình duyệt: ví dụ: thực thi JavaScript, thay đổi sessionStorage hoặc localStorage, phát nhạc hoặc video, sử dụng API Nhật ký hoặc nhắc người dùng. Việc sửa đổi trạng thái duy nhất xảy ra trong tính năng Tìm nạp trước NoState là cập nhật bộ nhớ đệm DNS khi có phản hồi và cập nhật kho cookie nếu phản hồi chứa tiêu đề Set-Cookie.

  8. Khi cần, tài nguyên sẽ được tải vào cửa sổ trình duyệt.

    Tuy nhiên, không giống như trang được kết xuất trước, trang này sẽ không hiển thị ngay lập tức mà vẫn cần trình duyệt kết xuất. Trình duyệt sẽ không sử dụng lại trình kết xuất mà trình duyệt đã sử dụng cho tính năng Tìm nạp trước NoState mà thay vào đó sẽ sử dụng trình kết xuất mới. Việc không hiển thị trước trang sẽ làm giảm mức tiêu thụ bộ nhớ của NoStatePrefetch, nhưng cũng làm giảm mức tác động có thể có của tính năng này đối với thời gian tải trang.

    Nếu trang có trình chạy dịch vụ, thì lượt tải trang này sẽ lại đi qua trình chạy dịch vụ.

    Nếu tính năng Tìm nạp trước không có trạng thái chưa hoàn tất việc tìm nạp tài nguyên phụ vào thời điểm cần trang, thì trình duyệt sẽ tiếp tục quá trình tải trang từ nơi tính năng Tìm nạp trước không có trạng thái dừng lại. Trình duyệt vẫn cần tìm nạp tài nguyên, nhưng không nhiều như cần thiết nếu tính năng Tìm nạp trước không có trạng thái chưa được khởi tạo.

Ảnh hưởng đến Phân tích web

Các trang được tải bằng tính năng Tìm nạp trước NoState được các công cụ phân tích web đăng ký ở các thời điểm khác nhau, tuỳ thuộc vào việc công cụ đó thu thập dữ liệu ở phía máy khách hay phía máy chủ.

Tập lệnh phân tích phía máy khách sẽ đăng ký một lượt xem trang khi trang hiển thị cho người dùng. Các tập lệnh này dựa vào việc thực thi JavaScript và tính năng Tìm nạp trước NoState không thực thi bất kỳ JavaScript nào.

Các công cụ phân tích phía máy chủ sẽ đăng ký các chỉ số khi một yêu cầu được xử lý. Đối với các tài nguyên được tải thông qua tính năng Tìm nạp trước NoState, có thể có một khoảng thời gian đáng kể giữa thời điểm xử lý yêu cầu và thời điểm ứng dụng thực sự sử dụng phản hồi (nếu có). Kể từ Chrome 69, tính năng Tìm nạp trước NoState sẽ thêm tiêu đề Purpose: Prefetch vào tất cả các yêu cầu để phân biệt với hoạt động duyệt web thông thường.

Xem ngay

NoStatePrefetch được phát hành vào tháng 12 năm 2017 trong Chrome 63. Hiện tại, công cụ này được dùng để:

  • Triển khai gợi ý tài nguyên prerender
  • Tìm nạp kết quả đầu tiên trong kết quả tìm kiếm trên Google
  • Tìm nạp các trang mà thanh địa chỉ của Chrome dự đoán có thể được truy cập tiếp theo

Bạn có thể sử dụng Chrome Internals để xem cách bạn đang sử dụng NoStatePrefetch.

Để xem danh sách các trang web đã được tải bằng tính năng Tải trước NoState, hãy truy cập vào chrome://net-internals/#prerender.

Để xem số liệu thống kê về mức sử dụng tính năng Tìm nạp trước không có trạng thái, hãy truy cập vào chrome://histograms rồi tìm "NoStatePrefetch". Có 3 biểu đồ Tìm nạp trước không có trạng thái, mỗi biểu đồ cho một trường hợp sử dụng tính năng Tìm nạp trước không có trạng thái:

  • “NoStatePrefetch” (số liệu thống kê về mức sử dụng theo gợi ý tài nguyên kết xuất trước)
  • “gws_NoStatePrefetch” (số liệu thống kê về mức sử dụng của trang kết quả tìm kiếm trên Google)
  • “omnibox_NoStatePrefetch” (thống kê về mức sử dụng của thanh địa chỉ Chrome)