如何正确运行Node.js模块初始化

时间:2016-11-02 21:54:12

标签: node.js

在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,但没有真正坦率的回答。

2 个答案:

答案 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");
})();

这两种情况你都会做得对,所以只要你的代码是可读的,它实际上并不重要。