如何将Three.js模块脚本中的setModel等函数挂载到window全局以实现外部调用?
解决方案:将Three.js模块中的函数暴露到全局
当然可以把这些函数添加到window全局对象上!因为你用的是ES模块脚本(通过type="module"引入),模块内部的变量和函数默认都是私有作用域,外部脚本无法直接访问。手动将需要暴露的函数挂载到window对象,就能让它们在脚本外部被调用。
具体操作步骤
在每个你想对外暴露的函数定义完成后,添加一行代码将函数赋值给window的对应属性即可:
// 定义你的setModel函数 function setModel(url, callback) { gltfLoader.load( url, function ( gltf ) { if (model) scene.remove(model); // Remove the old model model = gltf.scene; // remember this one so we can remove it later. scene.add( model ); // Add new model render(); // Something has changed, render again. if (callback) { callback(); } } ); } // 暴露到全局window对象 window.setModel = setModel; // 定义setNormalMapFromUrl函数 function setNormalMapFromUrl(url, complete, error) { textureLoader.load( url, function ( texture ) { setNormalMap(texture); if (complete) complete(texture); }, undefined, function ( err ) { if (error) error(err); } ); }; // 暴露到全局 window.setNormalMapFromUrl = setNormalMapFromUrl; // 同理处理其他需要暴露的函数 function setRoughnessMapFromUrl(url, complete, error) { // 原有逻辑 } window.setRoughnessMapFromUrl = setRoughnessMapFromUrl; function setMapFromUrl(url, complete, error) { // 原有逻辑 } window.setMapFromUrl = setMapFromUrl;
注意事项
- 确保外部调用这些函数的脚本,是在你的Three.js模块脚本加载完成之后执行的。比如可以把外部脚本放在模块脚本的后面,或者监听
DOMContentLoaded事件再调用。 - 这种全局挂载的方式虽然简单,但如果项目规模较大,建议考虑使用更模块化的方案(比如导出函数后在外部脚本中通过
import引入),不过对于快速实现外部调用的需求,挂载到window是完全可行的。
内容的提问来源于stack exchange,提问作者Udders
相关产品推荐
相关产品推荐

