说明
我正在尝试在我的项目中使用 THREE.js 中的OrbitControls
。当我尝试导入OrbitControls
对象时,我在谷歌Chrome DevTools控制台中收到以下错误消息。
请求的模块"./three.js"不提供名为"事件调度程序"的导出
当我手动检查three.js
(r119) 时,我可以看到它确实导出了第 50631 行的EventDispatcher
。
问:鉴于此信息,为什么我会收到上述错误消息,以及如何解决此问题?
.HTML
<!DOCTYPE html>
<html lang="en">
<body>
<script src="three.js" crossorigin="anonymous"></script>
<script src="main.js" type="module"></script>
</body>
</html>
主.js
import { OrbitControls } from './OrbitControls.js'
编辑:感谢史蒂夫,我问题的根本原因是我使用的是three.js
的非模块版本,而不是名为three.module.js
的正确版本(对于我的用例)。如果您收到错误消息,请确保您正在下载three.module.js
文件。
我假设你正在使用OrbitControls.js在 https://github.com/mrdoob/three.js/blob/dev/examples/jsm/controls/OrbitControls.js 中找到
您正在将模块库与非模块库混合在一起。如果你看OrbitControls.js
的第一行
import {
EventDispatcher,
MOUSE,
Quaternion,
Spherical,
TOUCH,
Vector2,
Vector3
} from "../../../build/three.module.js";
它试图从../../../build/three.module.js
导入变量,这可能不存在。从您的错误消息来看,似乎有人已经将其编辑为"./three.js",这听起来像是非模块版本。
解决 方案
保留引用
- 将所有
three.js
下载到一个文件夹(如lib/three
) - (可选)删除不需要的文件
导入方式:
import { OrbitControls } from './lib/three/examples/jsm/controls/OrbitControls.js';
import * as THREE from './lib/three/build/three.module.js';
仅修改所需的文件
或者,您可以仅下载所需的文件并更改引用:
- 从 https://github.com/mrdoob/three.js/blob/dev/build/three.module.js 下载
three.module.js
- 将
../../../build/three.module.js
OrbitControls.js
替换为适当的路径。它应该是three.module.js
与OrbitControls.js
的关系 - 删除 HTML 中的
<script src="three.js">
标记,因为OrbitControls.js
直接导入它
链接到 CDN
或者,您可以直接链接到 CDN,例如:
import { OrbitControls } from 'https://unpkg.com/three@0.119.1/examples/jsm/controls/OrbitControls.js';
import * as THREE from 'https://unpkg.com/three@0.119.1/build/three.module.js';
这是有效的,因为所有必需的文件都由 CDN 托管