2011-11-07 34 views
2

我有一个JavaScript lib下,基本上这是怎么回事是迄今为止结构:请使用浏览器和节点(NPM)的脚本工作不错

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

    // add stuff to 'that' 

    return that; 
})(); 

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

的事情是,现在,我想同样的lib与nodenpm一起提供。到目前为止,这是我能想出:

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

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

的问题是,虽然这部作品在浏览器中,在节点我需要这样做:

var Ns = require('ns').Ns 

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

回答

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

})(); 
0

创建范围可能是去(这样你就不会有重名问题)的最佳路线,而是一个更简单的方法来做到这一点,通过污染在全球范围内,看起来是这样的:

代替

var x = require('x'); 

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

同样,之前加入到出口,检查是否是OBJ ect存在:

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

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

相关问题