Node.jsのrequire()を理解する



Node.jsは、 CommonJS規則を使用するサーバーアプリケーションを構築するための非同期JavaScriptライブラリです。 このすべての構文、モジュールは最初はかなり混乱しました。 しかし、まだそれを理解しようとしてみましょう。



この記事ではNode.js v0.5.8-preを使用します。 行こう!







始めるために、円で機能するいくつかの関数を定義しましょう(おそらく、ドキュメントのページで既にそれらを満たしているでしょう)。



var PI = 3.14



exports.area = function ( r ) {

return PI * r * r

}



exports.circumference = function ( r ) {

return 2 * PI * r

}




* This source code was highlighted with Source Code Highlighter .








素晴らしい。 ノードでそれらを使用してみましょう。 nodeコマンドでコンソールを起動し、circle.jsファイルを含めます。 パスには相対パスが含まれていることに注意してください。 拡張子は省略できますが、nodeはjsファイルであることを意味します。 初めてこのようなものを取得する可能性が高い場合:



node> require( './ circle')

{エリア:[関数]、円周:[関数]}

ノード>エリア

ReferenceError:エリアが定義されていません

EventEmitter.anonymous(readline(/usr/local/lib/node/libraries/repl.js:48:9)で評価)

EventEmitter.readline(/usr/local/lib/node/libraries/repl.js:48:19)

node.jsで:845:9



どうしたの?



正しくしましょう。 他のオブジェクト言語の操作経験があり、以前に定義したメソッドを使用することに慣れています。 しかし、CommonJSモジュールではそれほど簡単ではありません。 モジュールの使用方法を見てみましょう。



node> var circle = require( './ circle')

{エリア:[関数]、円周:[関数]}

node> circle.area(5)

78.5



素晴らしい。 結果はすでに良くなっています。 ただし、次を試してみると:



node> circle.PI

ノード>



「何もありません」。 結局、サークル属性を正しく呼び出しましたが、何も受け取りませんでした。 最初は、これはやや混乱する可能性があります。 実際、最初は私のように。 ドキュメントを見ると、これについて見るべきことがあります。

オブジェクトをエクスポートするには、特別なエクスポートオブジェクトに追加します。 (あるいは、エクスポートの代わりにこれを使用できます。)



次のようにモジュールを書き換えることができます。



var PI = 3.14



this .area = function ( r ) {

return PI * r * r

}



this .circumference = function ( r ) {

return 2 * PI * r

}




* This source code was highlighted with Source Code Highlighter .








「これはこれと何の関係があるのですか?」とあなたは尋ねます。 はい、これが私たちのオブジェクトであるという事実にもかかわらず。 次の形式でモジュールを提示できます。



function circle () {

var PI = 3.14



this .area = function ( r ) {

return PI * r * r

}



this .circumference = function ( r ) {

return 2 * PI * r

}

}




* This source code was highlighted with Source Code Highlighter .








おなじみですか? これは通常のJavaScriptオブジェクトです。 したがって、Node.jsのモジュールは、短い形式で定義された使い慣れたオブジェクトにすぎません。 つまり、本質的に、オブジェクトの本体のみを宣言します。 これで、CommonJSモジュールについてのアイデアが得られました。

おわりに



モジュールファイルは、通常のオブジェクトにすぎません。 ファイルでは、モジュール本体を直接定義します。 CommonJSモジュールで、外部から何かにアクセスできるようにする場合は、 exportを使用する必要があります。 (上記の例では)実際にPIにアクセスできますが、これは間違ったアプローチです。 グローバルスコープを使用すると、既存の属性またはメソッドをオーバーライドするリスクがあります。 そして、座ってバグをキャッチします。 パブリックメソッドのみをエクスポートし、その他はすべてブラックボックス内に残します。 エクスポートは非常に便利で実用的なアプローチです。



翻訳者から


これは、完全な翻訳よりもジェームズの記録の自由な解釈の可能性が高いです。 元の投稿はすでに古くなっているため、調整を試みました。 新しい技術と展望を求めて、私自身はnode.jsに行き、それを理解しようとしました。また、急速に人気が高まっている理由を理解しようとしました。 そこで彼は、苦労して理解した結果を段階的に一般に公開することにしました。



All Articles