Các thay đổi đối với hành vi của BFCache với các cổng thông báo tiện ích

Bộ nhớ đệm cho thao tác tiến/lùi (hay BFCache) là một tính năng tối ưu hoá cho trình duyệt, cho phép điều hướng tiến và lùi tức thì. Chúng tôi sắp thay đổi BFCache của Chrome. Điều này có thể ảnh hưởng đến các tiện ích sử dụng cổng thông báo. Nếu bạn có một tiện ích của Chrome sử dụng tính năng nhắn tin để giao tiếp giữa tập lệnh nội dung và tiện ích, hãy đọc tiếp để tìm hiểu cách thử nghiệm và điều chỉnh tiện ích.

Cổng thông báo của tiện ích

Tiện ích giao tiếp với tập lệnh nội dung hoặc các tiện ích khác thông qua việc truyền thông báo. Bạn có thể gửi tin nhắn bằng yêu cầu một lần bằng cách gọi runtime.sendMessage()tabs.sendMessage() hoặc dùng cổng tin nhắn có thể tái sử dụng. Miễn là cổng đang hoạt động, cả tập lệnh nội dung và tập lệnh nền của tiện ích đều có thể sử dụng lại cổng để đăng thông báo cho nhau.

Để biết thêm thông tin, hãy xem phần Chuyển tin nhắn.

Bộ nhớ đệm cho thao tác tiến/lùi

Khi điều hướng khỏi một trang đủ điều kiện cho BFCache, trình duyệt sẽ cho phép trang có tất cả trạng thái có trong bộ nhớ nhưng ở trạng thái không hoạt động hoàn toàn. Nếu người dùng thực hiện điều hướng lịch sử (quay lại hoặc tiến) tới trang đã lưu trong bộ nhớ đệm, thì trình duyệt sẽ cố gắng khôi phục trang đó từ BFCache. Nhờ đó, thao tác di chuyển nhanh hơn và cải thiện trải nghiệm duyệt web của người dùng.

Mặc dù trang nằm trong BFCache nhưng vẫn ở trạng thái bị treo và không được phép thực thi JavaScript. Điều này có nghĩa là ứng dụng không thể xử lý tin nhắn nhận được.

Để biết thêm thông tin, hãy xem bài viết Bộ nhớ đệm cho thao tác tiến/lùi.

Tác động của các cổng thông báo tiện ích đối với BFCache

Tóm lại, việc gửi thông báo qua tiện ích tới một trang trong BFCache có thể khiến bộ nhớ đệm bị xoá và ảnh hưởng đến hiệu suất.

Khi một trang có cổng thông báo tiện ích mở được lưu trữ trong BFCache, cổng đó sẽ luôn mở. Sau khi trang được khôi phục từ BFCache, tham chiếu cũ của cổng thông báo vẫn có thể được worker dịch vụ tiện ích sử dụng để đăng thông báo lên tập lệnh nội dung.

Tuy nhiên, nếu tiện ích cố gắng đăng thông báo qua cổng thông báo đó trong khi trang vẫn còn trong BFCache, thì thông báo sẽ được gửi nhưng không được gửi đầy đủ vì trình xử lý bị treo. Rất khó để tiện ích mở rộng giải quyết và giải quyết trường hợp này, vì cả việc xếp hàng và gửi thư đều có vấn đề riêng.

Để tránh gặp phải các vấn đề liên quan đến việc mất thư, trong cách triển khai hiện tại của Chrome, Chrome sẽ loại bỏ trang lưu trữ khỏi BFCache và loại bỏ thông báo đó. Khi người dùng quay lại trang, trang đó sẽ được tải hoàn toàn để cho phép tiện ích thiết lập kết nối mới.

Mặt khác, việc triển khai này ràng buộc các trường hợp áp dụng BFCache, hạn chế mức tăng hiệu suất, đặc biệt đối với các tiện ích có cơ chế truyền tin hoặc nhịp tim thường xuyên gửi thông báo đến tất cả các kết nối. Hơn nữa, khi việc loại bỏ được kích hoạt khi tiện ích gửi thông báo đến tập lệnh nội dung, các nhà phát triển web không có cách nào để ngăn trang của họ bị loại.

Để cải thiện hiệu suất tổng thể, chúng tôi dự định ra mắt một hành vi mới đối với cổng thư.

Hành vi mới: đóng kênh thông báo khi trang được lưu trữ trong BFCache

Kể từ Chrome 123, khi một trang có cổng thông báo tiện ích mở được lưu trữ trong BFCache, kênh thông báo cơ bản sẽ chủ động bị đóng ở phía tập lệnh nội dung. Do đó, tất cả các cổng tin nhắn sẽ đóng và tiện ích sẽ nhận được sự kiện onDisconnect.

