【问题标题】:How to enable SharedArrayBuffer in Microsoft Edge Javascript如何在 Microsoft Edge Javascript 中启用 SharedArrayBuffer
【发布时间】:2021-12-22 22:41:27
【问题描述】:

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

【问题讨论】:

    标签: javascript microsoft-edge web-worker sharedarraybuffer


    【解决方案1】:

    为了启用共享数组缓冲区支持,您的网页需要位于secure context 中。为此,您需要您的服务器提供以下标头:Cross-Origin-Opener-Policy: same-originCross-Origin-Embedder-Policy: require-corp。你可以在MDN了解更多信息

    建议在服务器上更改header,但如果您根本没有能力管理服务器上的header,则可以通过Service Workers进行修改。 This blogpost 描述了通过 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);
        })
      );
    });

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-21
      • 2016-10-29
      • 2017-07-29
      相关资源
      最近更新 更多