目前,我正在将现有的Web应用移植到require.js
。大多数事情似乎都有效,但是使用网络工作者的功能。例如,我有一个工人,在一个单独的JS文件MeshLoader.js
定义的,即从一个STL文件加载的3D模型:与网络工作者一起使用require.js的正确方法是什么?
importScripts('../lib/three.min.js', '../lib/STLLoader.js');
onmessage = function(e) {
var blob = e.data;
var reader = new FileReaderSync();
readContents(reader.readAsArrayBuffer(blob));
};
function readContents(contents) {
try {
var geometry = new THREE.STLLoader().parse(contents);
} catch (e) {
// error handling
}
var attributes = {};
// parsing the file is going on here
// ...
postMessage({
status: 'completed',
attributes: attributes,
});
}
小备注:STLLoader.js
模块是three.js
插件限定STLLoader
对象,并将它到THREE
命名空间。这就是我如何与require.js
重写了它:
importScripts('../lib/require.min.js');
require({
baseUrl: '../lib'
}, [
'require', 'three.min', 'stlloader'
],
function(require, THREE, STLLoader) {
onmessage = function(e) {
var blob = e.data;
var reader = new FileReaderSync();
readContents(reader.readAsArrayBuffer(blob));
};
function readContents(contents) {
try {
var geometry = new THREE.STLLoader().parse(contents);
} catch (e) {
// error handling
}
var attributes = {};
// same code as in the initial version
// ...
postMessage({
status: 'completed',
attributes: attributes,
});
}
return onmessage;
});
工人被称为以下方式:
var worker = new Worker('js/workers/MeshLoader.js');
worker.postMessage(blob);
worker.onmessage = function (event) {
if (event.data.status == 'completed') {
// ...
} else if (event.data.status == 'failed') {
// ...
} else if (event.data.status == 'working') {
// ...
}
};
所以,问题是,似乎工人不叫的。也许我需要在requirejs.config()
部分声明它为模块,然后将该模块作为依赖项添加到其他调用此worker的模块中?
目前尚不清楚你的问题是什么,冗余调试信息丢失。我在回复中给出了一般答案,它可以可靠地解决问题(例如:http://darker.github.io/asteroids/demo-simple-bounce/ –