Понимание инструментов для написания собственного дополнения Node.js

Мне нужно создать собственный аддон Node.js из некоторого существующего кода C, и я вижу, что есть несколько способов сделать это: с помощью нового N-API (или более простого C++ API собственного аддона) или с помощью Node FFI. Кроме того, я не знаком с такими инструментами, как node-gypи у меня есть несколько вопросов, которые помогут понять, как я могу интегрировать код C в свое приложение Node:

  1. Есть ли предпочтительный метод между N-API и Node FFI? Я думаю, у обоих есть свои плюсы и минусы, каковы они?
  2. Требуется ли компилировать код 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 поскольку местоположение файла было трудно завоевано. Так что, если вы планируете распространять библиотеку, это обеспечивает преимущество при ее загрузке, когда она не установлена ​​в системный каталог.

Другие вопросы по тегам