2012-05-18 51 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'返回一个新的对象,或者使用工厂模式,那么你就不会碰撞。 –