所以我有一些生成的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内的子文件夹。
我错过了任何明显的事吗?我没有线索
答案 0 :(得分:8)
从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兼容版本进行泄漏是安全的。这只会导致不必要的代码。)
如果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'
}
}