Việc chia sẻ mô-đun WebAssembly giữa các môi trường cùng trang web sẽ chỉ bị hạn chế ở cùng 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 đưa vào phạm vi nguồn gốc lâu dài. Những nhà phát triển đang sử dụng các mô-đun Wasm theo cách này phải đảm bảo tạo bản sao các mô-đun đó ở cùng một nguồn gốc để tiếp tục sử dụng các mô-đun đó 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ô-đun Wasm được nhập từ https://iframe.site.example
được chia sẻ với https://main.site.example
thông qua postMessage()
. Lưu ý rằng các miền này trên cùng một 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 thiết phải làm vậy
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 theo khoá trang web. Điều này có nghĩa là các tài liệu trên cùng một trang web được xử lý trong cùng một quy trình (cách hoạt động chính xác của quy trình này còn tuỳ thuộc vào trình duyệt). Gần đây, Chrome bắt đầu xử lý các yêu cầu này theo các đơ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 kém 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.
Theo kế hoạch, tất cả các cụm tác nhân sẽ được khoá theo nguồn gốc theo mặc định. Để đạt được điều này, chúng ta cần hạn chế các chức năng yêu cầu cụm nguồn gốc được khoá theo trang web:
- (Chỉ dành cho Chrome) Bạn không thể gửi các đối tượng
SharedArrayBuffer
hoặcWebAssembly.Memory
đến các trang khác có cùng nguồn gốc trên cùng một trang web. Tính năng này đã được áp dụng kể từ 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 có nhiều 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ó nguồn gốc khác nhau trên cùng một trang web truy cập đồng bộ vào DOM của nhau, nhưng trong các cụm tác nhân theo khoá nguồn gốc, tính năng này bị tắt.
Bằng cách giải quyết tất cả các thay đổi ở trên, Chrome sẽ chuyển sang sử dụng các cụm tác nhân được khoá nguồn theo mặc định.
Để tìm hiểu thêm về 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 khoá nguồn theo mặc định, chúng ta sẽ đặt document.domain
ở chế độ chỉ có thể đọc. Nhóm Chrome dự định sẽ triển khai thay đổi này vào khoảng năm 2022.
- Nội dung giải thích về cụm tác nhân được khoá theo nguồn gốc
- Tính năng cô lập theo mặc định
- Ngừng sử dụng
document.domain
Ảnh của Markus Winkler trên Unsplash