导入OrbitControls时出现TypeError,该如何解决?
导入Three.js的OrbitControls时出现错误
我在尝试导入OrbitControls时遇到了错误,错误提示为模块导入失败,无法找到对应的OrbitControls资源。
以下是我的代码:
JS代码(task9.js)
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls' const scene = new THREE.Scene(); const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); const renderer = new THREE.WebGLRenderer(); const geometry = new THREE.BoxGeometry(1, 1, 1); const material = new THREE.MeshBasicMaterial({color: 0x00ff00}); const cube = new THREE.Mesh(geometry, material); const controls = new OrbitControls(camera, renderer.domElement); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); scene.add(cube); camera.position.set(0, 20, 100); camera.position.z = 5; renderer.render(scene, camera); controls.update(); function animate(){ requestAnimationFrame(animate); controls.update(); renderer.render(scene, camera); }
HTML代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Document</title> <style> body { margin: 0; } </style> </head> <body> <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js" ></script> <script type="module" src="task9.js"></script> </body> </html>
我已经尝试过以下两种导入方式,但问题依然存在:
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';import { OrbitControls } from 'https://unpkg.com/three@0.128.0/examples/jsm/controls/OrbitControls.js';
解决方案
你的问题核心是混合使用了全局引入的Three.js和模块导入的OrbitControls,导致模块无法正确识别全局THREE对象,同时路径与版本不匹配。
方法1:统一使用模块导入(推荐)
修改HTML,移除全局引入的three.min.js,改用模块导入核心库:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Document</title> <style> body { margin: 0; } </style> </head> <body> <script type="module" src="task9.js"></script> </body> </html>
修改task9.js的导入语句,确保路径与r128版本匹配:
// 导入Three.js核心模块 import * as THREE from 'https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.module.js'; // 导入对应版本的OrbitControls import { OrbitControls } from 'https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three/examples/jsm/controls/OrbitControls.js'; // 后续代码保持不变 const scene = new THREE.Scene(); const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); // ...
方法2:使用全局引入的OrbitControls
若要继续使用全局引入方式,需添加对应版本的OrbitControls全局脚本:
<body> <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script> <!-- 引入同版本的OrbitControls全局脚本 --> <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three/examples/js/controls/OrbitControls.js"></script> <script src="task9.js"></script> </body>
同时删除task9.js中的import语句,直接使用全局的OrbitControls:
// 移除import语句 const scene = new THREE.Scene(); // ... const controls = new THREE.OrbitControls(camera, renderer.domElement); // ...
内容的提问来源于stack exchange,提问作者Taric_112
相关产品推荐
相关产品推荐

