Require.js没有加载Three.js

时间:2015-05-20 19:05:53

标签: javascript three.js requirejs

所以我有一些生成的JavaScript(来自TypeScript):

define(["require", "exports", "three", "jquery", "./test"], function (require, exports, THREE, jQuery, Test) {
var Main = (function () {
    function Main() {
        this.container = jQuery('#test');
        this.scene = new THREE.Scene();
...

这最终导致浏览器出错(在上一行):

Uncaught TypeError: Cannot read property 'Scene' of undefined

有趣的是jQuery没有问题;好像Three.js根本就没有加载。

需要配置:

requirejs.config({
    baseUrl: "src",
    paths: {
        "main": "../main",
        "test": "../test",
        "three": "../three/three",
        "sizzle": "/src/sizzle/dist/sizzle"
    }
});

jQuery位于'js / src'文件夹中,而Three.js位于'js / three / three.js'(正在使用Express,因此浏览器隐藏了js文件夹,看起来并不像如果我将three.js移动到src文件夹,可以有所作为)。 Sizzle坐在它自己的位置,因为它导致错误来自src内的子文件夹。

我错过了任何明显的事吗?我没有线索

1 个答案:

答案 0 :(得分:8)

从r72开始

从r72起,三人确实致电define。所以你不应该设置shim。如果你的代码依赖THREE在全球空间中可用,那么你就完成了。

但是,如果代码依赖THREE在全局空间中可用,那么这是一个问题,因为作为一个行为良好的AMD模块,{{1不再只是泄漏到全球空间。对于在全局空间中需要THREE的代码,您只需创建一个这样的模块,您可以在调用THREE之前放置该模块:

requirejs.config

您的RequireJS配置应包含此地图:

define("three-glue", ["three"], function (three) {
    window.THREE = three;
    return three;
});

这告诉RequireJS"只要需要map: { '*': { three: 'three-glue' }, 'three-glue': { three: 'three' } } ,请加载three,但three-glue加载three时需要three-glue。 #34;

所有在一起:

three

(技术说明:r72实际上仍然执行了泄漏到全球空间,以及之后的一些版本。编辑此答案时最新发布的版本(r83)确实泄漏到全局空间本身。我没有检查r72和r83之间的每个版本来检查更改的时间。使用上面的代码与旧的AMD兼容版本进行泄漏是安全的。这只会导致不必要的代码。)

对于r71及更早版本

如果this file是任何指南,则三个不会调用define("three-glue", ["three"], function (three) { window.THREE = three; return three; }); requirejs.config({ baseUrl: "src", paths: { "main": "../main", "test": "../test", "three": "../three/three", "sizzle": "/src/sizzle/dist/sizzle" }, map: { '*': { three: 'three-glue' }, 'three-glue': { three: 'three' } } }); 。因此,当您需要它作为模块时,如果您希望它具有值,则需要define。像这样:

shim

根据你问题中的配置:

shim: {
    three: {
        exports: 'THREE'
    }
}