การแชร์โมดูล WebAssembly ระหว่างสภาพแวดล้อมในเว็บไซต์เดียวกันจะจำกัดไว้เฉพาะต้นทางเดียวกันเท่านั้น
เราจะเลิกใช้งานการแชร์โมดูล WebAssembly (Wasm) ระหว่างสภาพแวดล้อมเว็บไซต์เดียวกันแต่แบบข้ามต้นทาง เพื่อให้คลัสเตอร์ Agent อยู่ในขอบเขตของต้นทางในระยะยาว นักพัฒนาแอปที่ใช้โมดูล Wasm ในลักษณะดังกล่าวต้องตรวจสอบว่าได้สร้างอินสแตนซ์โมดูลเหล่านั้นที่ต้นทางเดียวกันเพื่อใช้ต่อไปหลังจาก Chrome 95
โมดูล Wasm คืออะไรและทำงานอย่างไร
โปรแกรม WebAssembly จะจัดระเบียบเป็นโมดูล ซึ่งเป็นหน่วยของการติดตั้งใช้งาน การโหลด และการคอมไพล์
ในโค้ดตัวอย่างต่อไปนี้ โมดูล Wasm ที่นำเข้าจาก https://iframe.site.example จะแชร์กับ https://main.site.example ผ่าน postMessage() โปรดทราบว่าโดเมนเหล่านี้เป็นเว็บไซต์เดียวกันแต่แบบข้ามต้นทาง
โมดูล Wasm ใน https://iframe.site.example:
(async () => {
const instance = await WebAssembly.instantiateStreaming(fetch('./add.wasm'), {});
iframe.contentWindow.postMessage(instance.module, `https://main.site.example`);
})();
ตั้งแต่ Chrome 95 เป็นต้นไป ผู้ส่งและผู้รับต้องมาจากต้นทางเดียวกัน ในกรณีข้างต้น https://iframe.site.example ต้องเป็น https://main.site.example หรือในทางกลับกัน
เหตุผลที่ต้องใช้
Chrome จัดการเอกสาร แท็บ และเฟรมต่างๆ ภายในคลัสเตอร์ Agent ที่ใช้คีย์เว็บไซต์ ซึ่งหมายความว่าเอกสารในเว็บไซต์เดียวกันจะได้รับการจัดการภายในกระบวนการเดียวกัน (วิธีการทำงานที่แน่นอนจะแตกต่างกันไปตามเบราว์เซอร์) เมื่อเร็วๆ นี้ Chrome เริ่มจัดการสิทธิ์เหล่านี้ในหน่วยที่ละเอียดยิ่งขึ้น นั่นคือต้นทาง เราเรียกสิ่งนี้ว่าคลัสเตอร์ Agent ที่ผูกกับต้นทาง อย่างไรก็ตาม เนื่องจากวิธีนี้ใช้ทรัพยากรมาก จึงมีการใช้คลัสเตอร์ Agent ที่ผูกกับต้นทางกับเว็บไซต์ที่จำกัดตามการเรียนรู้เท่านั้น
แผนคือการทำให้คลัสเตอร์ Agent ทั้งหมดผูกกับต้นทางโดยค่าเริ่มต้น เพื่อให้บรรลุเป้าหมายนี้ เราจำเป็นต้องจำกัดความสามารถที่ต้องใช้คลัสเตอร์ต้นทางที่คีย์ตามเว็บไซต์
- (Chrome เท่านั้น) คุณจะส่งออบเจ็กต์
SharedArrayBufferหรือWebAssembly.Memoryไปยังหน้าเว็บอื่นที่มาจากคนละต้นทางแต่เป็นเว็บไซต์เดียวกันไม่ได้อีกต่อไป ซึ่งมีอยู่แล้วตั้งแต่ Chrome 92 - คุณจะส่งออบเจ็กต์
WebAssembly.Moduleไปยังหน้าเว็บแบบข้ามต้นทางในเว็บไซต์เดียวกันผ่านpostMessage()ไม่ได้อีกต่อไป เราจะอธิบายการเปลี่ยนแปลงนี้โดยละเอียดยิ่งขึ้นที่ด้านล่าง - คุณจะตั้งค่า
document.domainไม่ได้อีกต่อไป ฟีเจอร์นี้เป็นฟีเจอร์เก่าที่ปกติแล้วจะอนุญาตให้หน้าเว็บแบบข้ามต้นทางในเว็บไซต์เดียวกันเข้าถึง DOM ของกันและกันแบบพร้อมกันได้ แต่จะปิดใช้ในคลัสเตอร์ Agent ที่ผูกกับต้นทาง
เมื่อจัดการกับการเปลี่ยนแปลงทั้งหมดข้างต้นแล้ว Chrome จะเปลี่ยนไปใช้คลัสเตอร์ Agent ที่คีย์ตามต้นทางโดยค่าเริ่มต้น
ดูข้อมูลเพิ่มเติมเกี่ยวกับคลัสเตอร์ Agent ที่ผูกกับต้นทางได้ที่การขอการแยกประสิทธิภาพด้วยส่วนหัว Origin-Agent-Cluster
ขั้นตอนถัดไปและทรัพยากร
เพื่อให้ Chrome ทำงานร่วมกับคลัสเตอร์ Agent ที่คีย์ตามต้นทางโดยค่าเริ่มต้น เราจะทำให้ document.domain เป็นแบบอ่านอย่างเดียว ทีม Chrome ตั้งเป้าที่จะทำการเปลี่ยนแปลงนี้ภายในปี 2022
รูปภาพโดย Markus Winkler บน Unsplash