На этой странице

Этот туториал — альтернатива Вашему первому проекту. Вместо экспорта обычной функции он демонстрирует, как предоставить C++-объект как JavaScript-объект с помощью класса ObjectWrap из node-addon-api.

Прежде чем начать, убедитесь, что у вас установлены все необходимые пре-реквизиты и инструменты, и прочитайте Анатомию Node-API-проекта, чтобы понять общую структуру проекта и файлы конфигурации.

Скопируйте пример Object Wrap из репозитория node-addon-examples:

git clone https://github.com/nodejs/node-addon-examples.git
cp -r node-addon-examples/src/2-js-to-native-conversion/object-wrap-demo/node-addon-api object-wrap-demo
cd object-wrap-demo
npm install

Как вариант, настройте проект вручную:

mkdir object-wrap-demo
cd object-wrap-demo
npm init -y
npm install node-addon-api

Затем создайте файлы исходников, описанные ниже. Как только проект настроен, проверьте, что всё работает:

binding.gyp проекта следует стандартному формату (полное объяснение формата binding.gyp и того, как node-gyp его использует, см. в Анатомии Node-API-проекта).

object_wrap_demo.h и object_wrap_demo.cc — сердце проекта. Заголовок napi.h приходит из node-addon-api и объявляет C++-классы, представляющие значения JavaScript.

object_wrap_demo.cc определяет C++-класс ObjectWrapDemo:

  • Конструктор принимает одну JavaScript-строку и сохраняет её в приватном члене _greeterName.
  • Метод Greet принимает JavaScript-строку, печатает две строки в stdout и возвращает значение, изначально переданное конструктору.
  • Статический метод GetClass возвращает дескриптор класса, который нужен Node-API, чтобы знать, как диспетчеризировать вызовы из JavaScript в C++-методы.

Функция Init экспортирует класс ObjectWrapDemo, вызывая ObjectWrapDemo::GetClass. Макрос NODE_API_MODULE внизу гарантирует, что Init вызывается при загрузке модуля.

binding.js определяет класс ObjectWrapDemo, оборачивающий нативный бинарник. Когда вызывается new ObjectWrapDemo(value), он создаёт нижележащий C++-объект и сохраняет его как _addonInstance. JavaScript-метод greet делегирует одноимённому методу C++-объекта.

test_binding.js показывает, как использовать JavaScript-класс ObjectWrapDemo из lib/binding.js. Обратите внимание, что вызов greet производит две строки вывода в stdout как побочный эффект вызовов printf в C++-коде.

Этот проект показывает, как использовать ObjectWrap, чтобы предоставить C++-объект с состоянием как JavaScript-объект. Вот что можно попробовать дальше:

  • Запустите test_binding.js в отладчике. Пройдитесь по коду пошагово и понаблюдайте, как выглядит JavaScript-объект с точки зрения отладчика.
  • Измените test_binding.js, чтобы подключать скомпилированный бинарник напрямую, а не через binding.js, и понаблюдайте разницу в отладчике.
  • Расширьте object_wrap_demo.cc, чтобы экспортировать дополнительные методы или свойства класса ObjectWrapDemo.