1

我正在尝试使用/UnderscoreJS 1.7.0加载RequireJS 2.1.14-3. 在我的应用程序启动时,UnderscoreJS 加载良好,但它是“未定义的”。请参阅下面的详细信息:

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依赖项mavenwebjars

那为什么是我的_ undefined

4

1 回答 1

1

如果您查看Underscore 1.7.0的源代码,您会看到它像这样注册自己:

if (typeof define === 'function' && define.amd) {
    define('underscore', [], function() {
        return _;
    });
}

注意 的第一个参数define。这会将模块的名称硬编码为'underscore'.

问题是您使用的map配置与此硬编码名称不兼容。您所做的是告诉 RequireJS“在所有模块 ( "*") 中,当模块需要具有名称的模块时'underscore',请返回具有名称的模块'webjars/underscorejs/1.7.0/underscore'”。所以当你需要时'underscore'

  1. RequireJS 会寻找名为的模块'webjars/underscorejs/1.7.0/underscore'

  2. 它使用此类模块名称的默认路径并在该位置查找文件。它加载文件并执行它。

  3. 但是,该文件包含一个define定义'underscore',而不是'webjars/underscorejs/1.7.0/underscore'. 所以 RequireJS 不能接受这个请求。

而不是map,您应该使用paths下划线的配置。就像是:

paths : {
    'underscore' : 'webjars/underscorejs/1.7.0/underscore'
}

这告诉 RequireJS 类似“你会找到'underscore'在该位置命名的模块'webjars/underscorejs/1.7.0/underscore'”。当您使用它时,请求的模块名称和定义的模块名称匹配。

于 2015-03-20T16:14:26.607 回答