Ngừng sử dụng sự kiện huỷ tải

Sự kiện unload sẽ dần không dùng nữa bằng cách thay đổi dần chế độ mặc định để các trình xử lý unload ngừng kích hoạt trên các trang trừ phi có trang rõ ràng chọn bật lại.

Tiến trình ngừng sử dụng

Chúng tôi nhận thấy rằng hành vi huỷ tải có thể sẽ thay đổi kể từ tháng 1 năm 2019, khi chúng tôi thông báo ý định triển khai bộ nhớ đệm cho thao tác tiến/lùi. Song song với hoạt động triển khai, chúng tôi cũng đã tiến hành mở rộng phạm vi tiếp cận, giúp giảm đáng kể mức sử dụng huỷ tải. Để bổ trợ cho hoạt động liên hệ này, chúng tôi cũng đã bắt đầu cung cấp các cách để kiểm tra tác động của việc huỷ tải khỏi Chrome 115:

  • Trong quá trình kiểm thử tự nhiên thông qua Permissions-Policy API để huỷ tải trên Chrome 115 (tháng 7 năm 2023)
  • Kiểm thử cục bộ bằng cách bật cờ trong Chrome 117 (tháng 9 năm 2023)

Sau các giai đoạn tiếp cận và dùng thử này, sau đây là cách chúng tôi dự kiến triển khai quá trình ngừng cung cấp thử nghiệm:

  • Đây là một giai đoạn trong phạm vi mà việc gỡ tải sẽ dần ngừng hoạt động đối với 50 trang web phổ biến hàng đầu (tham khảo tại thời điểm viết bài).
    • Bắt đầu từ 1% người dùng từ Chrome 120 (cuối tháng 11 năm 2023).
    • Ngừng cung cấp cho 100% người dùng vào cuối quý 3 năm 2024
  • Ngoài ra, từ quý 3 năm 2024, chúng tôi dự định sẽ bắt đầu giai đoạn chung, trong đó việc gỡ tải sẽ dần ngừng hoạt động trên mọi trang web, bắt đầu với 1% người dùng và kết thúc với 100% người dùng vào cuối quý 1 năm 2025.

Xin lưu ý rằng chúng tôi cũng cung cấp trình đơn các lựa chọn không sử dụng trong trường hợp tiến trình ngừng sử dụng tạm thời này không có đủ thời gian để di chuyển khỏi quá trình huỷ tải. Mục tiêu của chúng tôi là sử dụng quy trình ngừng sử dụng tạm thời này để thông báo tiến trình cho giai đoạn cuối (ngừng gỡ tải hẳn) trong đó những lựa chọn không tham gia này sẽ được loại bỏ hoặc giảm bớt.

Tiến trình ngừng sử dụng việc huỷ tải.

Thông tin khái quát

unload được thiết kế để kích hoạt khi tài liệu đang được huỷ tải. Về lý thuyết, mã này có thể được dùng để chạy mã bất cứ khi nào người dùng di chuyển khỏi một trang, hoặc dưới dạng lệnh gọi lại kết thúc phiên.

Sau đây là các trường hợp phổ biến nhất mà sự kiện này được sử dụng:

  • Lưu dữ liệu người dùng: Hãy lưu dữ liệu trước khi rời khỏi trang.
  • Thực hiện tác vụ dọn dẹp: Đóng tài nguyên đang mở trước khi thoát khỏi trang.
  • Gửi dữ liệu phân tích: Gửi dữ liệu liên quan đến hoạt động tương tác của người dùng vào cuối phiên.

Tuy nhiên, sự kiện unload cực kỳ không đáng tin cậy.

Trên Chrome và Firefox dành cho máy tính, unload khá đáng tin cậy nhưng có tác động tiêu cực đến hiệu suất của trang web bằng cách ngăn việc sử dụng bfcache (bộ nhớ đệm cho thao tác tiến/lùi).

Trên trình duyệt di động, unload thường không chạy vì các thẻ thường xuyên chạy trong nền và sau đó bị tắt. Vì lý do này, các trình duyệt chọn ưu tiên bộ nhớ đệm bf trên thiết bị di động hơn là unload, khiến chúng trở nên không đáng tin cậy hơn. Safari cũng sử dụng hành vi này trên máy tính.

