Node.jsのネイティブ拡張の開発

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







Node.jsのネイティブ拡張の開発の基本



簡単に言うと、Node.jsのネイティブ拡張について話す場合、JavaScriptコードから呼び出すことができるC ++で実装された何らかのロジックを表すことに注意できます。 Node.jsの機能を明確にし、このプラットフォームのコンポーネントを検討する価値があります。 Node.jsのコンテキストでは、JavaScriptとC ++の2つの言語について話せることを知っておくことが重要です。 これはすべて次のように説明できます。





このスキームのネイティブ拡張はどこにありますか? これは、ディスクを操作するための操作の例として考えてください。 ディスクサブシステムへのアクセスは、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つの重要な部分があり、本文の一番下から始めます。





次に、ネイティブ拡張の構成を含む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のネイティブ拡張の開発に関する有用な資料のリストを以下に示します。





まとめ



この資料の著者は、Node.jsのネイティブ拡張の開発を研究することで、このプラットフォームの構造とその機能の特徴をよりよく理解できると述べています。 このような拡張機能が役立つシナリオは数多くあります。 その中には、高性能アプリケーションの作成、Node.jsプロジェクトとC / C ++ライブラリの統合、またはそのようなプロジェクトでの古いコードの使用があります。 さらに、ネイティブ拡張の開発は、Node.jsの内部メカニズムについて学ぶための優れた方法です。



親愛なる読者! プロジェクトでNode.jsのネイティブ拡張を使用していますか?






All Articles