我目前正在开发一个小型控制台项目,它很大程度上依赖于最初传递的参数,我正在寻找一种在nodejs中处理配置对象的好方法。
我的项目目前完全使用以下示例,但我认为在使用'require'时我正在继续使用模块的缓存。
让我们假设一个模块options.js
'use strict';
var options = {
configName: '.jstail',
colorActive: (process.platform === 'win32') ? false : true, // deactivate color by default on windows platform
quiet: false,
debug: false,
config: null,
logFile: null,
setting: null
};
module.exports = options;
我的初始模块init.js
#!/usr/bin/env node
'use strict';
var options = require('options'); // require above options module
// modify the options object based on args
然后我有一个依赖于这个选项的记录器
例如,如果quiet设置为true,则不会发生日志记录
logger.js
'use strict';
var options = require('options');
/**
* prints to console if not explicitly suppresed
* @param {String} text
*/
function log(text) {
if (!options.quiet) {
console.log('[LOG]: ' + text);
}
}
我的大问题是(我认为)当我在记录器中需要选项模块时,我正在继续缓存nodejs模块
所以我的两个问题是:
我是对的,这只能用于缓存nodejs为我做的模块吗? 有没有更好的方法来处理动态全局配置?
我知道配置文件有几个问题和教程,但这不是我想要的。
答案 0 :(得分:5)
是的,这只能用于缓存,但我不会将其称为缓存(但是node.js文档可以),而不是延迟初始化。可以依赖它,很多模块会先做一些初始化需求,使用它进行配置也很典型。一般来说,require是一种访问全局单例对象的node.js方法。
另一种方法是从单个文件加载配置,修改它然后将其传递给需要它的其他模块,如下所示:
//index.js
var config = require('./config')
config.flag = false
var module1 = require('./module1')(config)
//module1.js
module.exports = function (config) {
// do stuff
}
它使代码更加分离和可测试,但增加了复杂性。这两种方法之间的差异与使用全局和依赖注入基本相同。使用你喜欢的任何东西。