THREE.js 在 main.js 中加载 OrbitControls 时不提供名为 EventDispatcher



说明

我正在尝试在我的项目中使用 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.jsOrbitControls.js替换为适当的路径。它应该是three.module.jsOrbitControls.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 托管

最新更新