RequireJS的路径问题

时间:2014-05-06 18:43:44

标签: javascript requirejs js-amd

我正在使用RequireJS开发应用程序,并且我有一个用作dependece的模块。所有依赖的库都在" lib / vendor"中,所以,假设它调用" MyModule",它在" lib / vendor / MyModule / my.js中.." 在我的main.js中我有:

    3 requirejs.config({
    4     paths: {
    5         my: './vendor/MyModule/my',
    ....

它有效,但问题是" my.js"还包括一些文件

define(["./lib/a", "./lib/b"], function (a,b) {
    ....
});

这些文件" a.js"和" b.js"在模块的文件夹中,所以结构应该是这样的:

index.html
lib
   main.js
   vendor
        MyModule
            my.js
            lib
                a.js
                b.js

问题是my.js调用" a.js"或" b.js" RequireJS尝试将它们发现到" host.com/lib/lib/a.js"而是#34; host.com/lib/vendor/MyModule/lib/a.js" 根据" http://requirejs.org/docs/api.html#defdep"我正在做的事情应该有效,但事情并没有发生

1 个答案:

答案 0 :(得分:2)

问题是相对依赖关系是相对于模块的 name 而不是路径加载的。你参考这个例子:

//my/shirt.js now has some dependencies, a cart and inventory
//module in the same directory as shirt.js
define(["./cart", "./inventory"], function(cart, inventory) {

仅当my/shirt.js文件作为my/shirt模块加载时才会起作用。换句话说,在此示例中假设没有paths设置将更改模块'路径。

以下是您的代码:

  1. RequireJS加载main。您没有设置baseUrl,因此baseUrl设置为/lib

  2. 您需要my。 RequireJS将其解析为/lib/vendor/MyModule/my.js并加载它。

  3. my模块需要./lib/a./lib/b。当RequireJS解析相对路径时,它使用当前模块的名称(my)作为起点。两个要求中的初始时间段意味着获取当前模块名称的目录部分并将其余路径添加到其中。" my的目录部分是空字符串,因此两条路径变为lib/alib/b,然后与baseUrl合并,形成/lib/lib/a/lib/lib/b

    请注意,此计算中paths的{​​{1}}设置根本未使用

  4. 解决问题的一种方法是使用my代替map。而paths将路径与模块名称相关联,paths将模块名称与模块名称相关联,因此:

    map

    这告诉RequireJS在所有模块(map: { '*': { my: 'vendor/MyModule/my' } } )中,如果需要名称为*的模块,则加载名为my的模块。