1

我有一个 javascript 库,到目前为止,它的结构基本上是这样的:

var Ns = (function(){
  var that = {};

  // add stuff to 'that'

  return that;
})();

//use Ns.foo() and Ns.bar()

问题是现在,我希望相同的库可以与nodeand一起使用npm。到目前为止,这是我能想到的:

this.Ns = (function(){ //same as previous snippet })()

//use Ns.foo() and Ns.bar()

问题是,虽然这在浏览器中有效,但在节点中我需要这样做:

var Ns = require('ns').Ns

问题:我很想能够做到,var Ns = require('ns')但为了做到这一点,我必须导出this.foothis.bar这会破坏浏览器的包含。想法?

4

2 回答 2

3
// create local scope.
(function () {

  var myModule = ...

  // check for node module loader
  if (typeof module !== "undefined" && typeof require !== "undefined") {
    module.exports = myModule;
  } else {
    window["name"] = myModule;
  }

})();
于 2011-11-07T02:14:56.510 回答
0

创建一个范围可能是最好的方法(所以你没有名称冲突问题),但更简单的方法是通过污染全局范围,如下所示:

代替

var x = require('x');

var x = (typeof require !== "undefined") ? require('x') : window;

同样,在添加到导出之前,检查该对象是否存在:

if (typeof exports !== "undefined)
  exports.my_func = my_func;

但是,这样做的后果是,在浏览器版本中,所有内容都被转储到全局范围内。此外,它假定浏览器版本将必要的脚本加载到页面中。很容易在小范围内工作......但我猜它不会很好地扩展。

于 2013-05-02T00:20:18.833 回答