ホームページ  >  記事  >  ウェブフロントエンド  >  Node.js では require() はどのように機能しますか?動作原理の紹介

Node.js では require() はどのように機能しますか?動作原理の紹介

青灯夜游
青灯夜游転載
2020-11-20 17:57:379220ブラウズ

Node.js では require() はどのように機能しますか?動作原理の紹介

関連する推奨事項: 「nodejs チュートリアル

Node.js の require() 関数が何をするのかはほとんどの人が知っていますが、その方法は次のとおりです。仕組みを知っている人は多いでしょうか?私たちはこれをライブラリパッケージやモジュールをロードするために毎日使用していますが、その内部動作は謎に満ちています。

私たちは Node モジュール システムの中核である module.js を追求しています。このファイルには驚くべき魔法の関数が含まれています。使用される各ファイルのロード、コンパイル、キャッシュを担当します。その謎を明らかにしましょう。

function Module(id, parent) { 
  this.id = id; 
  this.exports = {}; 
  this.parent = parent; 
  // ...

このモジュール タイプは module.js にあり、2 つの主な役割を果たします。まず、すべての Node.js モジュールがファイルから読み込まれるときにインスタンスを構築するための基本機能を提供します。ファイルの実行時の永続性。そのため、いくつかのプロパティを module.exports に追加し、必要に応じてそれらを返すことができます。

モジュールの 2 番目のことは、Node モジュールのロード メカニズムを処理することです。標準の require 関数は、実際には module.require の抽象化に基づいています。後者は、Module._load の単純なラッパーにすぎません。メソッドは、ファイルの実際のロードをそれぞれ処理します。次のコードを見てください:

Module._load = function(request, parent, isMain) { 
  // 1.在Module._cache中检查模块是否被缓存
  // 2.如果缓存中为空,创建一个新的模块实例。
  // 3. 保存到缓存
  // 4. 使用指定的名称调用module.load() 
  //    在读取了文件内容后将调用module.compile() 
  // 5.如果加载和分析文件时有错误
  //    从缓存中删除坏的模块
  // 6. 返回 module.exports 
};

Module._load は、新しいモジュールのロードとモジュール キャッシュの管理を担当します。各モジュールをキャッシュすると、ファイル読み取りの頻度が減り、パフォーマンスが向上します。共有モジュール インスタンスにより、サンプルモジュールのような複数のアプリケーションにわたる単一の状態保存のようなものです。

モジュールがキャッシュに存在しない場合、Module._load はファイルを読み取り、新しいファイルを作成します。ファイルの内容が正常に読み取られた後、module._compile が呼び出されます。

ステップ 1 の上の 6 番目のステップに注目してください。 module.exports が返されることがわかります。パブリック インターフェイスを定義するときに、exports と module.exports を使用できるのはこのためです。これらは実際に Model._load によって返され、必要なためです。 。

module._compile:

Module.prototype._compile = function(content, filename) { 
  // 1. 创建调用模块需要的require标准函数
  // 2.将其他帮助方法加入require. 
  // 3.包装JS代码到一个函数,这个函数提供我们的require
  //  模块, 比如变量本地化到模块的作用域
  // 4.返回这个函数
};

を見てみましょう。ここで魔法が起こります。まず、特別な標準の require 関数が作成されます。これは、私たちがよく知っている require() 関数です。関数自体が Wrapping Module.require の場合、次のような、ほとんどの人が知らないいくつかのヘルパー プロパティとメソッドも含まれています。

  • #require(): 外部モジュールの読み込み

  • require.resolve(): 絶対パスに従ってモジュール名を解決します

  • require.main: メイン モジュール

  • require.cache: すべてのキャッシュ モジュール

  • require.extensions: コンパイルされたメソッドで使用できるファイルベースの拡張子。

require の準備が完了すると、ソース コード全体が新しい関数にラップされます。この関数は、require モジュールとエクスポートおよびその他の公開変数をパラメータとして受け取ります。これにより、次の新しい関数が作成されます。 module. スコープを変更して、残りの Node.js 環境を汚染しないようにします。

(function (exports, require, module, __filename, __dirname) { 
  // YOUR CODE INJECTED HERE! 你的代码在这里
});

最後に、モジュールをラップする関数が実行され、Module._compile メソッド全体が同期的に実行されるため、Module._load メソッドへの元の呼び出しは、このコードが実行されるまで待機します。完了して module.exports に戻ります。

これで、require('module') がモジュール システムを通じて定義したモジュールを読み込む方法はすでにわかりました。module.js ソース コードには、さらに多くのコード原則が含まれています。興味があれば、さらに詳しく知ることができます。

プログラミング関連の知識について詳しくは、プログラミング教育をご覧ください。 !

以上がNode.js では require() はどのように機能しますか?動作原理の紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjdon.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。