2012-05-18 50 views
1

我可以建立一個導出實例化變量的模塊嗎?實例化事物的節點模塊?

模塊:

var module1 = require('module1') 
var Module2 = require('module2') 

module1.dosomething(variables) 
exports.module1 = module1 

//or 

module2 = new Modle2(variables) 
module2.dosomething(variables) 
exports.module2 = module2 

我可以要求模塊上方在許多其他文件,並使用出口作爲實例變量或將它們重新實例每次我需要他們,並要求他們在文件之間不共享時間。

謝謝!

+0

您可以執行。不是一個好的答案。這取決於你想怎麼做。 –

+0

我可以做這些和出口都不會被重新實例化模塊1和模塊2的versons每次需要?導出將始終引用已經實例化的版本? – fancy

+0

這取決於,但是,看到我對這個問題的答案http://stackoverflow.com/questions/8931239/how-to-access-variables-declared-in-main-app-js-in-seperate-route- files-in-node/8931366#8931366 –

回答

3

你的例子令人困惑,因爲你在多個上下文中使用module1,既作爲一個模塊,又作爲另一個模塊中的變量,以及該模塊的導出屬性。

將模塊視爲封閉和導出作爲返回值。最有可能的是你想導出一個函數/工廠函數,並且每次如果你想用導出來創建新實例時都會調用它,因爲它只是返回對象,所以其他任何東西都會被共享。

模塊1

module.exports.var1 = function(opts) { 
    // do stuff 
    return variables; 
}; 

module.exports.var2 = new Blah(); // single instance 

其他模塊

var var1 = require('module1').var1({ opt1: 'foo' }); // New instance every time 
var var2 = require('module1').var2; // Same var instance even if you include in another module 
1

你甚至可以做這樣的事情是真的很煩人。大多數npm模塊使你創建實例化的版本以避免這種愚蠢。

// file.js 
var m1 = require('./m1'); 
m1.awesome = false; 
console.log("I am awesome", m1.awesome); 

// file2.js 
var m1 = require('./m1'); 
console.log("I am awesome", m1.awesome); 

// both.js 
require('./file'); 
require('./file2'); 

// m1.js 
exports.awesome = true; 

現在運行這個命令:

node file1.js 
I am awesome false 

node file2.js 
I am awesome true 

node both.js 
I am awesome false 
I am awesome false 
+0

這基本上意味着在兩個.js file1的操作中污染了file2操作的權利?這意味着我們應該始終導出可實例化的對象? – CMCDragonkai

+0

如果你通過'new'返回一個新的對象,或者使用工廠模式,那麼你就不會碰撞。 –