この記事では、Node.jsのネイティブ拡張を開発するための最も重要な概念について説明します。 特に、ここでは、このような拡張機能を作成する実用的な例を検討します。これは、この分野での最初のプロジェクトになる可能性が非常に高くなります。

Node.jsのネイティブ拡張の開発の基本
簡単に言うと、Node.jsのネイティブ拡張について話す場合、JavaScriptコードから呼び出すことができるC ++で実装された何らかのロジックを表すことに注意できます。 Node.jsの機能を明確にし、このプラットフォームのコンポーネントを検討する価値があります。 Node.jsのコンテキストでは、JavaScriptとC ++の2つの言語について話せることを知っておくことが重要です。 これはすべて次のように説明できます。
- JavaScriptは、プロジェクトがNode.jsで記述されるプログラミング言語です。
- V8はJSコードの実行に忙しいエンジンです。
- Libuvは、非同期コード実行を実装するCで書かれたライブラリです。
このスキームのネイティブ拡張はどこにありますか? これは、ディスクを操作するための操作の例として考えてください。 ディスクサブシステムへのアクセスは、JavaScriptまたはV8の機能ではありません。 Libuvは非同期コード実行を可能にします。 ただし、Node.jsを使用すると、データをディスクに書き込んで読み取ることができます。 これは、ネイティブ拡張が助けになる場所です。
fs
モジュールはC ++を使用して実装され(ディスクにアクセスできます)、JavaScriptから
readFile
ことができる
writeFile
や
readFile
などの
writeFile
を
readFile
します。
JSコードからのネイティブ拡張との相互作用このメカニズムを理解すると、ネイティブ拡張を開発する際の最初の手順を実行できます。 しかし、プログラミングに入る前に、ツールについて話しましょう。
基本的なツール
indFinding.gypファイル
このファイルを使用すると、ネイティブ拡張のコンパイルオプションを構成できます。 決定する必要がある最も重要なポイントの1つは、コンパイルするファイルと、完成したライブラリを呼び出す方法です。 このファイルの構造はJSONを連想させ、コンパイルのターゲット(ソース)とソース(ソース)の設定が含まれています。
▍Node-gypツール
node-gypツールは 、ネイティブ拡張をコンパイルするように設計されています。 Node.jsに基づいて実装され、npmで利用できます。これにより、適切なコマンドで拡張機能をコンパイルできます。 このコマンドに応答して、システムはルートディレクトリにある
binging.gyp
ファイルを検出し、拡張機能のコンパイルを開始します。
さらに、
node-gyp
では、デフォルトでリリースビルドまたはデバッグ用ビルドをビルドできます。 その結果、設定に応じて、コンパイル後、拡張子が
.node
バイナリファイルが
release
または
debug
.node
作成され
.node
。
▍Node-bindingsツール
node-bindingsパッケージを使用すると、ネイティブ拡張をエクスポートできます。 彼は、
build
または
release
フォルダーで適切なファイルを見つける責任があります。
▍APIn-api
N-apiはCツールによって作成されたAPIであり、基になるランタイムに依存しない抽象的な方法でエンジンと対話できます。 私たちの意見では、このアプローチはプラットフォームの開発の結果であり、その間にNode.jsをさまざまなアーキテクチャに移植する努力がなされました。
N-apiは、Node.jsのさまざまなバージョンで作業するときに安定性と互換性を提供します。 したがって、Node 8.1用にネイティブ拡張がコンパイルされている場合、Node 8.6または9.3用に再度コンパイルする必要はありません。 これにより、拡張機能のサポートや開発への参加に関わる人々の生活が楽になります。
現在、n-apiは
実験的な状態です。
▍Node-addon-apiツール
node-addon-apiモジュール
は 、開発者C ++(この言語の機能を使用できるようにするn-api実装)が自由に使用できるようにします。
ネイティブ拡張の世界の最初のステップ
この例では、Node 9.3プラットフォームが使用されていることに注意してください。
ネイティブ拡張の開発を開始するために、古典的なHello Worldアプリケーションを作成します。 このアプリケーションのアイデアにより、追加のロジックでオーバーロードされていないかなり単純なコードを使用して実装することができます。これにより、主要な構造に焦点を当て、最小限の必要なコードを検討できます。
npmの初期化から始めましょう。これにより、依存関係をインストールできます。
npm init
次に、依存関係をインストールします。
npm i node-addon-api bindings
この段階で、拡張ロジックを含むC ++ファイルを作成する必要があります。
#include <napi.h> Napi::String SayHi(const Napi::CallbackInfo& info) { Napi::Env env = info.Env(); return Napi::String::New(env, "Hi!"); } Napi::Object init(Napi::Env env, Napi::Object exports) { exports.Set(Napi::String::New(env, "sayHi"), Napi::Function::New(env, SayHi)); return exports; }; NODE_API_MODULE(hello_world, init);
このファイルには3つの重要な部分があり、本文の一番下から始めます。
NODE_API_MODULE
最初の引数はネイティブ拡張の名前で、2番目はこの拡張を初期化する関数の名前です。init
。 これは、拡張機能の初期化を担当する関数です。 ここで、JSコードから呼び出される関数をエクスポートする必要があります。 これを行うには、 exports
オブジェクトに関数の名前を記述し、呼び出される関数自体を指定する必要があります。 init
関数は、 exports
オブジェクトを返す必要があります。sayHi
。 この関数は、ネイティブ拡張がJavaScriptから呼び出されたときに実行されます。
次に、ネイティブ拡張の構成を含む
binding.gyp
ファイルを作成します。
{ "targets": [ { "cflags!": [ "-fno-exceptions" ], "cflags_cc!": [ "-fno-exceptions" ], "include_dirs" : [ "<!@(node -p \"require('node-addon-api').include\")" ], "target_name": "hello_world", "sources": [ "hello_world.cc" ], 'defines': [ 'NAPI_DISABLE_CPP_EXCEPTIONS' ] } ] }
そして、拡張機能が接続されて動作するJavaScriptコードを次に示します。
const hello_world = require('bindings')('hello_world') console.log(hello_world.sayHi());
あとは、拡張機能をコンパイルしてJSファイルを実行するだけです。 外観は次のとおりです。
ネイティブ拡張のコンパイルと使用Node.jsのネイティブ拡張の歴史と有用な資料
この問題を研究することで、大量の有用なドキュメントを探索し、多くの例を発見できるため、ネイティブ拡張の歴史について話すことは有益であると信じています。 N-APIがナンに置き換わりました。 この略語は
、Node.jsのネイティブアブストラクションを表しています
。 NanはC ++ライブラリであり、n-apiほど柔軟ではありません。 抽象形式では、V8で動作できますが、V8のリリースに関連付けられています。 その結果、Node.jsの新しいリリースには、ネイティブ拡張を混乱させる可能性があるV8の変更が含まれる場合があります。 この問題の解決策は、n-apiが表示される理由の1つです。
nanの存在を知ることで、関連する例とドキュメントを調べることができます。 これはすべて、Node.jsのネイティブ拡張の開発を検討している人にとって有用な知識源となります。
Nodeのネイティブ拡張の開発に関する有用な資料のリストを以下に示します。
- n-api の使用例 。
- node-addon-apiの使用例。
- nan の使用例 。
- テスト 、貴重な知識源。
- Node.jsのネイティブ拡張リソース 。
まとめ
この資料の著者は、Node.jsのネイティブ拡張の開発を研究することで、このプラットフォームの構造とその機能の特徴をよりよく理解できると述べています。 このような拡張機能が役立つシナリオは数多くあります。 その中には、高性能アプリケーションの作成、Node.jsプロジェクトとC / C ++ライブラリの統合、またはそのようなプロジェクトでの古いコードの使用があります。 さらに、ネイティブ拡張の開発は、Node.jsの内部メカニズムについて学ぶための優れた方法です。
親愛なる読者! プロジェクトでNode.jsのネイティブ拡張を使用していますか?
