Three.js 尝试导入时中断 OrbitControls.js

Three.js breaks when trying to import OrbitControls.js

首先,我想说的是,我对 javascript 和图书馆工作还很陌生。我试图让一些基本的 three.js 代码工作,但它不工作,我不确定为什么。我已经使用 Threejs.org 文档设置了一个基本场景,我正在尝试设置一些基本的轨道控制。一切正常,直到我尝试将轨道控件导入到我的主脚本文件中。然后我得到一个错误:

未捕获类型错误:无法解析模块说明符“三”。相对引用必须以“/”、“./”或“../”开头。

我没有尝试解决我的问题,因为我什至不确定从哪里开始。我检查了我的拼写并确保我有正确的导入相对路径。

这是有效的代码:

import * as THREE from '/node_modules/three/build/three.module.js';

// import { OrbitControls } from '/node_modules/three/examples/jsm/controls/OrbitControls.js';

// Construct basic scene elements
const camera = new THREE.PerspectiveCamera(
    75,
    window.innerWidth / window.innerHeight,
    1,
    1000
);
const renderer = new THREE.WebGLRenderer();
const scene = new THREE.Scene();
// const controls = new OrbitControls(camera, renderer.domElement);

// Set parameters for scene elements
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

当我取消对轨道控件的第二次导入的注释时,它中断并给我上面的错误。是什么导致了错误,我该如何解决?

提前致谢。

欢迎来到 Stack Overflow。您的问题似乎缺少一些信息,因此我将根据您提供的内容做出一些假设。如果我的任何假设不正确,请更新您的问题以提供更多详细信息。

我的主要假设是您在 HTML 中使用 <script> 标记来引用您的主文件,并且您 没有 使用任何JavaScript 提到的 Mugen87 等捆绑工具。如果是这种情况,那么你的东西没问题,但是OrbitControls 就不行了除非你修改它。

如果你深入研究 OrbitControls.js 文件,你会看到(当前为 r.130.1):

import {
    EventDispatcher,
    MOUSE,
    Quaternion,
    Spherical,
    TOUCH,
    Vector2,
    Vector3
} from 'three';

from 参考假设您是在 npm 上下文中而不是浏览器中使用该模块。浏览器对 npm 包一无所知,它们无法将 three 解析为其 node_modules 路径,从而导致您看到的错误。要使其正常工作,您需要修改引用以指向正确的模块路径。

我个人不喜欢修改node_modules里面的文件,所以推荐如下:

  1. 创建一个名为 vendor_mods/three/examples/jsm/controls 的新文件夹并将 OrbitControls.js 复制到其中。
  2. 将复制文件中的 from 引用更改为指向 /node_modules/three/build/three.module.js
  3. 更改主文件中的引用以指向修改后的 OrbitControls.js.

现在,浏览器可以正确引用所有片段了,大家应该很高兴了。