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に行き、それを理解しようとしました。また、急速に人気が高まっている理由を理解しようとしました。 そこで彼は、苦労して理解した結果を段階的に一般に公開することにしました。