web-dev-qa-db-fra.com

Node Addons JS - NAN vs N-API?

Je cherche à travailler sur un projet utilisant des addons de nœud js avec C++. Je suis tombé sur deux bibliothèques abstraites NAN et N-API que je peux utiliser. Cependant, je ne peux pas décider lequel utiliser. Je n'ai pas pu trouver de comparaison appropriée entre ces deux bibliothèques.

Quels sont les avantages, les inconvénients et les différences des deux? Comment choisir entre eux?

Jusqu'à présent, j'ai constaté que NAN a plus de tutoriels/articles en ligne concernant les appels asynchrones. Mais N-API est officiellement pris en charge par Node (et a été créé après NAN comme une meilleure alternative, mais pas sûr).

16
The Prenx

Ma compréhension est la suivante:

N-API a été ajouté à l'interface core node.js dans la v8.0.0. "Il est destiné à isoler les Addons des modifications du moteur JavaScript sous-jacent ..." pour citer la documentation. Il fournit également d'autres wrappers autour de choses comme les tampons et le travail asynchrone (ce qui devrait aider à éviter certaines des API non stables sous-jacentes notées dans leur Implications de la stabilité ABI section).

nan (Native Abstractions for Node) est en effet plus ancien et prend donc également en charge les anciennes versions de node.js - retour à node.js 0.8! Maintenant, malgré son auteur affirmant en 2017 :

Comme je l'ai mentionné ailleurs, la N-API n'est pas destinée à être utilisée directement pour quoi que ce soit. D'où vient cette notion? Il s'agit d'une couche d'infrastructure de bas niveau (effectivement interne) destinée à offrir la stabilité ABI. Il y aura une autre couche sur le dessus.

… Je ne vois pas beaucoup d'avertissement à cet effet dans la documentation officielle du module complémentaire Node.js. cet autre commentaire est peut-être un peu plus perspicace:

Oui, vous devez toujours utiliser NAN pour une utilisation en production. Il couvre toutes les versions pertinentes de Node.js. Notez également que N-API n'est pas destiné aux utilisateurs finaux. Vous devriez éventuellement utiliser https://github.com/nodejs/node-addon-api .

Encore une fois, c'était en juin 2017 par le mainteneur de nan à l'époque. Il semble que le nœud-addon-api ait mûri entre-temps et reste actif. En fait, j'ai trouvé n commentaire dans le repo -addon-api qui n'a qu'un mois à l'heure actuelle:

… Une partie de l'objectif était de faciliter la transition du nan.

Je pense donc que la réponse est:

  • utilisez nan si vous voulez quelque chose de mature et de très rétrocompatible
  • utilisation node-addon-api si vous voulez quelque chose d'avant-garde en C++
  • utilisation N-API si vous êtes à l'aise de travailler en C et de faire face à d'éventuelles préoccupations de niveau inférieur
15
natevw

Si vous démarrez un nouveau module natif, vous pouvez envisager N-API (ou node-addon-api , qui est un wrapper C++ sur la N-API basée sur C). J'espère que cet article vous aidera à clarifier ce point et vous donnera également un bon départ.
https://github.com/msatyan/MyNodeC

4
Satyan

Vous devez utiliser le module node-addon-API pour le nouveau code C++ (ou N-API pour le code C). Toutes les versions prises en charge (non-EOL) de Node.js le prennent en charge, ce qui facilite la maintenance et la distribution des modules complémentaires natifs : alors que les modules complémentaires utilisant NAN nécessite de reconstruire le module pour chaque NODE_MODULE_VERSION (version majeure de Node.js), les modules utilisant N-API/Node-Addon-API sont à compatibilité ascendante:

Une version donnée n de N-API sera disponible dans la version principale de Node.js dans laquelle elle a été publiée, et dans toutes les versions ultérieures de Node.js, y compris les versions majeures suivantes.

Il y a un peu déroutant matrice de compatibilité ici . La N-API version 3 est compatible avec Node.js v8.11.2 +, v9.11.0 + et toutes les versions majeures ultérieures (v10 +), par exemple.

En plus de cela, node-addon-API corrige beaucoup de parties ennuyeuses de NAN (comme les tampons étant toujours char* au lieu de, dites uint8_t*).


NAN fonctionne toujours bien sûr, et il y a plus de ressources d'apprentissage en ligne, mais l'API add-node est la voie à suivre.

0
ZachB