Понимание инструментов для написания собственного дополнения Node.js - PullRequest
0 голосов
/ 08 января 2019

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

  1. Есть ли предпочтительный метод между N-API и Node FFI? Я думаю, у обоих есть свои плюсы и минусы, каковы они?
  2. Требуется ли компилировать код C с использованием node-gyp? Как мне поступить, если у меня уже есть библиотека, доступная, но не скомпилированная с node-gyp (например, .dylib), и я хочу использовать ее в своем приложении Node?

1 Ответ

0 голосов
/ 08 января 2019

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

...