在require.js中定义一个全新的模块时使用导出是否合适?

时间:2013-04-12 03:25:51

标签: javascript requirejs amd

由于require.js是AMD模块加载器,因此定义了一个新的模块,如:

define(["jquery"],function($){
   var _private;
   var obj = {
       pubFunc:...
   }
   return obj;
});

define(["jquery","exports"],function($,exports){
 var pubFunc;
 exports.pubFunc = pubFunc;

});

在Require.js定义新模块中,第二个是不合适的吗?

1 个答案:

答案 0 :(得分:2)

TL; DR:第一个是如何设计RequireJS(使用那个);第二个不是。

更多信息:

看起来你对RequireJS和Node的要求感到困惑。

在第二种方法中,你几乎通过向后导出(应该是一个依赖项)来逆转依赖链的方向。

这实际上大部分时间都有效:

exports.pubFunc = pubFunc;

就此而言:

  • JavaScript对象通过引用传递,因此该属性将被添加到RequireJS持有的exports对象中;和
  • 只要需要exports,RequireJS将继续分发修改后的exports对象。

但是,这完全依赖于RequireJS的缓存。作为优化,RequireJS存储模块的导出,而不是每次加载文件;因此,重新分配了exports的缓存版本(包含您添加的属性)。

因此,当没有传递缓存的对象时会出现这种情况,例如在不同的RequireJS contexts中。

您应该将导入视为不可变,即使您可以修改它们。