webdevqa.jp.net

Node JSアドオン-NAN vs N-API?

C++でノードjsアドオンを使用してプロジェクトに取り組んでいます。使用できる2つの抽象ライブラリNANとN-APIに出会いました。ただし、どちらを使用するかを決定できません。これら2つのライブラリの適切な比較を見つけることができませんでした。

両方の長所、短所、違いは何ですか?それらの間で選択する方法?

これまでのところ、NANには非同期呼び出しに関するオンラインチュートリアル/記事が多いことがわかりました。しかし、N-APIは、Node=によって正式にサポートされています(そして、確実ではありませんが、より良い代替手段としてNANの後に作成されました。)

16
The Prenx

私の理解はこれです:

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での作業に不安がなく、起こり得る下位レベルの懸念に対処できる場合
15
natevw

新しいネイティブモジュールを開始する場合は、N-API(またはnode-addon-api、これはトップCベースのN-APIのC++ラッパーです)。この記事があなたがこれを明確にするのを助け、またあなたにジャンプスタートを与えることを願っています。
https://github.com/msatyan/MyNodeC

4
Satyan

新しい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が先の方法です。

0
ZachB