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

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

谢谢!

4

2 回答 2

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
于 2012-05-18T21:58:51.677 回答
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
于 2012-05-18T22:08:17.430 回答