Nhóm Chrome tin rằng việc sử dụng mô hình dành cho thiết bị di động ưu tiên bfcache hơn unload trên máy tính để bàn sẽ gây gián đoạn vì làm cho nó trở nên không đáng tin cậy hơn ở đó, trong khi trước đây mô hình này đáng tin cậy một cách hợp lý trong Chrome (và Firefox). Thay vào đó, mục đích của Chrome là xoá hoàn toàn sự kiện unload. Cho đến lúc đó, phiên bản này vẫn sẽ là một phiên bản đáng tin cậy trên máy tính đối với những người rõ ràng đã chọn không sử dụng phiên bản này.

Tại sao lại không dùng sự kiện unload nữa?

Việc ngừng sử dụng unload là một bước quan trọng trong sự ghi nhận rộng lớn hơn nhiều về môi trường web chúng ta đang sống. Sự kiện unload tạo ra cảm giác giả tạo về quyền kiểm soát vòng đời của ứng dụng và điều này ngày càng không đúng về cách chúng ta duyệt web trong thế giới điện toán hiện đại.

Các hệ điều hành trên thiết bị di động thường xuyên đóng băng hoặc huỷ tải các trang web để tiết kiệm bộ nhớ và các trình duyệt dành cho máy tính cũng thực hiện việc này ngày càng nhiều hơn vì những lý do tương tự. Ngay cả khi không có sự can thiệp của hệ điều hành, người dùng vẫn thường xuyên chuyển đổi thẻ và tắt các thẻ cũ mà không chính thức "rời khỏi trang".

Việc xoá sự kiện unload vì lỗi thời là một sự ghi nhận rằng với tư cách là nhà phát triển web, chúng tôi cần đảm bảo mô hình của mình phù hợp với mô hình của thế giới thực và không phụ thuộc vào những khái niệm lỗi thời không còn đúng nữa (nếu có).

Lựa chọn thay thế cho các sự kiện unload

Thay vì unload, bạn nên sử dụng:

  • visibilitychange: Để xác định thời điểm chế độ hiển thị của một trang thay đổi. Sự kiện này xảy ra khi người dùng chuyển đổi giữa các thẻ, thu nhỏ cửa sổ trình duyệt hoặc mở một trang mới. Cân nhắc trạng thái hidden là thời điểm đáng tin cậy gần đây nhất để lưu dữ liệu người dùng và ứng dụng.
  • pagehide: Để xác định thời điểm người dùng đã rời khỏi trang. Sự kiện này xảy ra khi người dùng rời khỏi trang, tải lại trang hoặc đóng cửa sổ trình duyệt. Sự kiện pagehide không được kích hoạt khi người dùng chỉ thu nhỏ trang hoặc chuyển sang một thẻ khác. Xin lưu ý rằng vì pagehide không khiến một trang không đủ điều kiện dùng bộ nhớ đệm cho thao tác tiến/lùi, nên có thể bạn sẽ khôi phục được trang sau khi sự kiện này kích hoạt. Nếu bạn dọn dẹp bất kỳ tài nguyên nào trong sự kiện này, thì chúng có thể phải được khôi phục khi khôi phục trang.

Sự kiện beforeunload có trường hợp sử dụng hơi khác với unload ở chỗ đó là sự kiện có thể huỷ được. Thông báo này thường được dùng để cảnh báo người dùng về các thay đổi chưa lưu khi rời đi. Sự kiện này cũng không đáng tin cậy vì sẽ không kích hoạt nếu một thẻ nền bị tắt. Bạn nên hạn chế sử dụng beforeunloadchỉ thêm phương thức này theo điều kiện. Thay vào đó, hãy sử dụng các sự kiện trên cho hầu hết unload thay thế.

Để biết thêm thông tin, hãy xem lời khuyên này về việc không bao giờ sử dụng trình xử lý unload.

Phát hiện việc sử dụng unload

Có nhiều công cụ giúp bạn thấy sự kiện unload xuất hiện trên các trang. Điều này cho phép các trang web biết được họ có đang sử dụng sự kiện này hay không (trong mã của riêng họ hay thông qua thư viện). Do đó, việc này có thể bị ảnh hưởng bởi việc ngừng sử dụng sắp tới.

