我可以在require.config中为子依赖项设置不同的路径吗?

时间:2013-10-23 23:11:24

标签: javascript backbone.js requirejs

我有两个彼此相关的问题。

首先,我希望有一个名为backbone的文件夹,并且与主干作为路径中库的短名称相冲突。似乎RequireJS认为骨干/模型/用户是骨干库或其他东西的孩子。解决方案,使用大写B命名库Backbone。

第二个问题是我正在使用ModelBinder,它具有“骨干”作为依赖。解决方案,更改缩小的文件。

在RequireJS配置中,这两个解决方案看起来都不是很糟糕,但我无法弄清楚我做错了什么。

我的公用文件夹结构类似于:

public/
  js/
    backbone/
      model/
        ...
      view/
        ...
    vendor/
      backbone.min.js
      Backbone.ModelBinder.js
      ...
  common.js

我的common.js有这样的东西:

require.config({
    baseUrl: "/js",
    shim: {
        'underscore': {
            exports: '_'
        },
        "Backbone" : {
            deps: ["underscore", "jquery"],
            exports: 'Backbone'
        }

    },
    paths: {
        underscore: 'vendor/underscore.min',
        jquery: 'vendor/jquery',
        model_binder: 'vendor/Backbone.ModelBinder',
        Backbone: 'vendor/backbone.min'
  }
});

所以我的两个问题是:我如何保持Backbone.ModelBinder原样,并告诉requirejs当该库要求骨干时,它要求js / vendor / backbone.min.js而不“污染”我的全局路径

为什么我不能在路径中同时使用骨干(小写字母b)并拥有目录?

1 个答案:

答案 0 :(得分:1)

一个解决方案(是的,不是那么理智)是为paths下的每个目录包含js/backbone个定义,即:

require.config({
    ...
    paths: {
        ...
        backbone: 'vendor/backbone.min', // NOTE lower-case 'b', as desired
        "backbone/model": "backbone/model",
        "backbone/view": "backbone/view",
        ... // and so on
    }
});

这也意味着js/backbone下没有模块。

另一种方法是将大写'B'保留在Backbone的模块名称中,并使用map配置Backbone.ModelBinder.js

require.config({
    ...
    paths: {
        ...
        Backbone: 'vendor/backbone.min' // NOTE capital 'B' again
    },
    map: {
        "model_binder": {
            "backbone": "Backbone"
        }
});

Thinkng回顾性地,map可以应用于所有模块,这样每当他们请求"backbone"(小写'b')时,您就会"Backbone"

require.config({
    ...
    paths: {
        ...
        Backbone: 'vendor/backbone.min' // NOTE capital 'B' again
    },
    map: {
        "*": {    //  <------ Here difference form code above
            "backbone": "Backbone"
        }
});

现在,任何人都可以要求"backbone"并获取Backbone或"backbone/model/User"(或"backbone/module")并获取相应的模块。