2014-07-04 67 views
0

我有以下項目結構如何在另一個自定義模塊使用功能從一個自定義模塊

|server 
|- module1.js 
|- module2.js 
|app.js 

module1.js看起來這樣

module.exports = { 
    f1 : function(){ ... }, 
    ... 
    fN : function(){ ... } 
}; 

module2.js看起來這way

module.exports = { 
    t1 : function(){ ... }, 
    ... 
    tN : function(){ ... } 
}; 

在app.js我使用這些模塊

var M1 = require('./module1.js'); 
var M2 = require('./module2.js'); 

的兩所以現在我可以用M1.f1()M2.t1()。問題是在module2中我必須使用module1中的函數。如果我將t1定義爲function(){M2.f1(); ....}它會產生一個錯誤,告訴M2沒有被定義。

我該如何解決? (我知道我可以要求在模塊1模塊2,但它只是不正確的感覺)

回答

1

1)要求M1M2。不知道爲什麼你不認爲它「感覺正確」,但它是一個合理的方式來處理它。

2)您申報M1 - require('./module1.js');後,將M1轉換爲M2,以便在M2中使用。這會讓你訪問那裏的屬性。你會看起來像var M2 = require('./module2.js')(M1)。在我看來,這開始複雜化的東西超過#1中的要求...

3)如果你想在兩個相同的功能...那麼也許你需要第三個模塊。這第三個模塊將導出M1M2將作爲方法公開的功能。

如果你發現自己有一堆不緊密耦合到一個或另一個對象的常用函數,這第三種方法可能是最好的。創建一個導出這些常用函數(文件或數據庫函數爲例子)以便在其他函數中重用的實用程序模塊是一種常用方法。

請注意,您需要在原來的兩個模塊中都需要第三個模塊......我認爲這是合理的,因爲代碼的組織方式會使您需要使用的「實用程序庫」由另外兩個模塊完成。

1

其他選項(除了要求在模塊2模塊1)將通過功能以模塊2:

// module2.js 
module.exports = function(mod1) { 
    // use mod1.f1, ..., mod1.fN anywhere in here 
    return { 
    t1 : function(){ ... }, 
    tN : function(){ ... } 
    }; 
}; 

// main.js 
var M1 = require('./module1.js'); 
var M2 = require('./module2.js')(M1); 
相關問題