Node.JSはrequire()を永久に取り除きます

過去のプロジェクトのソースコードを分析すると、直接関数呼び出しの人気度は、 require()への直接呼び出しがArray#forEach()ほぼ同じ頻度でノードモジュールコードにあることを示しました。 最も厄介なことは、ほとんどの場合、モジュール"util""fs" 、および"path"を接続することです。これは"url"よりもやや少ない頻度です。 接続されている他のモジュールの存在は、モジュールのタスクに依存します。 さらに、 "util"モジュールといえば、接続したことがない場合でも、ノードプロセスのメモリにロードされます。

Node.JSの以前の記事「 モジュールのオンデマンドダウンロード 」で名前付きリンクに最初にアクセスしたときにモジュールを自動的にロードする可能性について説明しました。 正直に言うと、その記事を書いている時点では、このアプローチがノードプロセスの奇妙な動作を引き起こさないかどうかはわかりませんでした。 しかし、今日、私はdemandLoad()が半年間稼働していることを誇らしげに保証できます。 私たちはただそれを運転しなかったので...これは特定のプロセスの負荷テストであり、クラスターのワーカープロセスでのdemandLoad()の作業と、長時間の小さな負荷でのプロセスの作業です。 demandLoad()demandLoad()を使用して結果を比較しdemandLoad() 。 比較において有意な偏差は観察されませんでした。

今日では、 demandLoad()安定性についてはもう話していません。 誰かが興味を持っている場合は、コメントで質問をし、スクリーンショットを撮り、テスト方法とツール、アプローチを使用する他の可能性について話すことができます。 本日、記事のタイトルからわかるように、各ノードモジュールのヘッダーにある既にrequire()にうんざりしていません。

事前に注意しますが、本番環境で提案された方法を使用するように動揺することはありません。 この慣行は慣れるために提示されており、「真の慣行」であると主張していません。 騒々しい見出しは、単に注目を集めることです。

"mytestsite.com"というプロジェクトに取り組んでおり、ここにあるとします。

 ~/projects/mytestsite.com 

プロジェクトの実行可能ファイルを作成します。たとえば、次の場所にあります。

 ~/projects/mytestsite.com/lib/bin/server.js 

内部では、事前にrequire()せずに接続されたモジュールを呼び出そうとします:

 console.log(util.inspect(url.parse('https://habrahabr.ru/'))); 

ここで、 "require-all.js"ファイルをすべてのプロジェクトの外部のどこかに作成します。
たとえば、ここに:

 ~/projects/general/require-all.js 

ドキュメンテーションによると、各ノードモジュールのすべての定義済み変数と定数はglobalプロパティです。 したがって、グローバルオブジェクトを定義できます。 したがって、使用するすべてのモジュールを使用する必要があります。

require-all.jsすべてのプロジェクトで使用されているすべてのモジュールのリストをrequire-all.jsます。

 //      "util", // ..        "console". //  console.log(),      , //     util.inspect() global.util = require('util'); //      , : demandLoad(global, 'fs', 'fs'); demandLoad(global, 'path', 'path'); demandLoad(global, 'url', 'url'); //      npm-, : demandLoad(global, 'express', 'express'); // , , ,     : demandLoad(global, 'routes', './../mytestsite.com/lib/routes'); //  demandLoad function demandLoad(obj, name, modPath){ //      //       . } 

モジュールのリストを配列またはマップ( Map )の形式で表示し、たとえば、ループでループをdemandLoad()して、 demandLoad()呼び出しでコード行を繰り返さないようにすることができます。 たとえば、使用されているnpmモジュールのリストをpackage.jsonから読み取ることができます。 たとえば、使用するモジュールの数が非常に多く、グローバルスコープを詰まらせたくない場合は、たとえば、空のオブジェクトmlet m = {} )を定義し、 global mを定義できます( global['m'] = m )。 demandLoad() mを適用します。 彼らが言うように、誰にそれがより便利です。

今、この経済を立ち上げるだけです。 --requireを追加して、ノードを起動します(バージョン> = 4.x):

 node --require ~/projects/general/require-all.js \ ~/projects/mytestsite.com/lib/bin/server.js 

エラーはありません。 スクリプトは正常に機能しました。

 Url { protocol: 'https:', slashes: true, auth: null, host: 'habrahabr.ru', port: null, hostname: 'habrahabr.ru', hash: null, search: null, query: null, pathname: '/', path: '/', href: 'https://habrahabr.ru/' } 

多くのプロジェクトがある場合は、プロジェクトの展開の便宜上、各プロジェクト内に独自のrequire-all.jsを個別に作成できます。

 node --require ~/projects/mytestsite.com/lib/require-all.js \ ~/projects/mytestsite.com/lib/bin/server.js 

最後のケースを拡張して、このようなrequire-all.jsを同時に使用することもできます。

 node --require ~/projects/general/require-all.js \ --require ~/projects/mytestsite.com/lib/require-all.js \ ~/projects/mytestsite.com/lib/bin/server.js 

以下コメントに記載されているように、 --require + globalリンクを使用して、標準ノード機能を拡張/オーバーロードすることもできます。

最後に、前回の記事から繰り返します: demandLoad()ファイル(1)( demandLoad()を呼び出すdemandLoad() )ではなく、ファイル(2)で定義されている場合、さらにファイル(1)とファイル(2)が異なる場合ディレクトリの場合、最後のパラメータにはモジュールへのフルパスを渡す必要があります。次に例を示します。

 demandLoad(global, 'routes', path.join(__dirname, './../mytestsite.com/lib/routes')); 

そうでなければ、 demandLoad()から呼び出されるdemandLoad()は、 demandLoad()を呼び出す場所からファイル(1)に関連するモジュールを探す代わりdemandLoad()demandLoad()説明を持つ同じファイル(2 demandLoad()フォルダーに関連するモジュールを検索しますdemandLoad()

ご清聴ありがとうございました。 全員に成功したリファクタリング!

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


All Articles