Этот туториал — альтернатива Вашему первому проекту. Вместо экспорта обычной функции он демонстрирует, как предоставить 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Затем создайте файлы исходников, описанные ниже. Как только проект настроен, проверьте, что всё работает:
npm testbinding.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.