RequireJS AMD组件使用bower,具有非AMD传递依赖性

时间:2014-08-15 22:46:40

标签: requirejs dependencies amd bower

我正在开发一个具有在凉亭中定义的依赖关系的AMD模块。使用该模块的应用程序也具有此依赖性。有没有办法在模块的amd定义中定义依赖项,以便使用该模块的应用程序不必按组件所期望的方式命名它?

模块的bower.json

{...
  "dependencies": {
    "my_module_dependency": "~1.2.21"
  }
}

支持amd(但不需要)的模块定义mymodule.js:

(function (root, factory) {
  if(typeof define === "function" && define.amd) {
    define(function(require) {
      //this works only if the app that uses this module defines my_module_dependency in main.js
      var my_module_dependency = require("my_module_dependency");
      return (root.mymodule = factory(my_module_dependency));
    });
  } else {
    root.mymodule = factory(root.my_module_dependency);
  }
}(this, function(my_module_dependency) {
  ...
}

这可行,但这取决于消费应用程序在其main.js中定义了一个名为“my_module_dependency”的requirejs依赖项,但我希望能够引用它,而不必强迫消费应用程序按照组件的方式命名它。

我知道我的模块是一个bower组件,我的模块的bower.json定义了my_module_dependency,所以我知道依赖项相对于我的组件的位置,但是我无法让requirejs使用我自己组件之外的相对路径引用消费应用已经拥有的东西需要依赖。

也就是说,以下内容不起作用:

(function (root, factory) {
  if(typeof define === "function" && define.amd) {
    define(function(require) {
      //we know this will be here b/c it's a bower dep and so is this module
      var my_module_dependency = require("./bower_components/my_module_dependency");
      return (root.mymodule = factory(my_module_dependency));
    });
  } else {
    root.mymodule = factory(root.my_module_dependency);
  }
}(this, function(my_module_dependency) {
  ...
}

正如预期的那样只有一次调用my_module_dependency,因为消费应用程序已经需要它(如果我拼错它,我会看到消费应用程序加载正确的版本然后我的组件尝试加载拼写错误的资源并获得404 )。没有立即的控制台错误,但在一两秒之后,此错误显示:

Uncaught Error: Load timeout for modules: bower_components/angular/angular
  http://requirejs.org/docs/errors.html#timeout require.js:166
  makeError require.js:166
  checkLoaded require.js:692
  (anonymous function)

此外,我需要消费应用程序和组件使用相同的my_module_dependency实例。

任何猜测?

0 个答案:

没有答案