【问题标题】:single dependency across multiple modules - r.js "the following module share the same URL"跨多个模块的单一依赖项 - r.js“以下模块共享相同的 URL”
【发布时间】:2014-03-21 15:03:35
【问题描述】:

我已经在一个多页 Web 应用程序中实现了 requirejs,它工作正常,但现在我正在尝试使用 r.js 创建一个包含“所有”模块的单个文件,除了任何第三方库和框架,例如 jquery 等...

分解的构建文件 (build.js) 如下所示:

({

baseUrl: "../",
out: "main-v0.1.js", //"charts-v0.1.js",

include: [


    "bi/jquery/jquery.ui.autocomplete",
    "bi/jquery/jquery.ui.combobox",


    "bi/ui/investmentselector"
],

wrap: true,

exclude: [
    'jquery', 'jqueryui', 'jcanvas', 'jqtools', 'prettyphoto', 'cssSandpaper', 'knockout', 'datatables', 'handlebars'
],
preserveLicenseComments: false,
optimize: "none", // "uglify", "uglify2"

paths: {
    handlebars      : 'lib/handlebars',
    /*hb runtime    : 'lib/handlebars.runtime',*/
    jquery          : 'lib/jquery-1.9.1',
    jqueryui        : 'lib/jquery.ui/jquery-ui-1.10.3.min',
    jcanvas         : 'lib/jcanvas.min',
    jqtools         : 'lib/jquery.tools/jquery.tools.min',
    prettyphoto     : 'lib/jquery/jquery.prettyphoto-3.1.5.min',
    BI              : 'bi/BI',
    sliderconnect   : 'bi/charts/slider-connect',
    cssSandpaper    : 'lib/csssandpaper/cssSandpaper',
    csstransform    : 'bi/enhance/csstransform',
    knockout        : 'lib/knockout-2.2.1',
    datatables      : 'lib/jquery/jquery.dataTables',
    // jquery ui widgets
    uicombobox      : 'bi/jquery/jquery.ui.combobox',
    uiautocomplete  : 'bi/jquery/jquery.ui.autocomplete'
}

})

jquery.ui.autocomplete.js 和 jquery.ui.combobox.js 文件是自定义 jqueryui 小部件,它们周围没有任何 define()。 模块investselector.js(分解)看起来像这样......

define(['jquery',
    'bi/templates/investmentselector.js',
    'bi/jquery/datatables/investmentselector.js',
    'lib/JSLinq/JSLINQ.js',
    'uicombobox', 'uiautocomplete'], function ($, tmp, datatables, jsLinq, uicombobox, uiautocomplete) {

    'use strict';


    var methods = {
        // ... code
    };

    return methods;
});

当我运行 r.js 来构建名为“main-v0.1.js”的单个文件时,我得到的是这个......

Tracing dependencies for: D:/Files/Trunk/BestInvest.Select.Website/js/build/main
-v0.1.js
Error: Error: Module loading did not complete for: bi/ui/investmentselector, uic
ombobox, uiautocomplete
The following modules share the same URL. This could be a misconfiguration if th
at URL only has one anonymous module in it:
D:/Files/Trunk/BestInvest.Select.Website/js/bi/jquery/jquery.ui.autocomplete.js:
 uiautocomplete, bi/jquery/jquery.ui.autocomplete
D:/Files/Trunk/BestInvest.Select.Website/js/bi/jquery/jquery.ui.combobox.js: uic
ombobox, bi/jquery/jquery.ui.combobox
    at Function.build.checkForErrors (D:\Files\Trunk\BestInvest.Select.Website\j
s\build\r.js:27237:19)

关于发生了什么有什么想法吗?

仅供参考,小部件代码(再次分解)看起来像这样......

$.widget("bi.bicombobox", {
_create: function () {
    // ...code
},
_destroy: function () { }
});

还有……

$.widget("bi.biautocomplete", {
_create: function () {
    // ...code
},
_destroy: function () { }
});

对此的任何帮助都会非常有用, 谢谢!

【问题讨论】:

    标签: javascript requirejs r.js


    【解决方案1】:

    您的include 选项使用模块的完整路径,而不是使用您在paths 中建立的缩写名称。使用您在paths 中的名称:

    include: [
        "uicombobox",
        "uiautocomplete",
        "bi/ui/investmentselector"
    ]
    

    我没有看到为最后一个定义的另一个名称,所以我保持原样。通常,您不希望在 paths 中有类似 foo: "path/to/foo" 的内容,有时在引用依赖项中的模块时使用 foo 有时使用 path/to/foo。你总是想在任何地方使用foo。在这里,r.js 看到 uicombobox(举个例子)并通过 paths 解析其路径。它在include 中看到"bi/jquery/jquery.ui.combobox" 并通过添加.js 来解决它,它指向与第一种情况相同的文件。然后它意识到它有 两个 模块指向同一个文件并且无法处理该文件,因为最终该文件只需要与一个模块相关联。

    我还注意到您的define 调用列出了一些带有.js 扩展名的依赖项。这违背了不指定扩展的推荐做法。有时有扩展名,有时没有,可能会导致我上面解释的问题。

    【讨论】:

    • 太棒了,在某种程度上这是我应该接受的,但总是能得到第二双眼睛。感谢您的回答。我们确实有几个其他开发人员(后端)在 JS 世界中混日子,因此必须准确地教他们你刚才提到的内容。再次感谢昆顿
    • 非常有帮助:在我的情况下:paths:{ apiRequester: 'app/commons/api-requester' } 并且在 requirejs 模块中我调用了路径值('app/commons/api-requester' ) 而不是使用别名 apiRequester。
    • 当您在一个 js amd 文件中有多个“类”时也会发生这种情况。 js模块编译器读取不同的内部模块,但它们都指向同一个url。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 2011-09-14
    • 2011-09-14
    相关资源
    最近更新 更多