对于小型项目,所有三种方式都可以接受。对于大,我可以说下一个:
全局变量有问题
如果你开始使用这种方式,你需要保护像var config = {...}; config.freeze();这样的配置对象。在任何情况下,全局变量都是一种不好的做法,尤其是对于 NodeJS,因为它破坏了模块化系统。
传递配置是最好的方法
这是什么原因? 测试
在测试中,您需要获取配置文件的一些状态。第一种和第三种方式为您提供了下一个代码样式:
config.js
module.exports= {
a: 10
};
app.js
var config = require('config');
module.exports.func = function(){
if (config.a > 10) return 'A';
return 'B';
}
摩卡+柴测试
var expect = require('chai').except,
config = require('config'),
app = require('app');
describe('Func', function(){
it('return "A" if a > 10', function(){
config.a = 12; //DHOOO!!! (c) Homer Simpson
expect(app.func()).to.equal('A');
});
it('return "B" if a <= 10', function(){
config.a = 9;
expect(app.func()).to.equal('B');
});
config.a = 12; //return default state of config. DHOOO!!!
});
你怎么能看到你需要有可编辑的配置,这是一个不好的做法(每个开发人员都可以在任何地方更改配置状态的大项目...... DHOOO !!!)
第二种方式是这样的:
config.js
var config = {
a: 10
};
config.freezy();
module.exports = config;
app.js
module.exports.func = function(config){
if (config.a > 10) return 'A';
return 'B';
}
摩卡+柴测试
var expect = require('chai').except,
app = require('app');
describe('Func', function(){
it('return "A" if a > 10', function(){
expect(app.func({a:12})).to.equal('A');
});
it('return "B" if a <= 10', function(){
expect(app.func({a:9})).to.equal('B');
});
});
更新
在这个例子中func 是非常有语法的,对于实际项目你可以看到这样的:
module.js
var SubModule = require('submodule');
function MyModule(config, someVar) {
//Don't use full config, only options you needed.
//Pull out config options
this._a = config.a;
this._b = config.b;
this.doSomethink(someVar);
this.subModule = new SubModule(config);
}
MyModule.prototype.doSomething = function(){
if (this._a > 10) return 'A';
return 'B';
}
module.exports = MyModule;`
子模块.js
function MySubModule(config) {
this._c = config.c;
}
module.exports = MySubModule;