我尝试在UnderscoreJS
1.7.0
上使用/加载RequireJS
2.1.14-3
。在我的应用程序启动时,UnderscoreJS装载得很好,但它是未定义的#34;。请参阅以下详细信息:
main.js
define(function() {
// Configuration of RequireJS
requirejs.config({
enforceDefine : true,
map : {
'*': {
...
'underscore' : 'webjars/underscorejs/1.7.0/underscore'
},
},
// The base URL is just the top-level directory where the files are stored
baseUrl : './',
// Kick-start the application by loading these files
deps : [ 'MyPanel' ],
});
});
使用它的模块:
define(['ractive',
'underscore',
...],
function(Ractive,
_,
...){
var Foo = Ractive.extend({
...
oninit: function(){
var anArray = [1, 2, 3]
_.each(anArray, function(item){
...
})
}
}
结果在浏览器控制台中:
浏览器加载了underscoreJS文件:
这必须是详细信息,但我使用Javascript
和maven
webjars
个依赖关系
那么为什么我的_
undefined
?
答案 0 :(得分:1)
如果您查看Underscore 1.7.0的source,您会看到它自己注册如下:
if (typeof define === 'function' && define.amd) {
define('underscore', [], function() {
return _;
});
}
注意define
的第一个参数。这将模块的名称硬编码为'underscore'
。
问题是您使用的map
配置与此硬编码名称不兼容。你所做的就是告诉RequireJS“在所有模块中"*"
),当模块需要一个名为'underscore'
的模块时,请返回名为'webjars/underscorejs/1.7.0/underscore'
的模块”。所以当你需要'underscore'
时:
RequireJS会查找名为'webjars/underscorejs/1.7.0/underscore'
的模块。
它使用此类模块名称的默认路径,并在该位置查找文件。它加载文件并执行它。
但是,该文件包含定义define
而非'underscore'
的{{1}}次调用。因此RequireJS无法兑现请求。
而不是'webjars/underscorejs/1.7.0/underscore'
,您应该为Underscore使用map
配置。类似的东西:
paths
这告诉RequireJS“你会在位置paths : {
'underscore' : 'webjars/underscorejs/1.7.0/underscore'
}
找到名为'underscore'
的模块”。使用它时,请求的模块名称和定义的模块名称匹配。