Очень просто Native Addons можно рассматривать как код C / C ++, вызываемый из JavaScript.

Они являются мостом между нашим языком программирования приложений JavaScript и собственной средой, полностью написанной на C / C ++.

Они позволяют нам вызывать функции и методы C / C ++ непосредственно из JavaScript.

Одной из наиболее важных экспериментальных функций, объявленных в Node.js 8, был N-API, который направлен на снижение затрат на обслуживание собственных надстроек Node.js.

Он не зависит от базовой среды выполнения JavaScript (например, V8) и поддерживается как часть самого Node.js.

Этот API будет устойчивым к двоичному интерфейсу приложения (ABI) во всех версиях Node.js. Он предназначен для защиты надстроек от изменений в базовом движке JavaScript и позволяет модулям, скомпилированным для одной версии, работать в более поздних версиях Node.js без перекомпиляции.

Аддоны создаются / упаковываются с использованием того же подхода / инструментов, которые описаны в разделе Аддоны C ++. Единственное отличие - это набор API, которые используются в машинном коде. Вместо использования API V8 или Нативных абстракций для Node.js используются функции, доступные в N-API.

Как вы можете понять из документации N-API, он полностью не зависит от движка JavaScript и гарантирует совместимость API и ABI между разными версиями Node.js. Поэтому, если вы переключитесь на другую версию Node.js, вы не должны переустанавливать и перекомпилировать надстройку.

Я был в восторге от N-API, особенно после того, как я следил за докладом, о котором говорилось выше, на Node Interactive 2017.

N-API - API узла нового поколения для собственных модулей

Я обнаружил, что существует C ++ Wrapper для N-API под названием node-addon-api, поэтому я только начал экспериментировать с его использованием и через 4 или 5 дней своего свободного времени портировал bcrypt в N-API.

Я начал изменять файл package.json, в который добавил нужные зависимости, как указано в документации по установке.

Следующим шагом было изменение файла binding.gyp, который содержит все конфигурации сборки для надстройки bcrypt.

В конце концов, надстройка bcrypt состоит из двух частей: одна написана на C ++, а другая - на JavaScript, и, как обычно, часть JavaScript использует собственный код для раскрытия своих функций. Мне не хотелось менять JavaScript API, предоставляемый bcrypt, поэтому я сосредоточился на части C ++ и изменил код, следуя документации node-addon-api.

Я начал переписывать части, отвечающие за создание кодов, которые будут регистрировать модуль с именем «bcrypt_napi», и, кроме того, он будет гарантировать, что функция init будет вызываться, когда потребуется модуль.

bcrypt предоставляет синхронный и асинхронный API, поэтому метод за методом я завершил рефакторинг, и теперь код выглядит так, как указано ниже.

Последним шагом было выполнение всего набора тестов, и, к моему удовольствию, все тесты прошли успешно и выполнялись быстрее, чем надстройка, созданная с использованием NAN. В ближайшие дни я проведу наиболее эффективные тесты производительности, после чего разверну свое первое приложение Node.js, которое будет использовать эту версию bcrypt, так что следите за обновлениями, я сообщу вам очень скоро.

Для большинства из вас, кто хочет начать писать собственные надстройки для Node.js с использованием N-API, я просто перепубликую несколько полезных ресурсов, которые были мне очень полезны:

Дополнения C ++

Надстройки C ++ N-API

Node Addon API

N-API - следующий API для нативных надстроек

Никола Дель Гоббо