我目前有一个松散的ES6模块格式的项目,我的数据库连接是硬编码的。我想把它变成一个npm模块,我现在面临着如何最好地允许最终用户配置代码的问题。我的第一次尝试是将其重写为要实例化的类,但它使代码的使用比以前更复杂,所以我正在寻找替代方案。我正在探索我的配置选项。看起来像写入流程env会是方式,但我正在思考潜在的问题,no-nos和其他我没有考虑过的选项。
让用户编写配置来处理env配置npm模块的可接受方法吗?这有点像全局写,所以我正在处理一个名称空间考虑因素。我也考虑使用package.json
,但这不适用于凭证之类的东西。同样地使用rc文件很麻烦。我没有找到任何关于正确方法的文档。
process.env['MY_COOL_MODULE_DB'] = ...
我认为基本上有5种选择:
.rc
文件 - 如果我像AWS这样的大时间,我会这样做,但不是在这种情况下。我提到了这个npm用例,但这确实适用于配置导出为函数的代码的一般挑战。我有类的用例,但是当唯一的需要是在更复杂的代码的代价(在我的情况下)创建一个配置的范围时,我不确定它是否值得。
更新我意识到这是一个讨论问题,但它帮助我将我的大脑包围在各种选项中。我想是这样的:
// options.js
let options = {}
export function setOptions(o) { options = o }
export function getOptions(o) { return options }
然后让用户致电setOptions()
并在内部调用此getOptions
。我意识到,由于Node只需要模块一次,因此我将options
对象保持配置状态,因为我传递它。
答案 0 :(得分:0)
NPM模块应该IMO不知道配置存储的位置。这应该留给开发人员,他们可能会选择他们喜欢的方法(env vars,rc文件,JSON文件,等等)。
可以通过各种方式将配置传递给您的模块。一种常见的方法是导出一个带有选项对象的函数:
export default options => {
let db = database.connect(options.database);
...
}
从那里,它实际上取决于您的模块究竟提供了什么。如果它只是一堆松散耦合的函数,你可以只返回一个对象:
export default options => {
let db = database.connect(options.database);
return {
getUsers() { return db.getUsers() }
}
}
如果要允许同时存在该对象的多个版本,可以使用类:
class MyClass {
constructor(options) {
...
}
...
}
export default options => {
return new MyClass(options)
}
或者导出整个班级。
如果配置选项的数量有限(例如3或更少),您也可以允许它们作为单独的参数传递,而不是传递对象。