我有一个javascript库,基本上这是它到目前为止的结构:
var Ns = (function(){
var that = {};
// add stuff to 'that'
return that;
})();
//use Ns.foo() and Ns.bar()
现在,我希望node
和npm
可以使用相同的lib。到目前为止,这是我能想到的:
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
浏览器包含。想法?
答案 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;
但是,这样做的后果是,在浏览器版本中,所有内容都会被转储到全局范围内。此外,它假定浏览器版本将必要的脚本加载到页面中。很容易在小范围内工作......但我猜它不会很好地扩展。