【问题标题】:THREE.js Cannot Import ModuleTHREE.js 无法导入模块
【发布时间】:2020-05-13 01:32:08
【问题描述】:

我正在尝试导入 threejs 和 GLTFLoader 模块,这两个模块(用于测试)都在同一个 root/js/ 文件夹中..

import * as THREE from './js/build/three.module.js'; // Works fine 
import { GLTFLoader } from './js/build/GLTFLoader.js'; // Throws a disallowed MIME TYPE error

我遇到了 mimetype 问题,但是在三个主“结构”中没有抛出错误,那么为什么这不起作用?

编辑:

所以当取消注释导入 GLTF 行时,抛出的错误如下:

Loading module from “http://localhost/dev/project/build/three.module.js” was blocked because of a disallowed MIME type (“text/html”).

它似乎指的是three.module.js 路径,但是当该行被注释掉时,它都可以正常加载而没有错误。所有文件/文件夹的路径也是正确的。

【问题讨论】:

  • 使用模块时总是使用examples/jsm 文件,这些文件包含相应文件的模块化版本。欲了解更多信息,请查看Import via modules
  • 嗨,这是我正在使用的 /jsm/ 中的模块化 GLTFLoader。我没有使用 webpack 或类似的东西来“捆绑”它们——这可能是问题吗?
  • 捆绑应该不是这里的问题,您可以编辑您的帖子以包含引发的确切错误吗?
  • 问题似乎与 GLTFLoader 内部导入有关,而不是您的 three.module.js 导入。正如您从错误网址中看到的那样,其中缺少“js”。更改 GLTFLoader 开头的相对路径,以便它能够正确加载 three.js 构建,这就足够了。
  • Yeo - 成功了,干杯!!

标签: three.js


【解决方案1】:

我意识到我的问题有些不清楚,但基本上我想要做的是使用模块化 three.js 功能,同时将整个项目保留在单个根文件夹中 - 即不必遍历“构建”文件。

我觉得这可能是经常需要的东西(在没有 webpack 等的情况下),因为网站通常包含在单个根文件夹中。

经过一些有用的输入后,我能够通过以下方式解决此问题..

文件夹结构:

root/
 |
 | -- index.html
 |
 |
 | -- /build/
 |      |
 |      | -- three.module.js 
 |
 |
 | -- /js/
        |
        | -- app.js*
        |
        | -- /jsm/
               |
               | -- /libs/ ...        
               | -- /loaders/ ...

导入(在 app.js 中)

import * as THREE from '../build/three.module.js';
import { GLTFLoader } from './jsm/loaders/GLTFLoader.js';
import { TWEEN } from './jsm/libs/tween.module.min.js';
import Stats from './jsm/libs/stats.module.js';

希望这对任何寻求相同解决方案的人有用,并一如既往地感谢社区提供的宝贵帮助!

【讨论】:

    【解决方案2】:

    这一行

    import { GLTFLoader } from './js/build/GLTFLoader.js';
    

    应该是

    import { GLTFLoader } from './js/examples/jsm/loaders/GLTFLoader.js';
    

    你应该构建你的three.js文件以匹配官方的three.js文件夹结构。

    this answer

    我想非常清楚,@ScieCode 建议编辑 GLTFLoader.js 不是一个好建议。如果您遵循该建议,您将不得不开始编辑您在 example/jsm 中使用的所有文件,例如 OrbitControls.js 文件、TrackballControls.js 文件、EffectComposer.js 文件(以及它包含的所有文件,例如 MaskPass。 js、CopyPass.js、Pass.js)。而且,如果您获得了新版本,则必须再次重新编辑所有这些文件。

    只需使用linked answer 中指出的官方文件夹结构,即可正常工作,无需编辑。

    【讨论】:

    • 我实际上不同意这个答案。是的,示例模块文件需要与three.js 提供的相同结构。但是一旦你下载了文件,你就不再受这个限制了。改变项目的文件结构,只是为了适应这一点,感觉是错误的方法。
    • 您阅读链接的答案了吗?这些文件中有硬编码的路径。除非您手动编辑所有文件,否则您必须使用相同的结构,否则事情会中断。这就是 ES6 模块的工作方式
    • 是的,我做到了。这正是我要说的。 three.js 中的示例文件旨在用作参考,而不是像核心中的那些文字和不可变文件。我认为解决这个问题的正确方法是实际手动调整路径以适合您的项目和文件结构,而不是调整文件结构以适应文件。
    • 我并不是说你的答案是错误的,或者它不起作用。我只是说我个人认为这不是最好的方法。
    • 所以您是说每次下载新版本的three.js 时都应该手动编辑每个three.js 源文件以将其内部路径更改为其他内容?您不能只是将文件复制到您想要的任何位置,因为这些文件中引用了路径。因此,仅仅选择一些您更喜欢的随机文件夹结构并不是那么简单。如果不手动编辑多达 322 个 three.js 源文件,这将无法工作。只是检查你是否理解你的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 2017-11-11
    • 2021-07-27
    • 2019-06-13
    • 2020-12-15
    相关资源
    最近更新 更多