我有一个主模块(app.js),它初始化一个客户机(用于进行REST api调用),并在使用这个客户机的主模块中有一些函数。随着我的代码越来越大,我想通过将函数放入模块(比如module_A.js)来模块化main。在不同模块之间初始化和共享此客户端的最佳实践是什么?我考虑的一种方法是创建一个客户端模块,这是我在每个模块中都需要的-那么客户端不会被多次初始化吗?克里斯蒂安
发布于 2017-05-02 10:55:22
不是的。据我所知,一个模块是单例的,所以它只会被创建一次。当另一个模块对模块module_A
执行require
操作时,它们会获取已经存在的对该模块的引用。
module_A.js
console.log("should only be called ONCE");
var module_object = {
shared_variable: "initial text"
};
module.exports = module_object;
caller1.js
var testmod = require("./module_A");
console.log("TEST IS:" + testmod.shared_variable);
testmod.shared_variable += " - included in caller1";
console.log("TEST IS:" + testmod.shared_variable);
caller2.js
var testmod = require("./module_A");
console.log("TEST IS:" + testmod.shared_variable);
testmod.shared_variable += " - included in caller2";
console.log("TEST IS:" + testmod.shared_variable);
在上面的测试中,带有" once“的日志行应该只被调用一次,无论您的服务器运行多长时间。
但是,如果您有多个实例,我不确定它会运行多少次(例如,在一个只有一个实例pr的集群中。cpu),但您可以测试它是否必要。
发布于 2017-05-02 15:50:12
谢谢你的回答。经过研究,我认为解决方案是初始化每个模块(module_A、module_B等)。在main中创建的rest客户端。应该是这样的:
main app.js中的
var apiClient = ...var module_A = test.init(apiClient);
var client = null;exports.init = function init(aClient){ client = aClient;} exports.myFunction = function(callback){ client.doSomething(function(data){ ...
});}
https://stackoverflow.com/questions/43733942
复制