Node.js 使脚本与浏览器和节点(npm)配合使用

Node.js 使脚本与浏览器和节点(npm)配合使用,node.js,package,npm,Node.js,Package,Npm,我有一个javascript库,基本上到目前为止它的结构是这样的: var Ns = (function(){ var that = {}; // add stuff to 'that' return that; })(); //use Ns.foo() and Ns.bar() 现在的问题是,我希望相同的库可以与node和npm一起使用。到目前为止,我能想到的是: this.Ns = (function(){ //same as previous snippet })()

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

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

  // add stuff to 'that'

  return that;
})();

//use Ns.foo() and Ns.bar()
现在的问题是,我希望相同的库可以与
node
npm
一起使用。到目前为止,我能想到的是:

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

//use Ns.foo() and Ns.bar()
问题是,虽然这在浏览器中有效,但在节点中,我需要执行以下操作:

var Ns = require('ns').Ns

问题:我希望能够做到
var Ns=require('Ns')
但为了做到这一点,我必须导出
this.foo
this.bar
,这将打破浏览器的包容性。想法?

创建作用域可能是最好的选择(这样就不会出现名称冲突问题),但更简单的方法是通过污染全局作用域,如下所示:

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

})();
而不是

var x = require('x');

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

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

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