0

所以前几天,我问了这个关于 javascript webworkers 的问题: Javascript Webworker how to put json information into array buffer。我收到的答案之一是使用 SharedArrayBuffer 在主 javascript 和 webworker 之间共享内存。我知道有一段时间,这在 microsoft edge 上可用,但出于安全考虑,不久前被禁用。我的边缘版本是 96.0.1054.62。有没有办法在浏览器配置或设置中启用共享数组缓冲区?目前,当我尝试使用它时,它说 SharedArrayBuffer 未定义。

4

1 回答 1

3

为了启用共享数组缓冲区支持,您的网页需要处于安全上下文中。为此,您需要您的服务器提供以下标头:Cross-Origin-Opener-Policy: same-originCross-Origin-Embedder-Policy: require-corp. 您可以在MDN上阅读有关它的更多信息

更改服务器上的标头是推荐的方式,但如果您根本没有能力管理服务器上的标头,那么您可以通过 Service Worker 修改它们。这篇博文描述了通过在 ServiceWorker 中修改标头来启用 SharedArrayBuffer。它按以下顺序工作:

  1. 第一次加载页面时,会注册一个 Service Worker
  2. 页面已重新加载
  3. 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);
    })
  );
});

于 2021-12-22T23:20:21.973 回答