在Node.js模块中,我需要运行一些初始化代码,一些代码只运行一次,以解析YAML配置文件 在我的应用程序启动。
作为一个Node.js新手,我注意到模块只加载了一次,而且只加载了一次(就像那样非常好)。我的意思是:
// ./mymodule.js
console.log('mymodule.js was run');
...仅显示给定消息一次,即使多个已加载模块中需要./mymodule.js
。那没关系。
因此,对于我的初始化代码,我可以想象实现它就像这样:
// ./mymodule.js
function mymodule_init()
// Parse my config file
// ...
// Done
}
// Run my init:
mymodule_init();
console.log('mymodule.js was run');
但这是运行初始化代码的正确方法吗?是不是有更常规的方式去做,比如订阅
一种'module_init
'事件,它可以保证我的初始化代码只运行一次?
注意:我找到了关于这个问题的SO链接:Initialize nodejs module once, use many times,但没有真正坦率的回答。
答案 0 :(得分:3)
Node.js documention on the subject of module caching州:
多次调用require('foo')可能不会导致模块代码 多次执行。这是一个重要的特征。用它, 可以返回“部分完成”的对象,从而允许传递 即使它们会导致循环,也要加载依赖项。
所以我没有看到直接在模块中执行的初始化代码有什么问题。我在几个Node.js应用程序中执行此操作,正如您所指示的那样:
// ./mymodule.js
function mymodule_init()
// Parse my config file
// ...
// Done
}
// Run my init:
mymodule_init();
console.log('mymodule.js was run');
答案 1 :(得分:0)
你的问题大多会有自己的答案,但无论如何。
我通常使用单身类来完成这类工作。
像
这样的东西// config.js
function Config() {
this.config = parseYAML("./path/to/yaml-file.yaml");
}
Config.prototype.get = function( property ) {
return this.config[property];
}
module.exports = new Config();
并在您的应用或模块中
// app.js
const config = require( "./config.js" );
console.log( config.get("some-config-property") );
大多数模块使用这个或匿名函数,这个函数会被立即调用,例如
module.exports = (function() {
return parseYAML("./path/to/yaml-file.yaml");
})();
这两种情况你都会做得对,所以只要你的代码是可读的,它实际上并不重要。