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
から読み取ることができます。 たとえば、使用するモジュールの数が非常に多く、グローバルスコープを詰まらせたくない場合は、たとえば、空のオブジェクト
m
(
let 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()
ご清聴ありがとうございました。 全員に成功したリファクタリング!