Công cụ của Chrome cho nhà phát triển

Công cụ của Chrome cho nhà phát triển cung cấp quy trình kiểm tra back-forward-cache giúp bạn xác định các vấn đề có thể khiến trang của bạn không đủ điều kiện dùng bộ nhớ đệm cho thao tác tiến/lùi, bao gồm cả việc sử dụng trình xử lý unload.

Để kiểm tra bộ nhớ đệm cho thao tác tiến/lùi, hãy làm theo các bước sau:

  1. Trên trang của bạn, hãy mở Công cụ cho nhà phát triển, sau đó chuyển đến Ứng dụng > Dịch vụ nền > Bộ nhớ đệm cho thao tác tiến/lùi.

  2. Nhấp vào Kiểm tra bộ nhớ đệm cho thao tác tiến/lùi Chrome sẽ tự động đưa bạn đến chrome://terms/ rồi quay lại trang của bạn. Hoặc, bạn có thể nhấp vào nút quay lại và tiến của trình duyệt.

Nếu trang của bạn không đủ điều kiện dùng tính năng lưu vào bộ nhớ đệm cho thao tác tiến/lùi, thì thẻ Bộ nhớ đệm cho thao tác tiến/lùi sẽ hiển thị cho bạn danh sách các vấn đề. Trong phần Actionable (Có thể thao tác), bạn có thể xem mình có đang sử dụng unload hay không:

Công cụ kiểm tra bộ nhớ đệm cho thao tác tiến/lùi của Chrome cho thấy một trình xử lý huỷ tải đã được sử dụng

API báo cáo

Bạn có thể sử dụng API Báo cáo cùng với Chính sách về quyền chỉ có thể đọc để phát hiện hoạt động sử dụng unload của người dùng trang web.

Để biết thêm thông tin, hãy xem phần Sử dụng API Báo cáo để tìm lượt huỷ tải

API Bfcache notRestoredReasons

Thuộc tính notRestoredReasons (được thêm vào lớp PerformanceNavigationTiming) báo cáo thông tin về việc tài liệu có bị chặn sử dụng bfcache trên điều hướng hay không và lý do. Bạn có thể xem hướng dẫn sử dụng tại đây. Dưới đây là ví dụ về giao diện của cảnh báo đối tượng phản hồi của trình nghe unload hiện có:

{
   children: [],
   id: null,
   name: null,
   reasons: [
     {"reason", "unload-handler"}
   ],
   src: null,
   url: "https://www.example.com/page/"
}

Kiểm soát quyền truy cập vào unload

Chrome sẽ dần ngừng sử dụng sự kiện unload. Trong thời gian chờ đợi, bạn có thể sử dụng các công cụ khác để kiểm soát hành vi này và chuẩn bị cho việc ngừng sử dụng sắp tới. Xin lưu ý rằng về lâu dài bạn không nên dựa vào những kỹ thuật này và bạn nên có kế hoạch chuyển sang các kỹ thuật thay thế càng sớm càng tốt.

Các tuỳ chọn sau đây cho phép bạn bật hoặc tắt trình xử lý unload để kiểm tra xem trang web của bạn sẽ hoạt động như thế nào khi không có các trình xử lý này, nhờ đó, bạn có thể chuẩn bị cho việc ngừng sử dụng sắp tới. Có nhiều loại chính sách:

  • Chính sách về quyền: Đây là một API nền tảng để chủ sở hữu trang web kiểm soát quyền truy cập vào các tính năng ở cấp trang web hoặc cấp trang riêng lẻ, thông qua việc sử dụng các tiêu đề HTTP.
  • Chính sách doanh nghiệp: Các công cụ giúp quản trị viên CNTT định cấu hình Chrome cho tổ chức hoặc doanh nghiệp của họ. Bạn có thể định cấu hình các ứng dụng này thông qua một bảng điều khiển quản trị, chẳng hạn như Bảng điều khiển dành cho quản trị viên của Google.
  • Cờ của Chrome: Cho phép từng nhà phát triển thay đổi chế độ cài đặt về việc ngừng sử dụng unload để kiểm tra mức độ tác động trên nhiều trang web.

