使脚本在浏览器和节点上运行良好(npm)

时间:2011-11-07 01:46:55

标签: node.js package 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浏览器包含。想法?

2 个答案:

答案 0 :(得分: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;
  }

})();

答案 1 :(得分:0)

创建一个范围可能是最佳选择(因此您没有名称冲突问题),但通过污染全局范围,更简单的方法是这样做:

而不是

var x = require('x');

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

并且类似地,在添加到导出之前,检查该对象是否存在:

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