【问题标题】:RequireJS multipleversion dependenciesRequireJS 多版本依赖
【发布时间】:2016-02-11 01:51:45
【问题描述】:

我的应用程序中有几个不同的应用程序。一些较新的仅使用 Backbone 而较旧的使用 Marionette,因为 Marionette 使用 Backbone,两者都使用 Underscore。

现在我想更新下划线,1.6.0 -> 1.8.3。

所以我在 require.config 中添加了一个旧的下划线

paths: {
    'underscore': 'vendor/underscore/underscore',
    'underscore-1.6.0': 'vendor/underscore-1.6.0/underscore',
    'backbone': 'vendor/backbone/backbone',
    'backbone-1.1.2': 'vendor/backbone-1.1.2/backbone',
    'marionette': 'vendor/marionette/lib/core/amd/backbone.marionette',
    'backbone.wreqr': 'vendor/backbone.wreqr/lib/backbone.wreqr',
    'backbone.babysitter': 'vendor/backbone.babysitter/lib/backbone.babysitter',

},
shim: {
    'underscore-1.6.0': {
        exports: 'underscore'
    },
    'backbone-1.1.2': {
        deps: ['underscore-1.6.0'],
        exports: 'backbone'
    },
    'backbone.babysitter': {
        deps: ['backbone-1.1.2', 'underscore-1.6.0']
    },
    'backbone.wreqr': {
        deps: ['backbone-1.1.2', 'underscore-1.6.0']
    },
    'marionette': {
        deps: ['backbone-1.1.2']
    }
},

Marionette 依赖于 Wreqr 和 Babysitter,而后者又依赖于 underscore 1.6.0(和 Backbone 1.1.2)。我的解决方案是为它们都添加 deps。

我的问题是当我尝试 require('marionette');由于 wreqr 和 babysitter 都要求“下划线”和“主干”,他们得到的不是“下划线-1.6.0”和“主干-1.1.2”。

我能否确定 Wreqr 和 Babysitter 应该使用哪个版本的下划线和主干“主干”和“下划线”?

还有其他好的方法吗?

谢谢!

  • 约翰

【问题讨论】:

    标签: requirejs dependencies


    【解决方案1】:

    您提到的所有软件包都是正确的 AMD 模块。对于每个没有版本号的包,我检查了最新版本的来源。对于版本化名称,我检查了名称中的特定版本。在所有情况下,他们都会检查define.amd 的存在并调用define。因此,它们是适当的 AMD 模块。因此,您不能将shim 与它们一起使用。shim 配置仅适用于不是真正的 AMD 模块的模块(不要调用 define)。

    现在,问题是需要 Backbone 的包需要 backbone,而需要 Underscore 的包需要 underscore。它们不按版本区分。您可以使用map configuration 强制他们使用特定版本:

    map: {
        'backbone-1.1.2': {
            underscore: 'underscore-1.6.0'
        },
        'backbone.babysitter': {
            backbone: 'backbone-1.1.2',
            underscore: 'underscore-1.6.0'
        },
        'backbone.wreqr': {
            backbone: 'backbone-1.1.2',
            underscore: 'underscore-1.6.0'
        },
        marionette: {
            backbone: 'backbone-1.1.2'
        }
    }
    

    如果需要backboneunderscore,则在应用程序中的任何位置都将加载模块backboneunderscoremap 建立了此规则的例外情况。当backbone.babysitter 需要backbone 时,则改为加载backbone-1.1.2。当它需要underscore 时,则加载underscore-1.6.0。地图中的其他模块也是如此。

    【讨论】:

      猜你喜欢
      • 2019-12-25
      • 2016-09-18
      • 2013-08-17
      • 2014-09-09
      • 2012-12-19
      • 1970-01-01
      • 2020-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多