Chính sách về quyền

Chrome 115 đã thêm Chính sách về quyền truy cập để cho phép các trang web chọn không sử dụng trình xử lý unload và hưởng lợi ngay lập tức từ bfcache nhằm cải thiện hiệu suất của trang web. Xem những ví dụ này về cách thiết lập chế độ cài đặt này cho trang web của bạn. Điều này giúp các trang web đón đầu việc ngừng sử dụng unload.

Tính năng này sẽ được mở rộng trong Chrome 117 để cho phép các trang web làm ngược lại và chọn tiếp tục thử kích hoạt trình xử lý unload, vì Chrome sẽ thay đổi chế độ mặc định để các trình xử lý này không kích hoạt trong tương lai. Xem những ví dụ này về cách tiếp tục cho phép các trình xử lý huỷ tải kích hoạt trên trang web của bạn. Lựa chọn này sẽ không tồn tại vĩnh viễn và bạn nên dùng để cho các trang web có thời gian di chuyển khỏi trình xử lý unload.

Chính sách doanh nghiệp

Những doanh nghiệp có phần mềm phụ thuộc vào sự kiện unload để hoạt động đúng cách có thể sử dụng chính sách ForcePermissionPolicyUnloadDefaultEnabled để ngăn việc các thiết bị thuộc quyền kiểm soát của họ dần bị ngừng sử dụng. Khi bạn bật chính sách này, unload sẽ tiếp tục bật theo mặc định cho mọi nguồn gốc. Trang vẫn có thể đặt chính sách nghiêm ngặt hơn nếu muốn. Giống như việc chọn không sử dụng Chính sách về quyền, đây là công cụ để giảm thiểu các thay đổi có thể gây lỗi, nhưng không được sử dụng vô thời hạn.

Cờ Chrome và nút chuyển dòng lệnh

Tương tự như chính sách doanh nghiệp, bạn có thể vô hiệu hoá việc ngừng sử dụng cho từng người dùng thông qua cờ Chrome và nút chuyển dòng lệnh:

Việc đặt chrome://flags/#deprecate-unload này thành enabled sẽ kích hoạt mặc định ngừng sử dụng và ngăn trình xử lý unload kích hoạt. Thông qua Chính sách về quyền, hệ thống vẫn có thể ghi đè các sự kiện này cho từng trang web, nhưng sẽ tiếp tục kích hoạt theo mặc định.

Bạn cũng có thể kiểm soát các chế độ cài đặt này bằng công tắc dòng lệnh.

So sánh các lựa chọn

Bảng sau đây tóm tắt cách sử dụng các tuỳ chọn đã thảo luận trước đó:

Tiếp tục triển khai việc ngừng sử dụng Tiếp tục sử dụng (với ngoại lệ) Ngăn việc ngừng sử dụng để đảm bảo thời gian di chuyển
Chính sách về quyền
(áp dụng cho trang/trang web)
Chính sách doanh nghiệp
(áp dụng cho các thiết bị)
Không Không
Cờ của Chrome
(áp dụng cho người dùng cá nhân)
Không Không
Chuyển dòng lệnh của Chrome
(áp dụng cho từng người dùng)
Không

Kết luận

Các trình xử lý unload sắp bị loại bỏ. Chúng không đáng tin cậy trong một thời gian dài và không được đảm bảo sẽ kích hoạt trong mọi trường hợp tài liệu bị hủy. Ngoài ra, các trình xử lý unload không tương thích với bfcache.

Các trang web hiện đang dùng trình xử lý unload nên chuẩn bị cho việc ngừng sử dụng sắp tới này bằng cách kiểm thử mọi trình xử lý unload hiện có, xoá hoặc di chuyển các trình xử lý đó hoặc phương án cuối cùng là trì hoãn việc ngừng sử dụng nếu cần thêm thời gian.

Xác nhận

Cảm ơn Kenji Baheux, Fergal Daly, Adriana Jara và Jeremy Wagner đã giúp xem xét bài viết này.

Hình ảnh chính của Anja Bauerman trên Unsplash