5

我正在尝试将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 under_和 Underscore.string under _.str,但__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

4 回答 4

10

我发现了错误。出于某种原因,RequireJS 不适用于 cdnjs.com 的Underscore.string版本,所以我将其替换为Github 版本。我想这与提交 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 版本已更新为上游.

于 2013-04-18T13:29:08.387 回答
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中添加它作为依赖项

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 注册它

于 2014-10-25T06:57:54.327 回答
1

这是一个使用 Requirejs“订单”插件的工作代码,还包括 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 _;
});

干杯! :)

于 2014-04-18T19:46:09.943 回答
1

仅当我"underscore.string"在 shim 中使用确切的模块名称时才适用于我。似乎与 underscore.string 本身中的硬编码名称有关

免除 underscore.string 源代码(使用 require 时执行此分支):

 // 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(_) {
    // --
});
于 2013-11-10T01:43:37.873 回答