Physijs - Web Worker 跨域访问

Physijs 使用了 web worker 以免影响应用程序的性能并且占用 WebGL 渲染时间。

因此在将Physijs添加到项目中时,需要配置Worker

Physijs.scripts.worker = './js/physijs_worker.js';

Web Worker 的作用,就是为 JavaScript 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行。在主线程运行的同时,Worker 线程在后台运行,两者互不干扰。等到 Worker 线程完成计算任务,再把结果返回给主线程。这样的好处是,一些计算密集型或高延迟的任务,被 Worker 线程负担了,主线程(通常负责 UI 交互)就会很流畅,不会被阻塞或拖慢。

但在使用Web Worker 时会受到同源限制,即分配给 Worker 线程运行的脚本文件,必须与主线程的脚本文件同源。

但现在我遇到的问题是,我需要运行一个由合作伙伴提供的Worker,但它来自不同的域。最终会显示类似于以下内容的错误:
Uncaught SecurityError: Failed to construct 'Worker': Script at 'xxx' cannot be accessed from origin 'xxx'

本文的目的是了解如何绕过同源策略的限制。

浏览器不允许使用指向不同域的URL创建Worker。但是它允许创建一个BLOB URL,该URL可用于初始化Worker。

可以通过以下方式创建blob:

Blob() 构造函数返回一个新的 Blob 对象。 blob的内容由参数数组中给出的值的串联组成。

//var aBlob = new Blob( array, options );
var blob = new Blob(['importScripts("http://chandlerprall.github.io/Physijs/physijs_worker.js")'], {
  "type": 'application/javascript'
});

Blob URLs
BLOB通常不一定是JavaScript“格式”,但可以是。然后,可以让浏览器在内部生成URL。此URL使用名为“BLOB”的伪协议。因此,您将获得以下形式的URL:blob:Origin/uidorigin是您在其中创建BLOB URL的页面的origin,而UID是生成的唯一ID,例如blob:https://mydomain/8126d58c-edbc-ee14-94a6-108b8f215304。

然后,可以从BLOB生成URL对象:

var blobUrl = window.URL.createObjectURL(blob);

最后将该 Blob URLs 传给 Physijs.scripts.worker :

Physijs.scripts.worker = blobUrl;

因为在 Physi.js 代码中,会使用该 blobUrl 自动创建一个Worker

// Physijs.Scene
Physijs.Scene = function( params ) {
    .
  .
  .
  this._worker = new Worker( Physijs.scripts.worker || 'physijs_worker.js' );
  .
  .
  .
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值