Понимание инструментов для написания собственного дополнения Node.js
Мне нужно создать собственный аддон Node.js из некоторого существующего кода C, и я вижу, что есть несколько способов сделать это: с помощью нового N-API (или более простого C++ API собственного аддона) или с помощью Node FFI. Кроме того, я не знаком с такими инструментами, как node-gyp
и у меня есть несколько вопросов, которые помогут понять, как я могу интегрировать код C в свое приложение Node:
- Есть ли предпочтительный метод между N-API и Node FFI? Я думаю, у обоих есть свои плюсы и минусы, каковы они?
- Требуется ли компилировать код C с помощью
node-gyp
? Как мне поступить, если у меня уже есть библиотека, но она не скомпилирована?node-gyp
(например..dylib
) и я хочу использовать его в моем приложении Node?
1 ответ
1 - N-API, на мой взгляд, предпочтительный метод. Это быстрее, чем Node FFI и является частью основного узла распределения. Основное преимущество Node FFI (из моего быстрого прочтения; я не использовал его) заключается в том, что он позволяет совершать вызовы без написания кода на c/ C++. Независимо от того, используете ли вы N-API или собственный аддонный API C++, вам больше по вкусу. API C++ удаляет некоторые повторяющиеся коды, требуемые N-API. Но если вы не используете C++ для начала, это, вероятно, не очень хорошая причина для изменений.
2 - вам не нужно компилировать внешние библиотеки. Просто поместите их в binding.gyp
раздел библиотеки файла следующим образом:
{
'targets': [{
'target_name': 'addon-name',
'cflags!': [ '-fno-exceptions' ],
'cflags_cc!': [ '-fno-exceptions' ],
'xcode_settings': { 'GCC_ENABLE_CPP_EXCEPTIONS': 'YES',
'CLANG_CXX_LIBRARY': 'libc++',
'MACOSX_DEPLOYMENT_TARGET': '10.7',
},
'msvs_settings': {
'VCCLCompilerTool': { 'ExceptionHandling': 1 },
},
'include_dirs': [
'<!@(node -p "require(\'node-addon-api\').include")',
],
'sources': [
'src/addon-name.cc'
],
'conditions': [
['OS in "linux"', {
'include_dirs': [
'<!@(node -p "require(\'node-addon-api\').include")',
'<(module_root_dir)/'
],
'libraries': [
'-ldylib',
'-L<(module_root_dir)/dylib/',
'-Wl,-rpath-link,<(module_root_dir)/dylib/',
'-Wl,-rpath,\$$ORIGIN/../../dylib/'
],
}]
]
}]
}
Большая часть шаблона для bindings.gyp
был сгенерирован инструментом преобразования, который является частью пакета node-addon-api. Я включил свой собственный раздел библиотек, потому что я распространяю библиотеку со своим пакетом и выясняю, как встраивать $ORIGIN
поскольку местоположение файла было трудно завоевано. Так что, если вы планируете распространять библиотеку, это обеспечивает преимущество при ее загрузке, когда она не установлена в системный каталог.