使脚本与浏览器和节点(npm)

我有一个JavaScript库,基本上这是它是如何构造到目前为止:

var Ns = (function(){ var that = {}; // add stuff to 'that' return that; })(); //use Ns.foo() and Ns.bar() 

现在的事情是,我想要和nodenpm一样的lib。 到目前为止,这是我能想到的:

 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 ,这将打破浏览器包含。 想法?

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

创build一个范围可能是最好的路线(所以你没有名称冲突的问题),但通过污染全球范围,更简单的方法来做到这一点,看起来像这样:

代替

 var x = require('x'); 

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

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

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

但是,这样做的后果是,在浏览器版本中,所有东西都被转移到了全局范围内。 而且,它假定浏览器版本将必要的脚本加载到页面中。 容易得到小规模的工作……但我猜测它不会很好地扩展。