【问题标题】:Path issue with RequireJSRequireJS 的路径问题
【发布时间】:2014-05-06 18:43:44
【问题描述】:

我正在使用 RequireJS 开发一个应用程序,并且我有一个用作依赖项的模块。所有依赖的库都在“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”而不是“host.com/lib/供应商/MyModule/lib/a.js" 根据“http://requirejs.org/docs/api.html#defdep”我正在做的事情应该可以工作,但它没有发生

【问题讨论】:

    标签: javascript requirejs js-amd


    【解决方案1】:

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

    //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

      请注意,mypaths 设置在此计算中根本没有使用

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

    map: {
        '*': {
            my: 'vendor/MyModule/my'
        }
    }
    

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

    【讨论】:

      猜你喜欢
      • 2015-08-15
      • 1970-01-01
      • 2013-05-25
      • 2013-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-03
      • 1970-01-01
      相关资源
      最近更新 更多