使用UnderscoreJS和RequireJS

时间:2015-03-20 15:30:23

标签: maven requirejs underscore.js webjars

我尝试在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){
               ...
        })
    }
}

结果在浏览器控制台中: Browser result

浏览器加载了underscoreJS文件:

Module loaded

这必须是详细信息,但我使用Javascriptmaven

管理了webjars个依赖关系

那么为什么我的_ undefined

1 个答案:

答案 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'时:

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

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

  3. 但是,该文件包含定义define而非'underscore'的{​​{1}}次调用。因此RequireJS无法兑现请求。

  4. 而不是'webjars/underscorejs/1.7.0/underscore',您应该为Underscore使用map配置。类似的东西:

    paths

    这告诉RequireJS“你会在位置paths : { 'underscore' : 'webjars/underscorejs/1.7.0/underscore' } 找到名为'underscore'的模块”。使用它时,请求的模块名称和定义的模块名称匹配。