带RequireJS的Underscore.string

时间:2013-04-17 06:25:32

标签: javascript requirejs underscore.js

我正在尝试将UnderscoreUnderscore.stringRequireJS同时使用。

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

4 个答案:

答案 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 _;
});

干杯! :)