【问题标题】:RequireJS: same module with different namesRequireJS:具有不同名称的相同模块
【发布时间】:2014-03-13 08:52:37
【问题描述】:

是否可以在 RequireJS 中以不同的名称使用相同的模块? (最感兴趣的是优化版)

示例

我依赖一个依赖于lodash 的 AMD 兼容库。我的代码中已经有underscore,我希望该库使用它而不是lodash

我当然不想修改库的源代码。于是我修改了require.js的配置:

paths: {
  'underscore': 'vendor/underscore', // that's for my code
  ...
  'lodash': 'vendor/underscore', // that's for the new library
}

现在在尝试构建时,r.js 抛出了不幸的问题:

The following modules share the same URL. 
This could be a misconfiguration if that URL only has one anonymous module in it:
   /.../underscore.js: lodash, underscore

有没有办法以 2 个或多个不同的名称注册同一个模块?

【问题讨论】:

    标签: build requirejs r.js


    【解决方案1】:

    一般来说,为需要 Lodash 的代码加载 Underscore 是不安全的。一个例外是,如果您 100% 确定所讨论的代码在其 Underscore 兼容模式下使用了 Lodash。

    如果您确定它在您的特定情况下是安全的,那么我将使用map 处理您的特定问题:

    map: {
        "*": { 'lodash': 'underscore'}
    }
    

    这告诉 RequireJS 在任何地方都需要lodash,而是返回underscore

    如果需要lodashunderscore,上述方法将返回一个单个 模块实例。如果有人想以两个不同的名称两次加载相同的模块代码并希望保持 模块状态 分开,则它不会起作用。例如,用于注册名称的模块。如果有人想以名称 foobar 加载此模块并保持两个注册表分开,以便在 foo 中注册但未在 bar 中注册的内容不在bar(反之亦然)那么他们将需要两个模块实例,因此除了使用 map 之外,他们还必须做其他事情。

    【讨论】:

    • 谢谢,效果很好,正是我想要的。虽然在我看来这种配置方式有点奇怪,但这是题外话:)
    猜你喜欢
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多