1

module.exportsオブジェクトまたは関数 (場合によっては、オブジェクトを返す関数) のいずれかに設定できることはわかっています。

exportsまた、 vs .の違いと使用方法についても認識しているmodule.exportsので、それについてコメントする必要はありません。

また、返されるものはすべてキャッシュされ、 への連続した呼び出しで返されることも理解していrequireます。したがって、オブジェクトではなく関数を返すことを選択した場合、require ごとに実際にこの関数を実行する必要があることを意味する可能性があります。

これら2つのどちらを使用すべきかについての事実上の標準があるのではないかと思っていました。または、そのような標準がない場合-モジュールがオブジェクト、関数、またはより複雑なものを返す必要があるかどうかを決定する際に、どのような考慮事項が適用されるでしょうか...

私が書こうとしているモジュールは、問題があれば高速アプリケーションの一部として使用されることが期待されます (高速/接続モジュールの「ローカルの事実上の標準」が存在する可能性があります)。

4

2 に答える 2

1

require'd コードがスタンドアロンで、親コードのオブジェクトにアクセスする必要がない場合は、exportオブジェクト.

編集- 上記は私の好みの方法です。構成データやデータベースオブジェクトなど、モジュールに何かを渡す必要がある場合にのみ、以下を実行します。モジュールが親のスコープ内にある変数にアクセスできるようにする、より洗練された方法は見つかりませんでした。

したがって、オブジェクトを親からモジュールに渡すには、次の関数を使用します。

//parent.js
var config = { DBname:'bar' };
var child = require('./child.js')(config);

//child.js
module.exports = function(cfg){
  var innerchild = {};
  innerchild.blah = function(){
    console.log(cfg.DBname); // this is out of scope unless you pass it in
  }
  return innerchild;
};
于 2013-07-26T14:37:10.410 に答える
0

「そのため、オブジェクトではなく関数を返すことを選択した場合、require ごとに実際にこの関数を実行する必要があることを意味する可能性があります。」

個々の関数を返すかオブジェクトを返すかは問題ではありません。どちらの場合も、関数 (または関数) は実行されません。明示的にそうしない限り。

たとえば、 a モジュールを考えてみましょうhello.js:

exports = function () { return 'Hello'; };

require を使用してその関数を取得できます。

var hello = require('hello');

その関数を実行する場合は、次のように明示的に呼び出す必要があります。

var hello = require('hello')();

関数が正確に 1 回実行されるようにしたいと書いています。hello.js直感的に、これは次のように書くことにつながる可能性があります。

var hello = function () { return 'Hello'; };
exports = hello();

その場合、require を介して hello からの結果を保存できます。

var hello = require('hello');

ただし、これを行うと、エクスポート システムがモジュールをキャッシュする可能性があります。このような場合、hello から新しい結果を取得するのではなく、キャッシュされた値を取得します。これはあなたが望むものかもしれませんし、そうでないかもしれません。関数が必要になるたびに呼び出されるようにしたい場合は、関数をエクスポートして、require の後に呼び出す必要があります。

于 2013-07-26T10:03:56.000 に答える