2016-07-20 3 views
4

Node.jsのrequire()機能とmodule.exportsの機能と性質を一般的かつ高度に理解しています。しかし、私には意味をなさない行動がいくつかあります。ファイルに何もエクスポートされていないモジュールが必要な場合のNode.jsの動作について

2つの非常に単純な1行のファイルa.jsb.jsがあるとします。 a.js

require('./b.js'); 

b.jsで:

console.log("testing"); 

と私はターミナルでnode a.jsを実行した場合、ここに記録されているものです:

$ node a.js 
testing. 

だけによるということを意味していますファイル/モジュールを必要とし、要求されたファイルの内容はエクスポ(右、?)要求を発行し、ファイルにsedを


今、私はこれにa.jsを変更します。これに

require('./b.js'); 
testFunc(1, 2); 

とb.jsを:

var testFunc = function(a, b) { 
    var result = a + b; 
    return result; 
} 

と実行、再び、node a.js端末内:

$ node a.js 
/demo/a.js:3 
testFunc(1, 2); 
^ 

ReferenceError: testFunc is not defined 
...... 

ここで何が起こっているのですか?明らかに、最初の例では、b.jsが必要です。a.jsは、b.jsのコンテンツにアクセスできます。しかし、第2の例では、ReferenceError: testFunc is not definedで明らかなように、で定義された関数には全くアクセスできません。ここのトリックは何ですか?

require()は、実際にコンテンツを要求ファイルに公開せずに必要なスクリプトのみを実行するためですか?したがって、他のモジュールのコンテンツを使用するには、module.exportsを使用してそのモジュールを公開する必要がありますか?

+0

私はこの質問がES6や特急としなければならなかった何見当がつかない。 – Bergi

答えて

1

最初のケースでは、a.jsには何も表示されません。 nodejでは、エクスポートされた値を明示的に変数に格納する必要があります。

つまり、モジュールが必要なときは、エクスポートされるものを作成するために最も高いスコープが実行されています。そのため、console.logが実行されていることがわかります。必要なときには、多くの言語とは異なり、

module.exports = { 
    testFunc: testFunc 
} 

そして、言い換えれば

var b = require('./b.js') 
b.testFunc(1, 2) 

a.js中:あなたはb.jsから何かをエクスポートしたい場合は

、あなたはこのような何かをする必要があると思いますモジュール。シンボルがグローバルスコープに追加されないので、モジュールtestFuncをモジュールb testFuncに明示的に定義することなく、nodejsは何もわからないtestFuncです。

2

あなたの理解には欠陥があります。

"ファイルの内容が要求を発行するファイルに公開されています"一般的には、module.exportsのみが公開されています。

ノードモジュールは、独自のスコープ内で実行されるため、モジュール内のコードにアクセスすることはできません。

module wrapper documentation

(function (exports, require, module, __filename, __dirname) { 
// Your module code actually lives in here 
}); 

すべてのコンソールメッセージは、この場合の端末で、同じ出力に向けられているので、あなたは、コンソール・ログを参照してください。

これは、ブラウザでメッセージがどのように動作するのかと似ています。以下のコードはiframeで実行され、メインページとは別のものですが、iframeからのコンソールメッセージとメインウィンドウからのコンソールメッセージは両方ともdevツールコンソールに送られます。

console.log("whoa");

1

このための良い答えがthis postで見つけることができます。

ノードJS(この例ではb.js)にスクリプトが必要な場合は、エクスポートしない限り物理的にコードを実行することはできません。例えば

a.js

'use strict'; 

    let b = require('./b.js'); 

    let result = b.testFunc(1, 4); 
    console.log(result); 

b.js

'use strict'; 

    module.exports.testFunc = function(a, b) { 
     let result = a + b; 
     return result; 
    } 

    console.log(this.testFunc(5,5)); 
関連する問題