C++でノードjsアドオンを使用してプロジェクトに取り組んでいます。使用できる2つの抽象ライブラリNANとN-APIに出会いました。ただし、どちらを使用するかを決定できません。これら2つのライブラリの適切な比較を見つけることができませんでした。
両方の長所、短所、違いは何ですか?それらの間で選択する方法?
これまでのところ、NANには非同期呼び出しに関するオンラインチュートリアル/記事が多いことがわかりました。しかし、N-APIは、Node=によって正式にサポートされています(そして、確実ではありませんが、より良い代替手段としてNANの後に作成されました。)
私の理解はこれです:
N-API はv8.0.0のコアnode.jsインターフェースに追加されました。 「基礎となるJavaScriptエンジンの変更からアドオンを隔離することを目的としています...」とドキュメントを引用します。また、バッファーや非同期処理などのラッパーも提供します(これは、 ABI安定性の影響 セクションに記載されている、基礎となる不安定なAPIの一部を回避するのに役立つはずです)。
nan(ノードのネイティブ抽象化) は確かに古いため、node.jsの古いバージョンもサポートしています— node.js 0.8に戻ります!現在、著者が主張しているにもかかわらず 2017年に戻る :
どこかで述べたように、N-APIは直接何かに使用されることを意図していません。この概念はどこから来たのですか?これは、ABIの安定性を提供することを目的とした(実質的に内部の)低レベルのインフラストラクチャ層です。上に別のレイヤーがあります。
…公式のNode.jsアドオンドキュメントには、その影響に対する警告はあまりありません。おそらく この他のコメント はもう少し洞察力があります:
はい、本番用にはNANを使用する必要があります。 Node.jsのすべての関連バージョンをカバーしています。また、N-APIはエンドユーザー向けではないことにも注意してください。最終的には https://github.com/nodejs/node-addon-api を使用する必要があります。
繰り返しになりますが、当時ナンのメンテナーが2017年6月に行っていました。その間、node-addon-apiは成熟し、アクティブなままのようです。実際、私は -addon-apiリポジトリのコメント を見つけました。
…目標の一部は、ナンからの移行を容易にすることでした。
だから私は答えは次のとおりだと思います:
nan
を使用しますnode-addon-api
C++で将来を見越した何かが必要な場合N-API
Cでの作業に不安がなく、起こり得る下位レベルの懸念に対処できる場合新しいネイティブモジュールを開始する場合は、N-API(またはnode-addon-api、これはトップCベースのN-APIのC++ラッパーです)。この記事があなたがこれを明確にするのを助け、またあなたにジャンプスタートを与えることを願っています。
https://github.com/msatyan/MyNodeC
新しいC++コード(またはCコードのN-API)には node-addon-API モジュールを使用する必要があります。 Node.jsのすべてのサポートされている(非EOL)バージョンはそれをサポートし、ネイティブアドオンの維持と配布をより簡単にします。 NODE_MODULE_VERSION
(Node.jsのメジャーバージョン)ごとにモジュールを再構築する必要があります。N-API/ Node-Addon-APIを使用するモジュールは前方互換です。
N-APIの特定のバージョンnは、それが公開されたNode.jsのメジャーバージョン、および後続のメジャーを含むNode.jsのすべての以降のバージョンで利用可能になりますバージョン。
ややわかりにくい 互換性マトリックス があります。 N-APIバージョン3は、たとえば、Node.js v8.11.2 +、v9.11.0 +、およびそれ以降のすべてのメジャーバージョン(v10 +)と互換性があります。
その上、node-addon-APIはNANの多くの迷惑な部分を修正します(たとえば、バッファーはchar*
ではなく、常にuint8_t*
になります)。
もちろん、NANは引き続き機能し、オンラインにはより多くの学習リソースがありますが、node-addon-APIが先の方法です。