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
, поскольку местоположение файла было трудно завоевано. Поэтому, если вы планируете распространять библиотеку, это обеспечит загрузку ее, если она не установлена в системном каталоге.