Vì kênh này đã bị đóng nên sẽ không có thông báo nào được gửi đến trang khi kênh nằm trong BFCache. Do đó, trang sẽ không bị loại khỏi phần mở rộng này.

Ngay cả sau khi trang được khôi phục từ BFCache, kênh thông báo đã đóng vẫn không được mở lại. Phương pháp đề xuất cho tác giả tiện ích là theo dõi các sự kiện trong vòng đời của trang và thiết lập kết nối mới khi trang được khôi phục từ BFCache, như trong ví dụ sau.

// content script

let port;

window.addEventListener('pageshow', (event) => {
  if (event.persisted) {
    // The page is restored from BFCache, set up a new connection.
    port = chrome.runtime.connect();
  }
});

Đọc thêm về cuộc trò chuyện WECG từ người đại diện của nhiều trình duyệt (trong vấn đề 474).

Tôi có bị ảnh hưởng không?

Hành vi mới này sẽ xuất hiện sau một cờ trong Chrome 123 để bạn có thể kiểm thử mã của mình. Hãy xem tiến trình để biết thêm thông tin. Hãy làm theo các bước tiếp theo để kiểm tra tiện ích của bạn. Xin lưu ý rằng tiện ích này chỉ cung cấp một quy trình kiểm thử đơn giản. Chúng tôi khuyến khích bạn chạy Chrome với tính năng được bật trong một khoảng thời gian vì rất khó để dự đoán những tính năng nào trong tiện ích có thể gây ra sự cố.

  1. Đảm bảo phiên bản Chrome từ 123 trở lên. Tốt nhất là bạn nên sử dụng Chrome Canary vì Chrome có thêm cảnh báo để giúp kiểm thử dễ dàng hơn.
  2. Khởi chạy Chrome với cờ sau:

    --disable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
    
  3. Truy cập vào một trang đủ điều kiện cho BFCache mà không chạy tiện ích (ví dụ: một số trang web đơn giản như https://example.com/). Làm theo hướng dẫn về BFCache để đảm bảo rằng BFCache được khôi phục.

  4. Cài đặt và bật tiện ích này, đồng thời kiểm tra lại điều kiện sử dụng BFCache. Bạn có thể điều hướng khỏi trang theo cách thủ công, đợi một khoảng thời gian đủ lâu để tiện ích của bạn đăng thông báo lên trang BFcache và điều hướng trở lại.

  5. Nếu bạn phải tải trang mới thay vì từ BFCache do bị loại bỏ và vấn đề ngăn việc khôi phục là "ExtensionSentMessageToCacheFrame", thì có thể tiện ích này sẽ bị ảnh hưởng bởi thay đổi này.

    Trong Chrome Canary 124.0.6315.0 trở lên, bạn cũng sẽ thấy cảnh báo sau trên trang:

    Cảnh báo hiển thị khi một trang không được khôi phục từ BFCache.
    Cảnh báo hiển thị khi một trang không được khôi phục từ BFCache.

Sau khi xác nhận rằng tiện ích đang đăng thông báo lên trang BFCache, bạn có thể làm theo các bước sau để buộc bật thử nghiệm và quan sát xem có lỗi logic nào không.

  1. Khởi chạy Chrome với cờ sau:

    --enable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
    
  2. Truy cập vào trang không được khôi phục từ BFCache vì "ExtensionSentMessageToCacheFrame".

  3. Điều hướng ra xa và quay lại. Bây giờ, trang sẽ được khôi phục, nhưng kênh thông báo giữa tập lệnh nội dung và trình chạy dịch vụ sẽ bị ngắt kết nối.

  4. Kiểm tra xem tiện ích có hoạt động như bình thường hay không. Nếu không, bạn nên kết nối lại theo cách thủ công như minh hoạ trong phần trước.

Lịch phát hành

Chúng tôi dự định sẽ từng bước triển khai hành vi mới này kể từ Chrome 123. Dưới đây là kế hoạch chi tiết:

Ngày Mốc quan trọng theo kế hoạch
Ngày 15 tháng 2 Bắt đầu thử nghiệm hành vi mới trong Chrome Canary và Dev.
Ngày 1 tháng 3 Bắt đầu thử nghiệm hành vi mới trong Chrome Beta.
Ngày 18 tháng 3 Phát hành hành vi mới cho 4 phần trăm người dùng trong phiên bản Chrome ổn định.
Ngày 25 tháng 3 Phát hành hành vi mới cho 50% người dùng trong phiên bản Chrome ổn định.
Ngày 2 tháng 4 Thử nghiệm sẽ kết thúc, đặt hành vi mới làm hành vi mặc định.