Việc chia sẻ mô-đun WebAssembly giữa các môi trường trên cùng một trang web sẽ bị hạn chế chỉ trong cùng một nguồn gốc.
Tính năng chia sẻ mô-đun WebAssembly (Wasm) giữa các môi trường cùng trang web nhưng khác nguồn gốc sẽ ngừng hoạt động để cho phép các cụm tác nhân được đặt trong phạm vi nguồn gốc về lâu dài. Những nhà phát triển đang sử dụng mô-đun Wasm theo cách này phải đảm bảo tạo thực thể cho các mô-đun đó tại cùng một nguồn gốc để tiếp tục sử dụng sau Chrome 95.
Mô-đun Wasm là gì và cách hoạt động
Các chương trình WebAssembly được sắp xếp thành các mô-đun, là đơn vị triển khai, tải và biên dịch.
Trong mã ví dụ sau, một mô-đun Wasm được nhập từ https://iframe.site.example sẽ được chia sẻ với https://main.site.example thông qua postMessage(). Lưu ý rằng các miền này cùng trang web nhưng khác nguồn gốc.
Mô-đun Wasm trên https://iframe.site.example:
(async () => {
const instance = await WebAssembly.instantiateStreaming(fetch('./add.wasm'), {});
iframe.contentWindow.postMessage(instance.module, `https://main.site.example`);
})();
Kể từ Chrome 95, người gửi và người nhận phải có cùng nguồn gốc. Trong trường hợp trên, https://iframe.site.example cần phải là https://main.site.example hoặc ngược lại.
Lý do cần có tín hiệu về đối tượng
Chrome đã xử lý nội bộ nhiều tài liệu, thẻ và khung trên các cụm tác nhân có khoá trang web. Điều này có nghĩa là các tài liệu cùng trang web được xử lý trong cùng một quy trình (cách thức hoạt động chính xác của quy trình này sẽ khác nhau tuỳ theo trình duyệt). Gần đây, Chrome bắt đầu xử lý các quyền này theo đơn vị chi tiết hơn: nguồn gốc. Chúng tôi gọi đây là cụm tác nhân theo khoá nguồn gốc. Tuy nhiên, vì việc này tốn nhiều tài nguyên, nên các cụm tác nhân theo khoá nguồn gốc chỉ được áp dụng cho một số trang web theo phương pháp phỏng đoán.
Kế hoạch là đặt tất cả cụm tác nhân theo khoá nguồn gốc theo mặc định. Để đạt được điều này, chúng ta cần hạn chế những chức năng yêu cầu cụm gốc có khoá trang web:
- (Chỉ dành cho Chrome) Bạn không thể gửi đối tượng
SharedArrayBufferhoặcWebAssembly.Memoryđến các trang khác nguồn gốc trên cùng một trang web nữa. Tính năng này đã có từ phiên bản Chrome 92. - Bạn không thể gửi các đối tượng
WebAssembly.Moduleđến các trang khác trên cùng một trang web nhưng khác nguồn gốc thông quapostMessage()nữa. Thay đổi này được giải thích chi tiết hơn ở bên dưới. - Bạn không thể đặt
document.domainđược nữa. Đây là một tính năng cũ thường cho phép các trang có cùng trang web nhưng khác nguồn gốc truy cập đồng bộ vào DOM của nhau, nhưng tính năng này bị tắt trong các cụm tác nhân theo khoá nguồn gốc.
Bằng cách giải quyết tất cả các thay đổi nêu trên, Chrome sẽ chuyển sang sử dụng cụm tác nhân theo khoá nguồn gốc theo mặc định.
Để tìm hiểu thêm về phân cụm tác nhân theo khoá nguồn gốc, hãy xem bài viết Yêu cầu tách biệt hiệu suất bằng tiêu đề Origin-Agent-Cluster.
Các bước tiếp theo và tài nguyên
Để Chrome hoạt động với các cụm tác nhân theo khoá nguồn gốc theo mặc định, chúng tôi sẽ
đặt document.domain ở chế độ chỉ đọc. Nhóm Chrome dự định sẽ triển khai thay đổi này vào một thời điểm nào đó trong năm 2022.
- Tài liệu giải thích về phân cụm tác nhân theo khoá nguồn gốc
- Tính độc lập theo mặc định
- Ngừng sử dụng
document.domain
Ảnh của Markus Winkler trên Unsplash