Модуль, скомпилированный для другого NODE_MODULE_VERSION при разработке расширения для vscode

Я пытаюсь использовать пакет узла tree-sitter в своем расширении vscode, но получаю следующую ошибку:

Activating extension 'extension name' failed: The module '.../node_modules/tree-sitter/build/Release/tree_sitter_runtime_binding.node' was compiled against a different Node.js version using NODE_MODULE_VERSION 93. This version of Node.js requires NODE_MODULE_VERSION 89. Please try re-compiling or re-installing the module (for instance, using npm rebuild or npm install)..

Насколько я понимаю, NODE_MODULE_VERSION — это версия ABI узла. Однако я даже не смог найти выпуск узла с NODE_MODULE_VERSION 89 в файле Официальный сайт.

Что я пробовал:

  • Удаление папки node_modules и переустановка пакетов.
  • Запуск npm rebuild tree-sitter --update-binary из верхнего каталога.
  • Пересборка пакета tree-sitter с помощью node-gyp rebuild и node-gyp rebuild --target=(my node version) из каталога node_modules/tree-sitter.
  • Переключение версий узлов с помощью nvm.

Ничего из этого не помогло. Из здесь я понял, что изменение версии узла не поможет, как я подтвердил, когда пытался

console.info(process.version); // v14.16.0

console.info(process.versions.modules); // 89

Это дало один и тот же результат независимо от того, какую версию узла я использовал. Я также пытался пересобрать пакет tree-sitter, используя эту версию узла node-gyp rebuild --target=14.16.0, но получаю ту же ошибку, однако на этот раз он говорит, что модуль был скомпилирован с использованием NODE_MODULE_VERSION 83, что согласуется с тем, что написано на сайте узла.

Как устранить эту ошибку? Любая помощь приветствуется.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
48
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как я и подозревал, версия ABI узла, используемая расширениями vscode, — это версия ABI, используемая внутренним электроном vscode. Согласно этому источнику

Native Node.js modules are supported by Electron, but since Electron has a different application binary interface (ABI) from a given Node.js binary (due to differences such as using Chromium's BoringSSL instead of OpenSSL), the native modules you use will need to be recompiled for Electron...

Это объясняет, почему я не смог найти NODE_MODULE_VERSION 89 на сайте узла.

Затем я проверил, какую версию электрона использует моя сборка vscode. Для этого я просто проверил package.json, который шел с vscode (/usr/lib/code/package.json в linux, я думаю, что он находится внутри папки, в которой vscode установлен на windows).

Далее, следуя инструкциям с сайта электрона, пересоберите модуль с помощью пакета electron-rebuild. Чтобы указать целевую версию, просто запустите

./node_modules/.bin/electron-rebuild -v [version]

Однако у меня нет источника для этого, но кажется, что tree-sitter в настоящее время не поддерживает более новые версии электрона, поэтому сборка завершается ошибкой. Похоже, это связано с изменением API V8 (согласно этому).

Автор связал свое решение здесь. Я скопировал его изменения, и сборка прошла успешно.

Обратите внимание, что мне пришлось заменить существующий аддон узла новым.

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