Как работают основные модули в node.js? (https://github.com/nodejs/node/blob/master/lib) - PullRequest
0 голосов
/ 27 мая 2019

Ищет ли интерпретатор узла базовые модули (скажем, "fs") в двоичном файле узла?Если да, упакованы ли эти модули как файлы js.Преобразуются ли основные модули, на которые есть ссылки в нашем коде, в код на языке c / c ++, а затем выполняются?Например, я вижу метод в файле _tls_common.js (https://github.com/nodejs/node/blob/master/lib/_tls_common.js) с именем «loadPKCS12», и единственное место, где я вижу этот метод, на который ссылаются / определяют, находится в файле «node_crypto.cc» (https://github.com/nodejs/node/blob/master/src/node_crypto.cc). Так как же узел связывает метод в javascript с методом, определенным в файле c / c ++?

Вот выдержка из файла _tls_common.js, который использует метод «loadPKCS12»:

 if (passphrase) {
      c.context.loadPKCS12(buf, toBuf(passphrase));
    } else {
      c.context.loadPKCS12(buf);
    }
  }
} else {
  const buf = toBuf(options.pfx);
  const passphrase = options.passphrase;
  if (passphrase) {
    c.context.loadPKCS12(buf, toBuf(passphrase));
  } else {
    c.context.loadPKCS12(buf);

1 Ответ

1 голос
/ 27 мая 2019

Здесь задаются два разных (но, казалось бы, связанных) вопроса. Первый из них: «Как работают основные модули?». Второй: «Как NodeJS позволяет ссылаться на код c ++ и выполнять его в JavaScript?». Давайте возьмем их один за другим.

Как работают основные модули?

Основные модули упакованы с двоичным кодом NodeJS. И хотя они упакованы вместе с двоичным файлом, они не преобразуются в код c ++ перед упаковкой. Внутренние модули загружаются в память во время начальной загрузки процесса узла. Когда программа выполняется, скажем, require('fs'), функция require просто возвращает уже загруженный модуль из кэша. Фактическая загрузка внутреннего модуля, очевидно, происходит в коде c ++ .

Как NodeJS позволяет ссылаться на код c ++ в JS?

Эта способность частично исходит от движка V8, который предоставляет возможность создавать и управлять конструкциями JS в C ++, и частично от NodeJS / LibUV, которые создают оболочку над V8 для обеспечения среды выполнения. Документация о таких узловых модулях может быть доступна здесь . Как указано в документации, эти модули c ++ могут использоваться в файле JS по требованию, как и любой другой обычный модуль JS.

Ваш пример использования функции c ++ в JS (loadPKCS12), однако, является более частным случаем внутренней функциональности c ++ в NodeJS. loadPKCS12 вызывается для объекта SecureContext, импортированного из модуля crypto c ++. Если вы перейдете по ссылке на импорт SecureContext в _tls_common.js выше, вы увидите, что крипто не загружается с использованием require(), вместо этого используется специальный (глобальный) метод internalBinding для получения ссылки. В последней строке в файле node_crypto.cc зарегистрирован инициализатор для внутреннего модуля crypto. Следуя цепочке инициализации, node::crypto::Initialize вызывает node::crypto::SecureContext::Initialize, которая создает шаблон функции, назначает соответствующие методы-прототипы и экспортирует его в target. В конечном итоге эти экспортированные функции из мира C ++ импортируются и используются в JS-World с использованием internalBinding.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...