如何在Chrome中定义SharedArrayBuffer?

ndh0cuux  于 2023-01-28  发布在  Go
关注(0)|答案(4)|浏览(1245)

我正在开发this tutorial之后的React + WASM + FFmpeg应用程序
在Chrome浏览器上,我收到错误Uncaught (in promise) ReferenceError: SharedArrayBuffer is not defined error.
我按照doc reference,它说下面,我不明白。

跨来源隔离概述

您可以通过为页面提供以下标题来隔离页面的跨源:

Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin

serving the pages with these headers是什么意思?
我该如何实现这一点?
我甚至找到了Chrome dev's official video,但即使这样也没有解释任何实现细节。
编辑2:我能找到的最好的指令在这里,但即使这样对我来说也太模糊了。设置一个头意味着什么?我没有要求任何东西开始。
编辑:我的React版本已经是17. 0. 2,所以this should have been fixed,但我不知何故也得到了这个错误...
[Deprecation] SharedArrayBuffer will require cross-origin isolation as of M92, around July 2021.

ljo96ir5

ljo96ir51#

SharedArrayBuffer用于在主浏览上下文和另一个代理(另一个网页或工作者)之间共享数据缓冲区。
然而,为了最小化可能的安全漏洞,规范声明此API只能在secure context中运行。
除了此安全先决条件外,任何顶级文档都必须处于跨源隔离中。这意味着,提供内容的一方应该告诉浏览器它应该阻止跨源资源的加载。(来自域A的文档试图从域B获取数据)
这是由服务器通过在服务网站时指定以下两个响应头来完成的:

Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp

如何在调试环境中指定它们?
你需要建立一个标准的文件服务器,比如Apache,然后你需要调整它的配置来为上面的头文件提供服务。
快速设置:https://www.wampserver.com/en/
提供标头信息的答案:https://stackoverflow.com/a/35566100/4185234

nxowjjhe

nxowjjhe2#

让我们先说说serving the pages with these headers的含义。
如果你曾经用Express.js构建过一个API,你会很熟悉这个问题,本质上,这意味着当用户发出GET请求查看网页时,你必须以HTTP头的形式发送一些额外的信息。
具体来说,第一个标题防止页面加载任何未明确授予权限的跨源资源。第二个标题意味着您不能与任何跨源文档共享浏览上下文组。这两个标题都是用于防止跨源攻击的安全措施。即使您可能没有请求任何内容,也必须应用它们。
关于你的问题,我建议你安装Chrome扩展CORS,我不知道它是怎么工作的。但我已经用过它在过去,这将是一个临时的解决方案。我浏览了教程,你下面,我没有看到一个服务器设置(例如Express.js/Node的http).如果你有任何一个这样的头文件,你可以把它作为参数传递给服务器.
要检查CORS设置是否按预期工作,请将以下代码添加到您的应用:

if (crossOriginIsolated) {
    // Works
}
uurity8g

uurity8g3#

我最近遇到了这个问题,并找到了你的问题和答案以上
提供带有这些标头的页面意味着什么?
这意味着配置服务器来包含这些头文件。如何配置服务器取决于你使用的软件,Apache,Nginx,Caddy,或者你使用的是其他的1000种软件中的一种,或者你自己编写的。
我写了2(或者更准确地说,我用了一个库来写2),我添加了包含这些头文件的选项。这两个都是开源的,所以如果你想知道它们是如何工作的,你可以看看里面。
如果您喜欢UI,那么可以使用this one。如果您喜欢命令行,那么安装node.js,然后可以使用this one

v1l68za4

v1l68za44#

下面是node.js的静态服务器示例

var http = require("http");
var fs = require("fs");
var path = require("path");

http
  .createServer(function (request, response) {
    console.log("request starting...");

    response.setHeader("Cross-Origin-Opener-Policy", "same-origin");
    response.setHeader("Cross-Origin-Embedder-Policy", "require-corp");

    var filePath = "." + request.url;
    if (filePath == "./") filePath = "./index.html";

    var extname = path.extname(filePath);
    var contentType = "text/html";
    switch (extname) {
      case ".js":
        contentType = "text/javascript";
        break;
      case ".css":
        contentType = "text/css";
        break;
      case ".json":
        contentType = "application/json";
        break;
      case ".png":
        contentType = "image/png";
        break;
      case ".jpg":
        contentType = "image/jpg";
        break;
      case ".wav":
        contentType = "audio/wav";
        break;
    }

    fs.readFile(filePath, function (error, content) {
      if (error) {
        if (error.code == "ENOENT") {
          fs.readFile("./404.html", function (error, content) {
            response.writeHead(200, { "Content-Type": contentType });
            response.end(content, "utf-8");
          });
        } else {
          response.writeHead(500);
          response.end(
            "Sorry, check with the site admin for error: " +
              error.code +
              " ..\n"
          );
          response.end();
        }
      } else {
        response.writeHead(200, { "Content-Type": contentType });
        response.end(content, "utf-8");
      }
    });
  })
  .listen(80);
console.log("Server running at http://127.0.0.1:80/");

相关问题