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に精通することもお勧めします。

Source: https://habr.com/ru/post/J233827/


All Articles