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, được dùng để hỗ trợ các tính năng như <link rel="prerender">. Giống như phương thức kết xuất trước, phương thức này tìm nạp tài nguyên trước. Tuy nhiên, không giống như phương thức kết xuất trước, phương thức 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 quá trình Tìm nạp trước NoState là sử dụng ít bộ nhớ hơn so với quá trình kết xuất trước, trong khi vẫn giảm thời gian tải trang.

NoState Prefetch không phải là API mà là cơ chế được Chrome sử dụng để triển khai nhiều API và tính năng khác nhau. Resource Hints API (API Gợi ý về tài nguyên) cũng như tính năng tìm nạp trước trang bằng thanh địa chỉ của Chrome đều được triển khai bằng cách sử dụng tính năng Tìm nạp trước NoState. Nếu bạn đang sử dụng Chrome 63 trở lên, thì trình duyệt đang 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, động lực 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ề mức sử dụng.

Động lực

Có 2 động lực chính khiến việc giới thiệu NoState Prefetch (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 ~45MiB bộ nhớ. Việc duy trì trình quét tải trước là chi phí bộ nhớ chính cho NoState Prefetch và chi phí này vẫn tương đối không đổi trong 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 tìm nạp không ảnh hưởng đáng kể đến dung lượng bộ nhớ mà tính năng Tìm nạp trước NoState sử dụng.

Ngược lại, quá trình kết xuất trước thường tiêu tốn 100MiB bộ nhớ và mức tiêu thụ bộ nhớ được giới hạn ở mức 150MiB. 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à <= 512 MB RAM). 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.

Tạo điều kiện hỗ trợ các tính năng mới trên nền tảng web

Với tính năng kết xuất trước, không 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 lưu trữ cục bộ) sẽ xảy ra. Tuy nhiên, việc ngăn chặn những hành động này xảy ra trong khi hiển thị một trang có thể khó và phức tạp. NoState Prefetch chỉ tìm nạp trước tài nguyên: không thực thi mã hoặc kết xuất trang. Điều này giúp việc ngăn chặn các hành động giao diện người dùng và trạng thái xảy ra một cách đơn giản hơn.

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 ý kết xuất trước tài nguyên (tức là <link rel="prerender">) và một số tính năng của Chrome sẽ kích hoạt quá trình Tìm nạp trước NoState nếu đáp ứng 2 đ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 đồ hoạ chuyên dụng mới được tạo cho quá trình Tìm nạp trước NoState.

    Trong Chrome, "trình kết xuất" là quá trình lấy tài liệu HTML, phân tích cú pháp, tạo cây hiển thị 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 để tách biệt. Việc này giúp giảm thiểu tác động khi sự cố xảy ra (ví dụ: 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ìm nạp trước NoState sẽ được tìm nạp. Sau đó, HTMLAddScanner 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 đó có một trình chạy dịch vụ đã đăng ký, thì các yêu cầu này sẽ chuyển qua trình chạy dịch vụ thích hợp.

    NoState Prefetch chỉ hỗ trợ phương thức GET HTTP; phương thức 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 phân tích cú pháp sẽ không tìm nạp bất kỳ tài nguyên nào yêu cầu người dùng thực hiện thao tác (ví dụ: cửa sổ bật lên xác thực, chứng chỉ ứng dụng SSL hoặc cơ chế 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 thực là "IDLE".

    Mức độ ưu tiên thực "IDLE" là mức độ ưu tiên thực thấp nhất có thể trong Chrome.

  5. Tất cả tài nguyên do quá trình Tìm nạp trước NoState truy xuất đều được lưu vào bộ nhớ đệm theo tiêu đề bộ nhớ đệm.

    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, trừ những tài nguyên có tiêu đề no-store Cache-Control. Một 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 đề no-cache Cache-Control (Kiểm soát bộ nhớ đệm) 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ị tắt sau khi tất cả các tài nguyên phụ được tải.

    Nếu các 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 lưu trữ cookie và bộ nhớ đệm DNS cục bộ. Bạn cần phải nêu rõ thao tác này vì đây là "NoState" trong "NoState Prefetch".

    Tại thời điểm này trong quy trình tải trang "bình thường", trình duyệt có thể thực hiện các thao tác sẽ sửa đổi trạng thái của trình duyệt: chẳng hạn như thực thi JavaScript, thay đổi sessionStorage hoặc localStorage, phát nhạc hoặc video, sử dụng API Lịch sử hoặc nhắc người dùng. Các nội dung sửa đổi trạng thái duy nhất xảy ra trong quá trình 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 lưu trữ 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 sẽ không hiển thị ngay lập tức mà vẫn cần được 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 đã dùng cho quá trình Tìm nạp trước NoState mà sẽ sử dụng một trình kết xuất mới. Việc không kết xuất trang trước sẽ làm giảm mức tiêu thụ bộ nhớ của NoStatePrefetch, nhưng cũng giảm bớt tác động có thể có đối với thời gian tải trang.

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

    Nếu NoState Prefetch chưa tìm nạp xong tài nguyên phụ trước thời điểm cần trang, trình duyệt sẽ tiếp tục quá trình tải trang từ nơi NoState Prefetch đã dừng lại. Trình duyệt sẽ vẫn cần tìm nạp tài nguyên, nhưng không cần nhiều tài nguyên nhất có thể nếu chưa bắt đầu quá trình Tìm nạp trước NoState.

Tác động đến việc phân tích trang web

Các trang được tải bằng NoState Prefetch được đăng ký bằng các công cụ phân tích web vào các thời điểm hơi khác nhau, tuỳ thuộc vào việc công cụ này 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ẽ ghi lại lượt xem trang khi người dùng nhìn thấy trang. Các tập lệnh này dựa vào việc thực thi JavaScript, còn NoState Prefetch 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ủ đăng ký chỉ số khi có yêu cầu được xử lý. Đối với các tài nguyên được tải qua NoState Prefetch, 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 ứng dụng sử dụng phản hồi đó). Kể từ Chrome 69, NoState Prefetch sẽ thêm tiêu đề Purpose: Prefetch vào tất cả các yêu cầu để phân biệt chúng với hoạt động duyệt web thông thường.

Xem ngay

NoStatePrefetch được vận chuyển vào tháng 12 năm 2017 trong Chrome 63. Công cụ này hiện đượ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ả trên Google Tìm kiếm
  • Tìm nạp các trang mà thanh địa chỉ của Chrome dự đoán là có khả năng sẽ truy cập tiếp theo

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

Để xem danh sách các trang web đã được tải bằng NoState Prefetch, hãy truy cập phần chrome://net-internals/#prerender.

Để xem số liệu thống kê về mức sử dụng Tìm nạp trước NoState, hãy truy cập chrome://histograms rồi tìm kiếm "NoStatePrefetch". Có ba biểu đồ Tìm nạp trước NoState — một biểu đồ cho mỗi trường hợp sử dụng Tìm nạp trước NoState:

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