【问题标题】:How to enable SharedArrayBuffer in Microsoft Edge Javascript如何在 Microsoft Edge Javascript 中启用 SharedArrayBuffer
【发布时间】:2021-12-22 22:41:27
【问题描述】:
【问题讨论】:
标签:
javascript
microsoft-edge
web-worker
sharedarraybuffer
【解决方案1】:
为了启用共享数组缓冲区支持,您的网页需要位于secure context 中。为此,您需要您的服务器提供以下标头:Cross-Origin-Opener-Policy: same-origin 和 Cross-Origin-Embedder-Policy: require-corp。你可以在MDN了解更多信息
建议在服务器上更改header,但如果您根本没有能力管理服务器上的header,则可以通过Service Workers进行修改。 This blogpost 描述了通过 ServiceWorker 中的标头修改来启用 SharedArrayBuffer。它按以下顺序工作:
- 第一次加载页面时,会注册一个 Service Worker
- 页面已重新加载
- SharedArrayBuffer 可用,因为 ServiceWorker 控制所有请求的所有 CORS 标头
Service Worker 通过添加 CORS/COEP 标头来修改所有请求(示例摘自上述博文):
self.addEventListener("install", function() {
self.skipWaiting();
});
self.addEventListener("activate", (event) => {
event.waitUntil(self.clients.claim());
});
self.addEventListener("fetch", function(event) {
if (event.request.cache === "only-if-cached" && event.request.mode !== "same-origin") {
return;
}
event.respondWith(
fetch(event.request)
.then(function(response) {
// It seems like we only need to set the headers for index.html
// If you want to be on the safe side, comment this out
// if (!response.url.includes("index.html")) return response;
const newHeaders = new Headers(response.headers);
newHeaders.set("Cross-Origin-Embedder-Policy", "require-corp");
newHeaders.set("Cross-Origin-Opener-Policy", "same-origin");
const moddedResponse = new Response(response.body, {
status: response.status,
statusText: response.statusText,
headers: newHeaders,
});
return moddedResponse;
})
.catch(function(e) {
console.error(e);
})
);
});