我正在尝试将Underscore和Underscore.string与RequireJS同时使用。
main.js
的内容:
require.config({
paths: {
'underscore': '//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.4.4/underscore-min',
'underscore-string': '//cdnjs.cloudflare.com/ajax/libs/underscore.string/2.3.0/underscore.string.min',
},
shim: {
'underscore': {
exports: '_'
},
'underscore-string': {
deps: ['underscore'],
exports: '_s'
},
}
});
var modules = ['underscore-string'];
require(modules, function() {
// --
});
浏览器会看到_
,但看不到_s
- 它未定义。
理想情况下,我希望_
下的Underscore和_.str
下的Underscore.string,但_
和_s
也可以。我怎么能这样做?
版本:RequireJS 2.1.5,Underscore 1.4.4,Underscore.string 2.3.0
注意:感谢@jgillich确保,这些路径有两个斜杠(//cdnjs.cloudfare.com/...
),否则浏览器会认为该URL是相对于服务器的,而Firebug将抛出:
Error: Script error
http://requirejs.org/docs/errors.html#scripterror
答案 0 :(得分:10)
我发现了错误。出于某种原因,RequireJS不能与cdnjs.com的Underscore.string版本一起使用,因此我将其替换为Github version。我想这与commit 9df4736有关。
目前我的代码如下所示:
require.config({
paths: {
'underscore': '//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.4.4/underscore-min',
'underscore-string': '//raw.github.com/epeli/underscore.string/master/dist/underscore.string.min',
},
shim: {
'underscore': {
exports: '_'
},
'underscore-string': {
deps: ['underscore'],
},
}
});
var modules = ['underscore', 'underscore-string'];
require(modules, function(_) {
// --
});
Underscore.string位于_.str
。
修改:截至2013年7月16日,CDNJS版本为updated with the upstream。
答案 1 :(得分:2)
在我理解我做错了之前,与之斗争了好几个小时
这就是我做错了
您不应重命名main.js中的文件underscore.string
即使在我的库中我确实在路径中重命名该文件,我将其命名为' underscore.string'
main.js 应该是这样的
require.config({
paths: {
underscore: 'lib/underscore',
'underscore.string' : 'lib/_string' ,
},
shim: {
underscore: {
exports: '_',
deps: [ 'jquery', 'jqueryui' ]
},
'underscore.string': {
deps: [ 'underscore' ]
},
}
....
然后您可以将其作为依赖添加到您的垫片中,就像我为我的mixin文件所做的那样
shim: {
mixin : {
deps: [ 'jquery', 'underscore', 'underscore.string' , 'bootstrap' ]
},
或者只是在
等不同页面中定义/*global define */
define([
'underscore.string'
], function ( ) {
现在可以通过_.str或_.string
访问它这是为什么你应该这样做而不是试图将其命名为
在underscore.string.js的第663行
// Register as a named module with AMD.
if (typeof define === 'function' && define.amd)
define('underscore.string', [], function(){ return _s; });
这意味着如果您要定义' underscore.string'
,它只会向AMD需要JS注册它答案 2 :(得分:1)
"underscore.string"
模块名称,仅适用于我。似乎与underscore.string本身的硬编码名称有关
免除underscore.string源代码(当需要使用时执行此分支):
// Register as a named module with AMD.
if (typeof define === 'function' && define.amd)
define('underscore.string', [], function(){ return _s; });
所以对我来说唯一有效的配置是:
require.config({
paths: {
'underscore': '//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.4.4/underscore-min',
'underscore.string': '//raw.github.com/epeli/underscore.string/master/dist/underscore.string.min',
},
shim: {
'underscore': {
exports: '_'
},
'underscore.string': {
deps: ['underscore'],
},
}
});
var modules = ['underscore', 'underscore.string'];
require(modules, function(_) {
// --
});
答案 3 :(得分:1)
这是使用Requirejs" order"插件,还包括Jquery,一切加载没有任何冲突:
requirejs.config({
baseUrl: "assets",
paths: {
order: '//requirejs.org/docs/release/1.0.5/minified/order',
jquery: 'http://code.jquery.com/jquery-2.1.0.min',
underscore: '//underscorejs.org/underscore-min',
underscorestring: '//raw.githubusercontent.com/epeli/underscore.string/master/dist/underscore.string.min',
underscoremixed: 'js/underscore.mixed' // Create separate file
},
shim: {
underscore: { exports: '_' },
underscorestring: { deps: ['underscore'] }
}
});
require(['order!jquery','order!underscoremixed'], function($,_) {
// test
console.log( _.capitalize('capitalized text') );
});
在 js / underscore.mixed.js 里面放下以下内容......
define(['underscore','underscorestring'], function() {
_.mixin(_.str.exports());
return _;
});
干杯! :)