2

私はnode.jsを学んでいて、次の2つのケースに違いがあることに興味があります。IEmyvar多くのモジュールやサブモジュールに渡す必要のある変数 (db 接続や定数文字列 "test" など) があります。

最初のケース。その変数をパラメーターとして受け入れるモジュールを作成します。

サブモジュール.js:

var option
  , submodule = {};
submodule.func = function(){
    ...
    var something = option;
    ...
}
module.exports = function(opts){
    option = opts;
    return submodule;
}

module1.js:

var option
  , submodule
  , module1 = {};
module1.func = function(){
    ...
    submodule.func();
    ...
    var something = option;
    ...
}
module.exports = function(opts){
    option = opts;
    submodule = require('./submodule')(opts);
    return module1;
}

この場合、サブモジュールが同じmyvar値を持つ複数のモジュール (つまり 2 つのモジュール) で使用されている場合、サブモジュールのmodule.exports関数は 2 回呼び出されます。node.js mans では、「モジュールは、最初にロードされた後にキャッシュされます」と書かれていました。そして、このモジュールがキャッシュされているかどうかわかりません。

別のケース:myvarモジュール関数にパラメーターとして渡すことができます。したがって、コードは次のようになります。

サブモジュール.js:

function func(option){
    ...
    var something = option;
    ...
};
exports.func = func;

module1.js:

var submodule = require('./submodule');
function func(option){
    ...
    submodule.func(option);
    ...
    var something = option;
    ...
};
exports.func = func;

質問は次のとおりです。この 2 つのケースに違いはありますか、それとも同じですか?

4

1 に答える 1

5

ここで何を求めているのか正確にはわかりませんが、モジュールに値を渡す必要がある場合は、パラメーターを受け入れる関数を必ずエクスポートする必要があります。モジュールがキャッシュされていると言うとき、それはモジュールが一度だけ初期化されることを意味します。モジュールをオブジェクトと考えてください。

var a = 1;
var b = 2;
console.log("init!");

module.exports.test = function(){
      console.log("this is a function!");
}

ここでは、a、b、および最初のログが 1 回だけ実行されます。これは、モジュールが要求され、キャッシュされるときです。あなたがするとき

 var example = require("module")

作成されていない場合は、a、b を初期化し、ログ メッセージを実行します。すでに作成されている場合は、エクスポートしたものへの参照が提供されます。あなたが電話するたびに:

 example.test()

次のように出力されます。this is a function!

ただし、a、b、および最初のログを再度実行することはできません。

そのオブジェクトのプライベート静的変数としてエクスポートされないすべてのステートメントを考えてください。

別の完全に機能する例を次に示します。

app.js

var s = require("./sample");
var y = require("./sample");
s.test();
y.test();
s.test();
console.log("finished");

sample.js

var a = 1;
var b = 2;
console.log("init!");
function test() {
    console.log("here! " + a);
    a++;
}
exports.test = test;

これはすべて出力します:

init!
here! 1
here! 2
here! 3
finished

これはまったく役に立ちますか?

于 2013-04-05T15:12:46.647 に答える