Node.jsmodule.exportsとexports

それらは何ですか、それらを使用する方法とそれらを使用しない方法

(この記事はNode.js 6.1.0リリースの後に書かれたことに注意してください)

TL; DR

  • module.exportsは、require()から返される変数と考えてください。デフォルトでは空のオブジェクトであり、何にでも変更できます。
  • 輸出?ええと、「輸出」自体は決して返されません!これはmodule.exportsへの単なる参照です。モジュールの作成者が書くコードを減らすのに役立つ便利な変数。そのプロパティでの作業は安全であり、推奨されます。
exports.method = function() {…} 
vs.
module.exports.method = function() {…}

簡単なモジュールの例

まず、サンプルのコードベースが必要です。簡単な計算機から始めましょう:

使用法:

モジュールラッパー

Node.jsは、すべてのrequire()-edモジュールを関数ラッパーで内部的にラップします。

モジュールオブジェクト

変数「モジュール」は、現在のモジュールを表すオブジェクトです。これ各モジュールに対してローカルであり、プライベートでもあります(モジュールコードからのみアクセス可能):

Module.exports

  • require()呼び出しから返されるのはオブジェクト参照です。
  • Node.jsによって自動的に作成されます。
  • これは、プレーンなJavaScriptオブジェクトへの単なる参照です。
  • また、デフォルトでは空です(コードは「add()」メソッドを付加します)

module.exportsを使用する方法は2つあります。

  1. パブリックメソッドをそれにアタッチします(計算機の例で行ったように)。
  2. 交換、それを私たちのカスタムオブジェクトや関数で。

なぜそれを交換するのですか?置き換える場合、他のクラスの任意のインスタンスを返すことができます。ES2015で書かれた例を次に示します。

上記の「calculator-base」はクラスをエクスポートします。

「Calculator」クラスを拡張して、今回はインスタンスをエクスポートしましょう。

使用法:

エイリアスをエクスポートします

  • 「exports」は単なる便利な変数であるため、モジュールの作成者はより少ないコードを記述できます
  • そのプロパティでの作業は安全であり、推奨されます。

    (例:exports.add = function…)

  • エクスポートはrequire()によって返されません(module.exportsは!)

ここにいくつかの良い例といくつかの悪い例があります:

注: module.exportsをカスタム関数またはオブジェクトに置き換えるのが一般的な方法です。それを行うが、それでも「エクスポート」の省略形を使い続けたい場合。次に、「エクスポート」を新しいカスタムオブジェクトに再度ポイントする必要があります(上記のコードの12行目でも実行されます)。

exports = module.exports = {}
exports.method = function() {...}

結論

完全にエクスポートされていないexportsという名前の変数は、特にNode.jsの初心者にとって、混乱を招きます。公式のドキュメントでさえ、少し奇妙な見方をしています。

ガイドラインとして、exportsとmodule.exportsの関係が魔法のように思われる場合は、exportsを無視し、module.exportsのみを使用してください。

私の考えでは、コードは魔法ではありません。開発者は、使用するプラットフォームと言語を常に深く理解する必要があります。そうすることによって; プログラマーは貴重な自信と知識を獲得し、それがコードの品質、システムアーキテクチャ、生産性にプラスの影響を与えます。

私の投稿を読んでいただきありがとうございます。コメントセクションでは、フィードバックや考えをいつでも歓迎します。

lazlojuly

関連記事:

  • Node.jsモジュールはシングルトンですか?

出典:

  • モジュールに関するNode.jsドキュメント

ユニットユニットテストに関する私の新しいブログシリーズをチェックしてください:

ユニットテストを開始するにはどうすればよいですか?パート1

私たちの多くは、上記の状況に関係していると思います。

ユニットテストが雑用と見なされる場所。medium.com