2012-01-22 40 views
23

我剛剛開始使用nodejs。我想知道是否有一種方法可以在應用程序中「僅需要」一次文件。我正在使用一個類框架在我的JS項目中獲得經典的OOPS。每個「類」都包含在它自己的JS文件中。我想在每個文件中「要求」類框架,以便它們可以獨立運行,但希望框架的init代碼只執行一次。有沒有辦法在nodejs中「僅需要」一次JS文件?

我可以使用一個標誌來實現這一點,但內置的方式會很好。搜索「需要一次」會導致我遇到與PHP相關的所有問題。

回答

59

require總是「需要一次」。第一次撥打require之後,require使用緩存並始終返回相同的對象。

在模塊中浮動的任何可執行代碼只能運行一次。另一方面,如果您確實希望它多次運行初始化代碼,只需將該代碼放入導出的方法中即可。

編輯:閱讀的http://nodejs.org/docs/latest/api/modules.html#modules

+1

太棒了!感謝您的快速回復。 – atlantis

+0

當你說'多次運行初始化代碼時,你可以解釋或給出示例,只需將該代碼導入導出的方法。「# – 2015-10-22 08:58:33

+1

@sudo而不是將代碼留在模塊的主體中​​,將其放入您導出的函數。然後需要您的模塊的模塊可以執行此功能以重新運行初始化代碼。 例如 '''js var db = connect(); module.exports = DB ''' VS '''JS module.exports =連接 ''' 另一種方式去思考的是:節點模塊總是單身。你的單例可以暴露一個構造函數/工廠來創建實例。 – timoxley

1

的「緩存」一節。如果你真的想要的頂級代碼的模塊中(代碼是不是你的模塊中包含的方法或職責範圍內)執行一次可以多刪除它是在require.cache對象緩存這樣的模塊對象:

delete require.cache[require.resolve('./mymodule.js')]; 

做到這一點,你需要第二次模塊之前。

大多數時候,儘管您可能只希望模塊的頂級代碼運行一次,而在任何其他時間需要模塊時,您只需要訪問該模塊導出的內容。

var myMod = require("./mymodule.js"); //the first time you require the 
             //mymodule.js module the top level code gets 
             //run and you get the module value returned. 


var myMod = require("./mymodule.js"); //the second time you require the mymodule.js 
             //module you will only get the module value 
             //returned. Obviously the second time you 
             //require the module it will be in another 
             //file than the first one you did it in. 
相關問題