实例化事物的节点模块?

时间:2012-05-18 21:44:53

标签: javascript node.js variables

我可以构建一个导出实例化变量的模块吗?

模块:

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

我是否可以在许多其他文件中使用上述模块,并将导出用作实例化变量,或者每次需要时都会重新实例化,而不是在需要它们的文件之间共享。

谢谢!

2 个答案:

答案 0 :(得分: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 :(得分: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