为何SharedWorker中SharedArrayBuffer为undefined且crossOriginIsolated为false?
你遇到的这个问题其实和Chrome对SharedWorker的跨源隔离模式实现逻辑有关,咱们一步步拆解来看:
首先先确认你的场景:
你用emrun服务器提供了正确的跨源隔离相关响应头(Cross-Origin-Opener-Policy: same-origin、Cross-Origin-Embedder-Policy: credentialless等),主页面的控制台也正常输出crossOriginIsolated: true且SharedArrayBuffer可用,但SharedWorker里却完全相反——这不是你的配置问题,而是浏览器规范实现的细节导致的。
接下来解释核心原因:
根据HTML规范中关于Worker运行的逻辑,当创建SharedWorker时,浏览器会执行以下关键步骤:
- 第一步:判断Worker的嵌入策略是否兼容跨源隔离,且是SharedWorker的情况下,会给Worker的代理集群设置跨源隔离模式,可选值为**"concrete"或"logical"**,具体选哪个由浏览器实现决定。
- 第二步:只有当代理集群的跨源隔离模式是**"concrete"**时,Worker全局作用域的
crossOriginIsolated才会被设为true,进而满足使用SharedArrayBuffer的安全要求。
而规范里也提到,"logical"模式是为那些难以提供SharedArrayBuffer所需安全特性的平台设计的:这种模式下,跨源隔离的部分限制会生效,但不会赋予Worker跨源隔离能力,自然也就无法访问SharedArrayBuffer。
回到你的情况,Chrome 138在处理SharedWorker时,选择了"logical"模式,这就直接导致Worker里的crossOriginIsolated为false,SharedArrayBuffer也就变成了undefined。
附上你的代码示例方便参考:
主页面index.html代码:
<html> <body> <script type="text/javascript"> console.log( 'outer:', 'typeof SharedArrayBuffer:', typeof SharedArrayBuffer, 'crossOriginIsolated:', crossOriginIsolated); new SharedWorker('worker.js'); </script> </body> </html>
SharedWorker文件worker.js代码:
console.log( 'inner:', 'typeof SharedArrayBuffer:', typeof SharedArrayBuffer, 'crossOriginIsolated:', crossOriginIsolated);
内容来源于stack exchange
相关产品推荐
相关产品推荐

