Here's a newer tutorial。 this article 的底部解释了发生了什么变化。
短版本是three.js,改为更喜欢使用es6模块,而不是
<script src="three.js"></script>
<script src="GLTFLoader.js"></script>
<script>
let scene,camera,renderer;
function init(){
...
THREE.GLTFLoader.load(...
你会这样做
<script type="module">
import * as THREE from './build/three.module.js';
import {GLTFLoader} from './examples/jsm/loaders/GLTFLoader.js';
let scene,camera,renderer;
function init(){
...
GLTFLoader.load(...
但要这样使用它需要将三个.js 文件复制到相同的文件夹结构中。
someFolder
|
├-build
| |
| +-three.module.js
|
+-examples
|
+-jsm
|
+-controls
| |
| +-OrbitControls.js
| +-TrackballControls.js
| +-...
|
+-loaders
| |
| +-GLTFLoader.js
| +-...
|
...
如果你想使用旧方法<script>标签样式,那么你需要确保你使用来自the js folder的文件,而不是the jsm folder
注意:您必须使用此文件夹结构,因为示例/jsm 文件夹中的文件(如 GLTFLoader.js)通过相对但硬编码的路径引用各种其他文件(如 three.module.js)。例如在GLTFLoader.js 中有一行是有效的
import {stuff} from "../../../build/three.module.js";
新样式的几个优点是
-
各种模块可以引入他们需要的其他部分。
过去要使用一个额外的部分,您可能需要添加 1 到 10 个其他 <script> 标签。现在您只需要 1 个导入,该部分可以自己拉入其他 1 到 10 个部分
如果您使用 Web 构建器构建页面,它可以去除您不使用的部分。
有传言称,有计划在未来某个时候完全摆脱 <script> 方法。
只是想弄清楚为什么 ES6 模块更好以及为什么需要保持相同的结构。
在 r105 之前使用 EffectComposer 你会这样做
<script src="threejs/examples/js/postprocessing/EffectComposer.js"></script>
你运行,你会得到一个错误
THREE.EffectComposer relies on THREE.CopyShader
所以你会四处寻找它,它与 EffectsComposer.js 不在同一个文件夹中。当你最终找到它时,你添加它
<script src="threejs/examples/js/postprocessing/EffectComposer.js"></script>
<script src="threejs/examples/js/shaders/CopyShader.js"></script>
再次运行并得到另一个错误THREE.EffectComposer relies on THREE.ShaderPass 所以再次挖掘你添加它
<script src="threejs/examples/js/postprocessing/EffectComposer.js"></script>
<script src="threejs/examples/js/shaders/CopyShader.js"></script>
<script src="threejs/examples/js/postprocessing/ShaderPass.js"></script>
这太糟糕了。
现在从 r105 开始,您可以使用 es6 模块进行操作
import {EffectComposer} from './threejs/examples/jsm/postprocessing/EffectComposer.js';
这可以说是更好。您不会得到其他错误,因为 ES6 模块版本 EffectComposer.js 可以引用它需要的文件、它的依赖项本身。 top of EffectComposer.js 是对其依赖项的引用。
import {
Clock,
LinearFilter,
Mesh,
OrthographicCamera,
PlaneBufferGeometry,
RGBAFormat,
Vector2,
WebGLRenderTarget
} from "../../../build/three.module.js";
import { CopyShader } from "../shaders/CopyShader.js";
import { ShaderPass } from "../postprocessing/ShaderPass.js";
import { MaskPass } from "../postprocessing/MaskPass.js";
import { ClearMaskPass } from "../postprocessing/MaskPass.js";
但是,正如您在上面看到的,EffectsComposer.js 预计 three.module.js 位于名为 build 的文件夹中,距其自身 3 个子文件夹。它预计CopyShader.js 位于一个名为shaders 的文件夹中,距其自身一个文件夹。等等……
换句话说,需要相同的文件夹结构。