2011-11-07 26 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; 

但是,這樣做的後果是,在瀏覽器版本中,所有內容都被轉儲到全局範圍內。另外,它假定瀏覽器版本將必要的腳本加載到頁面中。容易在小規模工作......但我猜測它不會很好地擴展。

相關問題