2016-09-08 15 views
0

現在、プロジェクトは緩やかなES6モジュール形式であり、データベース接続はハードコードされています。私はこれをnpmモジュールに変えたいと思っています。そして今、エンドユーザーにコードの設定を許可する方法の問題に直面しています。私の最初の試みはインスタンス化されるクラスとしてそれを書き直すことでしたが、以前よりも複雑なコードを使用していますので、代替案を見ています。私は自分の設定オプションを調べています。プロセスに書き込むように見えますが、私は考えていない潜在的な問題、ノー・ノーなどの選択肢を考えています。npmモジュールを設定するためのENV変数の作成

npmモジュールを構成するのに許容できる方法をenvで処理するためにユーザー書き込み設定を持っていますか?これは、グローバルな書き込みのように、名前空間の考慮事項を扱うためです。私もpackage.jsonの使用を検討しましたが、それは資格情報などのためにはうまくいかないでしょう。同様に、rcファイルを使用するのは面倒です。私は適切な方法論があればそれを見つけられませんでした。

process.env['MY_COOL_MODULE_DB'] = ... 

私はそれを見るように、基本的5ishオプションがあります。

  1. 打ち - ないオプション
  2. なクラスとして構成されたスコープを作成する - 私が今持っているものはとbleh
  3. ユースA node-configなどの設定 - npmのためのユーザーフレンドリーなオプションではありません
  4. globals/envとして保存します。コメントに示唆されているように、エクスポートされた関数でそのプロセスをラップすることで、複雑な非首尾よく名前空間を確保しながらエンドユーザーから抽象化することができます
  5. .rcファイルを作成するようにユーザーに依頼します。この場合ではありません。

これはnpmの使用例ですが、これは実際に関数としてエクスポートされるコードを構成する一般的な課題に当てはまります。私はクラスのユースケースを持っていますが、唯一の必要性は、より複雑なコードの経費(私の場合は)で構成されたスコープを作成しているときに、その価値があるかどうかはわかりません。

更新私はこれは議論の質問ですが、私の選択肢を周りに私の脳を包んで助けたことを実現します。

// options.js 
let options = {} 
export function setOptions(o) { options = o } 
export function getOptions(o) { return options } 

そして、ユーザー・コールsetOptions()を持っており、内部でこのgetOptionsを呼び出す:私はこのようなものだと思います。私はノードがモジュールを1回だけ必要とするので、私のoptionsオブジェクトは設定したままにしておきます。

+0

私にとっては、基本的には、グローバルを使ってモジュールを構成することと同じです。オプションを取る関数をエクスポートしないでください。クラスを外に出しすぎると複雑になります。 – robertklep

+0

@robertklepしかし、この関数はどのようにしてvarsを保存しますか?その同じ挑戦。 1)ハードコード - オプションではない、2)クラスなどの設定されたスコープを作成する - 私が今使っているものとbleh 3)node-configなどの設定を使う - 本当にnpmのユーザーフレンドリーなオプションか4)/env。だから私がユーザーに関数を渡すと、私がやっていることは、まだいくつかのenvのラッパーを作っていることになります。私は、複雑な名前空間を作成し、それをユーザから抽象化することができます。 – cyberwombat

+0

多分私は理解していないかもしれません。あなたはモジュールを書いています。データベース資格のような特定のオプションを取るべきです。アプリケーションコードからそれらのオプションをモジュールに渡す方法を探しています。 – robertklep

答えて

0

NPMモジュールは、構成がの場合は、が格納されている場所には無関心である必要があります。これは開発者に任せておき、好みの方法(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以下)、オブジェクトを渡す代わりに、別々の引数として渡すこともできます。

+0

これはES6モジュール(例として)をエクスポートすることによって挑戦している範囲の問題です。私はそれが不可知論的でなければならないことに同意するので、内部ENV変数を設定する設定機能を検討中です – cyberwombat

+0

"内部ENV変数"などは存在しません。 ES6モジュールがどのようにスコープを挑戦するかはわかりません。通常のノードモジュールで同じ問題が発生していませんか? – robertklep

+0

私はあなたが提案したようにconfig関数を提供することを意味し、それを使用して、envに格納することができます。これは、ユーザから抽象化された意味で内部的です。どのような機能も実際には構成によって設定/スコープ化されていません。 – cyberwombat

関連する問題