2-Node.js 組み込みモジュール

Node.js 組み込みモジュール

導入

前に述べたように、Node.js の 2 つの最も重要な文は次のとおりです。

  • Node.js は、Chrome V8 エンジンに基づく JavaScript ランタイム環境です。
  • Node.js はイベント駆動型のノンブロッキング I/O モデルを使用するため、軽量で効率的です。

上の 2 つの文は、以下の図を使用すると詳しく理解できます。

画像.png

簡単に言うとこの写真

一番左のものは、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 を例として、表示する必要があるソース コード ウェアハウスのディレクトリの場所を簡単に紹介します。
一番外側のディレクトリには多くのファイルが含まれています。

画像.png

node.js 組み込み API 関数のファイル パスは ./lib/ ですが、以前のバージョンのパスは ./lib/internal/ 配下にあったため、慎重に検索する必要があります。
このパスの下には、一般的に使用される Node.js 組み込み関数 os、path、http などが見つかります。
画像.png

ここでは、os.js モジュールのコア コードを簡単に見ていきます。

このモジュールのコードでは、internalBinding('os') メソッドを使用して、Chrome V8 モジュールにカプセル化されたメソッドを呼び出します。その後、これらのメソッドは os.js ファイルにカプセル化されます。V8 モジュールは、基礎となるメソッドをコールバックします。これらの方法で必要な情報はコンピュータに伝達されます。

画像.png

InternalBinding('os') によって導入された Chrome V8 モジュールにカプセル化されたメソッドは C++ で書かれており、ディレクトリは ./src/ の下にあります。たとえば、os モジュールを導入する場合、対応するファイルは ./src/node_os です。 cc。

画像.png
このファイルでは、基礎となる C++ データから JS データへの変換が、Chrome V8 エンジンの組み込み C++ メソッドを通じて実現されることがわかります。
Chrome V8 メソッドは、node_os.cc ファイルで定義されています。

画像.png

これらのメソッドは、Chrome V8 のコンテキストで C++ データから JS データへの変換を処理します。

画像.png

たとえば、GetCpuInfo は、CPU データを取得し、そのデータを JS 環境で使用可能なデータに変換する C++ メソッドです。
下の図の円内のコードの最初の行は、CPU 情報を取得するための C++ の最下位メソッドです。または、データを取得した後、コードの 2 行目は Chrome V8 の組み込みメソッドを呼び出して、C++ データを JS データに変換します。 。

画像.png

以上、osモジュールを例にソースコードとソースコードの読み込み方法を簡単に紹介しましたが、他のモジュールについてもこの読み込み方法を参考にしてください。

Node.js 組み込み API を検討する際に、これが皆さんのお役に立てば幸いです。

おすすめ

転載: blog.csdn.net/qq_44886882/article/details/128728818