Node.jsでモジュールを操作するための基礎

「Hello World」よりも複雑なプロジェクトは、コードを配布する多数のファイルで構成されます。 これにより、プロジェクトを構造化し、他のプロジェクトで使用できる独立したパーツを作成し、一般にコードをより見やすくすることができます。



したがって、Node.jsでは、このような各ファイルは接続可能なモジュールです。

接続は、ファイルパスを渡す必要があるrequire



関数を呼び出すことによって行われます。



  var authModule = require('./auth');
      
      





このコードは認証モジュールを接続し、 authModule



変数を通じてアクセスできるようにします。



require



関数に渡されるパラメーターに応じて、モジュールを接続するためのアルゴリズムは異なります。 それでは、Node.jsでモジュールを接続する原則を見てみましょう。 この情報はすべてドキュメントに記載されています



Node.jsとともに、いくつかの組み込みモジュールが提供されます。これらのモジュールには、モジュール名を指定するだけです。



  var http = require('http'); var cluster = reqiure('cluster');
      
      





名前がrequire



関数に渡される場合、組み込みモジュールは他のすべてのモジュールよりも優先されることに注意してください。 そのため、たとえばrequire('http')



は、その名前のサードパーティモジュールまたはその名前のファイルが存在する場合でも、常に組み込みモジュールを返します。 すべての組み込みモジュールとそれらに関するドキュメントのリストは、 サイトで見つけることができます。 これらのモジュールのソースは、プロジェクトリポジトリで表示できます



モジュールの名前が送信され、組み込みでない場合、モジュールはnode_modules



フォルダーから接続されます。 このフォルダーには、 NPMを使用して追加されるすべてのモジュールがあります。 NPMはNode.jsのパッケージマネージャーで、サードパーティのモジュールを簡単に見つけて接続できます。 この記事の執筆時点では、すでに89 503モジュールが含まれていました。



node_modules



あるモジュールを接続するにはnode_modules



その名前を指定するだけです。



  var express = require('express'); var async = require('async');
      
      





そのようなコードが'/var/www/demo'



フォルダーから呼び出されたときの状況を見てみましょう。Node.jsは、次のフォルダーで指定されたモジュールを見つけようとします。

     / var / www / demo / node_modules
     / var / www / node_modules
     / var / node_modules
     / node_modules


Node.jsは再帰的に、親フォルダーにnode_modules



するnode_modules



に、目的のモジュールを持つnode_modules



フォルダーを探します。 NPMでは、モジュールをグローバルにインストールすることもでき( npm install -g MODULE



)、どこからでも利用できます。



別の接続オプションを検討してください../



関数に渡されたパラメーターが../



、または./



で始まる場合、接続ファイルは絶対パスに沿って、または現在のフォルダーに対して相対的になります。



  var logger = require('../lib/logger'); var profiler = require('/var/lib/profiler');
      
      





まず、チェックされるか、指定された名前と.json



に一致する名前のファイルがあります。そのようなファイルが見つからない場合、Node.jsは、名前に.js



.json



、および.json



異なる拡張子を追加してファイルを接続しようとします。



したがって、 require('./lib/users.js')



require('./lib/users')



同じモジュールに接続するため、拡張子の付いたファイルを指定する必要はありません。



モジュールは非常に大きくなる可能性があるため、モジュールコードをより適切に整理するために、いくつかの部分を個別のファイルに配置する必要がある場合があります。 また、これらのファイルはこのモジュールでのみ使用されるため、他のモジュールの中にある必要はありません。 この問題を解決するために、Node.jsには、すべてのモジュールファイルが配置されるフォルダーとしてモジュールを整理する機能があります。 このようなモジュールを接続するには、このフォルダーのパスをrequire



関数に渡すだけです。



モジュールがあり、そのうちの1つのlogger



がファイルを含むフォルダーとして表示されていると想像してください。

     ┌─auth.js
     ├─user.js
     └─ロガー
         ├─index.js
         ├─console.js
         ├─package.json
         ├─config.js
         └─db.js


logger



モジュールの接続は、このフォルダーへのパスを渡すだけです。



  var require('./logger');
      
      





