在凉亭组件中的requirejs + bower,路径和依赖关系

时间:2015-03-06 01:53:05

标签: javascript requirejs bower amd

我做了很多研究,但找不到我想要的答案,所以就这样了。

我有一个bower组件,它有自己的依赖项:

  

/vendor/bower_components/my_module/my_module.js   /vendor/bower_components/my_module/dependency_1.js   /vendor/bower_components/my_module/dependency_2.js

在my_module.js中,它使用相对路径加载其依赖项:

define(["./dependency_1", "./dependency_2"], function (dep1, dep2) { ... });

但是当我设置了requirejs config.paths时:

paths: {
    my_module: "/vendor/bower_components/my_module/my_module"
}

...现在相对路径相对于基本requirejs路径而不是my_module的完整路径。我理解为什么会发生这种情况(因为模块ID不再是完整路径,而是缩短名称),我只是不知道如何解决它。我很确定包装是正确的方向,我没有运气。我该怎么办呢? my_module是第三方模块btw,宁愿不编辑它。感谢。

更新 - 我的应用程序中代码的使用示例:

场景1(没有config.paths):

define(["/vendor/bower_components/my_module/my_module"], function(myModule) {
    // This works.  No issues here.
    // The reason this works is because the module ID for myModule is:
    // "/vendor/bower_components/my_module/my_module"
    // Therefore, the relative paths "./dependency_1" and "./dependency_2"
    // are resolved against that module ID.
});

场景2 - 现在my_module在config.paths中定义(见上文):

define(["my_module"], function(myModule) {
    // Error, cannot load files dependency_1.js or dependency_2.js
    // This is because relative paths are resolved against a module's ID.
    // Now the module ID is "my_module", not "/vendor/bower_components/my_module/my_module"
    // As such, the paths for ./dependency_1 and ./dependency_2 are resolved against "/"
});

不幸(或不是?)这种情况发生在设计上:http://requirejs.org/docs/api.html#modulenotes-relative-names。我们应该能够使用包来解决这个问题。我只是想知道是否有人知道如何做到这一点。

1 个答案:

答案 0 :(得分:2)

这是我到目前为止提出的问题。您可以使用以下配置执行您想要的操作(<或p>)

require.config({
    packages: [
        {
            name: "myModule"
            location: '/vendor/bower_components/my_module/',
            main: "my_module"
        }
        // [name option] can be anything you want
        // [main option] pointing to your main js file of the package
        // if you rename your mymodule.js to main.js you no longer need to config the [main option]
    ]
});

并在你的my_module.js

define(["./dependency_1", "./dependency_2"], function (dep1, dep2) {
  // ...
});

你可以这样调用你的my_module.js。

define(["myModule"], function(myModule) {
    // ...
});

有关详细信息,请查看此链接Common-config#packages