如何使用webworkers加载内联Javascript?

如何使用webworkers加载内联Javascript?,javascript,web-worker,Javascript,Web Worker,据我所知,web工作者需要在单独的JavaScript文件中编写。但是我如何在webworkers中加载以下内联Javascript 下面的脚本是three.js的一个示例。js是一个JavaScript 3D库,它使WebGL更简单 <script> var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight,

据我所知,web工作者需要在单独的JavaScript文件中编写。但是我如何在webworkers中加载以下内联Javascript

下面的脚本是three.js的一个示例。js是一个JavaScript 3D库,它使WebGL更简单

<script>
  var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);

var renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

var geometry = new THREE.BoxGeometry(1, 1, 1);
var material = new THREE.MeshBasicMaterial({
  color: 0x00ff00
});
var cube = new THREE.Mesh(geometry, material);
scene.add(cube);

camera.position.z = 5;

var loader = new THREE.JSONLoader();
loader.load("mesh1.json", function(geometry) {
  var mesh1 = new THREE.Mesh(geometry, material["demomaterial"]);
  scene.add(mesh1);
});
loader.load("mesh2.json", function(geometry) {
  var mesh2 = new THREE.Mesh(geometry, material["demomaterial"]);
  scene.add(mesh2);
});
loader.load("mesh3.json", function(geometry) {
  var mesh2 = new THREE.Mesh(geometry, material["demomaterial"]);
  scene.add(mesh3);
});
var render = function() {
  requestAnimationFrame(render);

  cube.rotation.x += 0.1;
  cube.rotation.y += 0.1;

  renderer.render(scene, camera);
};

render(); 

</script>

var scene=new THREE.scene();
var摄像机=新的三透视摄像机(75,window.innerWidth/window.innerHeight,0.11000);
var renderer=new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth、window.innerHeight);
document.body.appendChild(renderer.doElement);
var geometry=新的3.BoxGeometry(1,1,1);
var材料=新的三网格基本材料({
颜色:0x00ff00
});
var cube=新的三个网格(几何体、材质);
场景.添加(立方体);
摄像机位置z=5;
var loader=new THREE.JSONLoader();
loader.load(“mesh1.json”,函数(几何体){
var mesh1=新的三点网格(几何体、材质[“demomaterial”]);
场景。添加(网格1);
});
loader.load(“mesh2.json”,函数(几何体){
var mesh2=新的三点网格(几何体、材质[“demomaterial”]);
场景。添加(网格2);
});
loader.load(“mesh3.json”,函数(几何体){
var mesh2=新的三点网格(几何体、材质[“demomaterial”]);
场景。添加(网格3);
});
var render=function(){
请求动画帧(渲染);
立方体旋转.x+=0.1;
立方体旋转y+=0.1;
渲染器。渲染(场景、摄影机);
};
render();

我不太了解
three.js
,但Web工作人员显然无权访问定义了
requestAnimationFrame(…)
窗口
对象。因此,上面编写的脚本无法加载到工作程序中,即使它是在单独的JS文件中定义的,并在
新工作程序(“file.JS”)中实例化。如果您确实想“内联”加载脚本,几乎所有浏览器现在都支持执行此操作所需的
URL
Blob
API,尽管工作人员仍然无法访问
窗口
文档
,等等。有关此技术的详细信息,请参阅

如果您真正想问的问题是“如何使用Web Workers来帮助呈现WebGL?”,那么简单的答案是在Worker中执行所有非
窗口、非
文档的工作,然后使用ArrayBuffers在主线程和工作线程之间来回传递消息。通过这种方式,您可以以最小的开销在线程之间来回传递大量数据。

签出,它允许内联Web工作人员

由于它是一个WebWorker,因此不会在WebWorker代码中定义THREE.js。为了解决这个问题,您只需要在Web Worker中包含THREE.js的代码

要在WebWorker中使用THREE.js,您必须将THREE.js的所有代码添加到下面的代码片段所示的提升函数中

//创建新工作进程
倭黑猩猩(“工人ID”);
//举倾就像定义你将在你的工作中使用的函数和变量
//稍后的web工作者代码
倭黑猩猩(“工人ID”).起重机(功能(){
//在此处添加三个.js代码。复制/粘贴缩小版
var add=函数(a,b){
返回a+b;
};
});
//定义要在Web Worker中运行的名为useAdd的函数
倭黑猩猩(“工人ID”)。定义(“使用添加”,功能(数据){
//在这里使用THREE.js。。。
var result=add(data.a,data.b);//这里我们使用的是我们之前提升的函数
log(结果);//在浏览器中记录它
倭黑猩猩。完成(结果);
}).compile();
//我们将添加数据
风险值数据={
a:3,
b:7
};
//我们使用将在web worker中运行的已定义函数。
倭黑猩猩(“工人ID”)。运行(“使用添加”,数据);
//输出:[倭黑猩猩('worker-ID'):日志]:10
倭黑猩猩('worker-ID')。完成(功能(数据){
$(“body”).append(“来自倭黑猩猩的响应(\”+this.ref+“\”):“+data+”

”; });

倭黑猩猩