次に、Node.jsは、どのフォルダーファイルがモジュールのエントリポイントを表すかを判断しようとします。 最初に、 package.json



ファイルがチェックされるか、フォルダーに存在します。このフォルダーには、接続するファイルの名前がmain



フィールドに表示されます。



  { main: "./console.js" }
      
      





この場合、ファイル'./logger/console.js'



がロードされます。 package.json



ファイルがない場合、Node.jsは'./logger/index.js'



または'./logger/index.node'



'./logger/index.js'



うとし'./logger/index.node'







プラグインが完成したら、それらに関連するいくつかの興味深い点を考えてみましょう。 モジュールの接続方法に関係なく、モジュールは接続直後にキャッシュされます。 これは、モジュールが何回接続されても、そのコードは一度だけ実行されることを意味します。



モジュールを呼び出すたびにキャッシュから削除すると、この動作を変更できます。



  delete require.cache[ module ];
      
      





module



は、 module



を接続するrequire



関数をrequire



するために渡したパラメーターです。



したがって、モジュールが接続されるたびに何かを行う必要がある場合は、キャッシュをクリアするか、ジョブを完了するために呼び出す必要がある関数を返す必要があります。



モジュールが見つかった完全なパスを取得するには、 require.resolve



関数を使用できます。



  var modulePath = require.resolve('express');
      
      





この機能は、異なるバージョンのモジュールを複数の場所にインストールしたことがあり、正しいバージョンが接続されていることを確認する必要がある場合に使用できます。 接続するファイルがあるフォルダーに移動し、コマンドラインから操作モードでNode.jsを実行し、目的のモジュールで関数を呼び出す必要があります。 もちろん、この状況は、プロジェクト構造を修正する必要があることを意味し、すべてのプラグインをプロジェクトのルートフォルダーに移動することをお勧めします。



NPMを介してインストールされたモジュールファイルの1つを接続する場合にも、この機能を使用できます。



  var package = require.resolve('express/package.json');
      
      





node_modules



フォルダーが目的のモジュールとともにどこにあるかわからないため、Node.jsがすべての可能なモジュールの場所を通過するという事実を利用できます。



require



関数には、これらすべてに加えて、別の便利なプロパティmain



ます。 コマンドラインから起動されたモジュールを保存します。 したがって、どのモジュールからでも、このモジュールが直接起動されたか、別のモジュールの依存関係として接続されたかを確認できます。



前述のrequire



関数に加えて、モジュールオブジェクトは各module



使用できmodule



。 このオブジェクトの主なタスクは、モジュールがその実行結果を返すことができるようにすることです。 オブジェクト、関数、または文字列(任意のデータ型)にすることができます。



module



オブジェクトにはexports



プロパティがあり、モジュールから返すすべてのものを割り当てる必要があります。 モジュールを接続した結果として返されるのはmodule.exports



です。



  module.exports.createUser = function () { return new User(); }
      
      





このコードでモジュールを接続した後、応答にはこのメソッドを持つオブジェクトが含まれます。



短いバージョンのexports



変数を使用することもできます。これは、基本的にmodule.exports



への単なる参照module.exports







  exports.createUser = function () { return new User(); }
      
      





これはリンクであるため、2つのオプションには1つの重要な違いがあります。 モジュールの結果はmodule.exports



オブジェクトを介してのみ返されるため、 exports



変数に異なる値を割り当てた場合、 module.exports



参照しなくなり、モジュールは何も返しません。



ただし、 module.exports



自体は変更できます。 たとえば、オブジェクトの代わりに、関数を返すことができます。そうすると、モジュールの結果は、何らかの関数形式のメソッドを持つオブジェクトではなく、関数自体になります。



module



を使用module



と、コマンドラインから特定のモジュールが起動されているかどうかを確認することもできます。 これを行うには、 module.parent



プロパティを確認しますmodule.parent



である必要があります。



Node.jsのモジュールを使用するには、この情報で十分だと思います。 Node.jsのすべてのプロジェクトで対処する必要があるため、 NPMに精通することもお勧めします。



All Articles