Node.js 組み込みモジュール
導入
前に述べたように、Node.js の 2 つの最も重要な文は次のとおりです。
- Node.js は、Chrome V8 エンジンに基づく JavaScript ランタイム環境です。
- Node.js はイベント駆動型のノンブロッキング I/O モデルを使用するため、軽量で効率的です。
上の 2 つの文は、以下の図を使用すると詳しく理解できます。
簡単に言うとこの写真
一番左のものは、Chrome V8 エンジンに基づく JavaScript 実行環境で実行されるアプリケーションの JavaScript コードを指します。
この環境で一番右側のノンブロッキング I/O モデルに接続する方法は、中央にある Node.js の組み込みコンピューター システム操作 API (OS Operation) を介してノンブロッキング I/O モデルに接続することです。このモデルに関係する操作 このメソッドはイベント駆動型です。
補足: 上記のプロセス全体のコードまたはデータの流れは、JS コード データから Chrpme V8 コード モジュールに変換され、C++ コード データに変換されます。C++ は、変換されたコマンドをつなぎ合わせてコンピューター システムを操作し、データまたは結果を取得します。操作の結果を Chrome V8 コード モジュールに転送して、必要な JS コード データ形式に変換することで、JS コードを通じてコンピューター システムを操作する動作が実現されます。
Node.jsバインディング
Node.js の組み込み API モジュールである Node.js バインディング パーツを紹介します。このモジュールは、JS とコンピューターの最下層を接続する重要なブリッジであると言えます。
Node.js の組み込み API については、Node.js の公式ドキュメントを参照できますが、ご自身の Node.js のバージョン情報に注意し、対応するバージョンの API 機能を確認する必要があります。
たとえば、Node.js v14.21.2 バージョンに対応する公式ドキュメントのアドレス: https://nodejs.org/docs/latest-v14.x/api/
例として、イベント API のイベント通信クラス EventEmitter を見てみましょう。
単純な EventEmitter
サブクラスをカプセル化し、そのサブクラスでオブザーバー モード (イベントスロー モード) を使用してコンピューター システムを制御し、乱数メッセージを発行します。次に、EventEmitter サブクラスによって作成されたインスタンスを通じて、リスナーの addListener メソッドを呼び出します
。インスタンス配下で、コンピュータから送信された乱数情報を受け取ります。
lib.js ファイルは、EventEmitter サブクラス モジュール ファイルをカプセル化し、ファイル内でインスタンス化し、インスタンスをエクスポートします。
// 引入事件通信类
const EventEmitter = require('events').EventEmitter
// 创建事件通信的子类
class RandomNums extends EventEmitter {
constructor() {
super()
setInterval(() => {
// 通过事件通信的 emit Api 来发射事件 newlesson
this.emit('randomNums', {
randomNums: Math.random() * 100 })
}, 3000)
}
}
// 实例化创建的子类
const randomNums = new RandomNums
// 导出模块
module.exports = randomNums
Index.js は、イベント通信インスタンスの導入、リスナーの追加、発行されたイベント情報の取得を行います。
// 引入模块
const randomNums = require('./lib')
// 为事件通信实例创建监听器,这样才可以获取 emit 发射的事件
// 补充:
// >>> 这种事件通信操作底层来抛出事件的能力,也就是观察者模式(抛事件模式)
// >>> 解决两个对象之间通信的问题的方法:观察者模式(抛事件模式) 和 调用相关函数
// >>> 观察者模式(抛事件模式) 使用情况在于 只需要抛出事件,不管谁去监听
// >>> 调用相关函数 使用情况在于 不清楚有没有通知者的存在,只管去监听就可以
randomNums.addListener('randomNums', (result) => {
// do someting ...
console.log('>>> result ', result)
})
他の Node.js 組み込み API については、ドキュメントに従って対応するデモを作成することもできます。これにより、組み込み API の実用性と重要性を理解しやすくなります。
基礎となるコードを詳細に理解する必要がある場合は、Node.js ソース コードを表示し、node.js API メソッドから中間 Chrome V8 エンジン変換モジュール、C++ 操作モジュールまでの順序に従ってください。
Node.js のソース コードを見つけるには、Node.js 公式 Web サイトでドキュメントの対応するバージョンを直接開き、ドキュメントの左側にある最後のディレクトリまで下にスクロールし、[コード リポジトリと問題トラッカー] オプションを選択して、対応するソースコードリポジトリにジャンプします。
ここでは、Node.js v14.21.2 を例として、表示する必要があるソース コード ウェアハウスのディレクトリの場所を簡単に紹介します。
一番外側のディレクトリには多くのファイルが含まれています。
node.js 組み込み API 関数のファイル パスは ./lib/ ですが、以前のバージョンのパスは ./lib/internal/ 配下にあったため、慎重に検索する必要があります。
このパスの下には、一般的に使用される Node.js 組み込み関数 os、path、http などが見つかります。
ここでは、os.js モジュールのコア コードを簡単に見ていきます。
このモジュールのコードでは、internalBinding('os') メソッドを使用して、Chrome V8 モジュールにカプセル化されたメソッドを呼び出します。その後、これらのメソッドは os.js ファイルにカプセル化されます。V8 モジュールは、基礎となるメソッドをコールバックします。これらの方法で必要な情報はコンピュータに伝達されます。
InternalBinding('os') によって導入された Chrome V8 モジュールにカプセル化されたメソッドは C++ で書かれており、ディレクトリは ./src/ の下にあります。たとえば、os モジュールを導入する場合、対応するファイルは ./src/node_os です。 cc。
このファイルでは、基礎となる C++ データから JS データへの変換が、Chrome V8 エンジンの組み込み C++ メソッドを通じて実現されることがわかります。
Chrome V8 メソッドは、node_os.cc ファイルで定義されています。
これらのメソッドは、Chrome V8 のコンテキストで C++ データから JS データへの変換を処理します。
たとえば、GetCpuInfo は、CPU データを取得し、そのデータを JS 環境で使用可能なデータに変換する C++ メソッドです。
下の図の円内のコードの最初の行は、CPU 情報を取得するための C++ の最下位メソッドです。または、データを取得した後、コードの 2 行目は Chrome V8 の組み込みメソッドを呼び出して、C++ データを JS データに変換します。 。
以上、osモジュールを例にソースコードとソースコードの読み込み方法を簡単に紹介しましたが、他のモジュールについてもこの読み込み方法を参考にしてください。
Node.js 組み込み API を検討する際に、これが皆さんのお役に立てば幸いです。